UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

237 lines (234 loc) 41.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = PlotContainerFactory; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _reselect = require("reselect"); var _styledComponents = _interopRequireDefault(require("styled-components")); var _reactMapGl = require("react-map-gl"); var _debounce = _interopRequireDefault(require("lodash/debounce")); var _utils = require("@kepler.gl/utils"); var _reducers = require("@kepler.gl/reducers"); var _mapContainer = _interopRequireDefault(require("./map-container")); var _mapsLayout = _interopRequireDefault(require("./maps-layout")); var _mapViewStateContext = require("./map-view-state-context"); var _constants = require("@kepler.gl/constants"); var _templateObject, _templateObject2; // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project // libraries function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } var CLASS_FILTER = ['maplibregl-control-container', 'mapboxgl-control-container', 'attrition-link', 'attrition-logo', 'map-control__panel-split-viewport-tools']; var DOM_FILTER_FUNC = function DOM_FILTER_FUNC(node) { return !CLASS_FILTER.includes(node.className); }; var OUT_OF_SCREEN_POSITION = -9999; PlotContainerFactory.deps = [_mapContainer["default"], _mapsLayout["default"]]; // Remove mapbox logo in exported map, because it contains non-ascii characters // Remove split viewport UI controls from exported images when the legend is shown var StyledPlotContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n .maplibregl-ctrl-bottom-left,\n .maplibregl-ctrl-bottom-right,\n .maplibre-attribution-container,\n .mapboxgl-ctrl-bottom-left,\n .mapboxgl-ctrl-bottom-right,\n .mapbox-attribution-container,\n .map-control__panel-split-viewport-tools {\n display: none;\n }\n\n position: absolute;\n top: ", "px;\n left: ", "px;\n"])), OUT_OF_SCREEN_POSITION, OUT_OF_SCREEN_POSITION); var StyledMapContainer = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n width: ", "px;\n height: ", "px;\n display: flex;\n"])), function (props) { return props.width; }, function (props) { return props.height; }); function PlotContainerFactory(MapContainer, MapsLayout) { var PlotContainer = /*#__PURE__*/function (_Component) { function PlotContainer(_props) { var _this; (0, _classCallCheck2["default"])(this, PlotContainer); _this = _callSuper(this, PlotContainer, [_props]); (0, _defineProperty2["default"])(_this, "plottingAreaRef", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2["default"])(_this, "mapStyleSelector", function (props) { return props.mapFields.mapStyle; }); (0, _defineProperty2["default"])(_this, "mapScaleSelector", function (props) { var imageSize = props.exportImageSetting.imageSize; var mapState = props.mapFields.mapState; if (imageSize.scale) { return imageSize.scale; } var scale = (0, _utils.getScaleFromImageSize)(imageSize.imageW, imageSize.imageH, mapState.width * (mapState.isSplit ? 2 : 1), mapState.height); return scale > 0 ? scale : 1; }); (0, _defineProperty2["default"])(_this, "scaledMapStyleSelector", (0, _reselect.createSelector)(_this.mapStyleSelector, _this.mapScaleSelector, function (mapStyle, scale) { return _objectSpread(_objectSpread({}, mapStyle), {}, { bottomMapStyle: (0, _utils.scaleMapStyleByResolution)(mapStyle.bottomMapStyle, scale), topMapStyle: (0, _utils.scaleMapStyleByResolution)(mapStyle.topMapStyle, scale) }); })); (0, _defineProperty2["default"])(_this, "_onMapRender", function (map) { if (map.isStyleLoaded()) { _this._retrieveNewScreenshot(); } }); (0, _defineProperty2["default"])(_this, "_retrieveNewScreenshot", function () { if (_this.plottingAreaRef.current) { var _this$props$exportIma = _this.props.exportImageSetting, imageSize = _this$props$exportIma.imageSize, escapeXhtmlForWebpack = _this$props$exportIma.escapeXhtmlForWebpack; (0, _utils.convertToPng)(_this.plottingAreaRef.current, { filter: DOM_FILTER_FUNC, width: imageSize.imageW, height: imageSize.imageH, escapeXhtmlForWebpack: escapeXhtmlForWebpack }).then(_this.props.setExportImageDataUri)["catch"](function (err) { _this.props.setExportImageError(err); if (_this.props.enableErrorNotification) { _this.props.addNotification((0, _utils.exportImageError)({ err: err })); } }); } }); _this._onMapRender = (0, _debounce["default"])(_this._onMapRender, 500); _this._retrieveNewScreenshot = (0, _debounce["default"])(_this._retrieveNewScreenshot, 500); _this.state = { plotEffects: _this.getEffectsForPlot() }; return _this; } (0, _inherits2["default"])(PlotContainer, _Component); return (0, _createClass2["default"])(PlotContainer, [{ key: "getEffectsForPlot", value: function getEffectsForPlot() { return this.props.mapFields.visState.effects.map(function (effect) { return effect.clone(); }); } }, { key: "componentDidMount", value: function componentDidMount() { this.props.setExportImageSetting({ processing: true }); } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { var _this2 = this; // re-fetch the new screenshot only when ratio legend or resolution changes var checks = ['ratio', 'resolution', 'legend']; var shouldRetrieveScreenshot = checks.some(function (item) { return _this2.props.exportImageSetting[item] !== prevProps.exportImageSetting[item]; }); if (shouldRetrieveScreenshot) { this.props.setExportImageSetting({ processing: true }); this._retrieveNewScreenshot(); } } }, { key: "render", value: function render() { var _this$props = this.props, exportImageSetting = _this$props.exportImageSetting, mapFields = _this$props.mapFields, _this$props$splitMaps = _this$props.splitMaps, splitMaps = _this$props$splitMaps === void 0 ? [] : _this$props$splitMaps; var mapState = mapFields.mapState, visState = mapFields.visState; var layers = visState.layers, layerData = visState.layerData; var imageSize = exportImageSetting.imageSize, legend = exportImageSetting.legend; var isSplit = splitMaps && splitMaps.length > 1; var size = { width: (imageSize === null || imageSize === void 0 ? void 0 : imageSize.imageW) || 1, height: (imageSize === null || imageSize === void 0 ? void 0 : imageSize.imageH) || 1 }; var width = size.width / (isSplit ? 2 : 1); var height = size.height; var scale = this.mapScaleSelector(this.props); var newMapState = _objectSpread(_objectSpread({}, mapState), {}, { width: width, height: height, zoom: mapState.zoom + (Math.log2(scale) || 0) }); // center and all layer bounds if (exportImageSetting.center) { var renderedLayers = layers.filter(function (layer, idx) { return layer.id !== _constants.GEOCODER_LAYER_ID && layer.shouldRenderLayer(layerData[idx]); }); var bounds = (0, _reducers.findMapBounds)(renderedLayers); var centerAndZoom = (0, _utils.getCenterAndZoomFromBounds)(bounds, { width: width, height: height }); if (centerAndZoom) { var zoom = Number.isFinite(centerAndZoom.zoom) ? centerAndZoom.zoom : mapState.zoom; newMapState.longitude = centerAndZoom.center[0]; newMapState.latitude = centerAndZoom.center[1]; newMapState.zoom = zoom + Number(Math.log2(scale) || 0); } } var mapProps = _objectSpread(_objectSpread({}, mapFields), {}, { mapStyle: this.scaledMapStyleSelector(this.props), // override viewport based on export settings mapState: newMapState, mapControls: { // override map legend visibility mapLegend: { show: legend, active: true } }, MapComponent: _reactMapGl.Map, onMapRender: this._onMapRender, isExport: true, deckGlProps: _objectSpread(_objectSpread({}, mapFields.deckGlProps), {}, { glOptions: { preserveDrawingBuffer: true, useDevicePixels: false } }), visState: _objectSpread(_objectSpread({}, mapFields.visState), {}, { // Make sure to use effects not associated with a different WebGL context effects: this.state.plotEffects }) }); var mapContainers = !isSplit ? /*#__PURE__*/_react["default"].createElement(MapContainer, (0, _extends2["default"])({ index: 0, primary: true }, mapProps)) : /*#__PURE__*/_react["default"].createElement(MapsLayout, { className: "plot-container-maps", mapState: newMapState }, splitMaps.map(function (settings, index) { return /*#__PURE__*/_react["default"].createElement(MapContainer, (0, _extends2["default"])({ key: index, index: index, primary: index === 1 }, mapProps)); })); return /*#__PURE__*/_react["default"].createElement(StyledPlotContainer, { className: "export-map-instance" }, /*#__PURE__*/_react["default"].createElement(StyledMapContainer, { ref: this.plottingAreaRef, width: size.width, height: size.height }, /*#__PURE__*/_react["default"].createElement(_mapViewStateContext.MapViewStateContextProvider, { mapState: newMapState }, mapContainers))); } }]); }(_react.Component); return PlotContainer; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVzZWxlY3QiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcmVhY3RNYXBHbCIsIl9kZWJvdW5jZSIsIl91dGlscyIsIl9yZWR1Y2VycyIsIl9tYXBDb250YWluZXIiLCJfbWFwc0xheW91dCIsIl9tYXBWaWV3U3RhdGVDb250ZXh0IiwiX2NvbnN0YW50cyIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfY2FsbFN1cGVyIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsIkNMQVNTX0ZJTFRFUiIsIkRPTV9GSUxURVJfRlVOQyIsIm5vZGUiLCJpbmNsdWRlcyIsImNsYXNzTmFtZSIsIk9VVF9PRl9TQ1JFRU5fUE9TSVRJT04iLCJQbG90Q29udGFpbmVyRmFjdG9yeSIsImRlcHMiLCJNYXBDb250YWluZXJGYWN0b3J5IiwiTWFwc0xheW91dEZhY3RvcnkiLCJTdHlsZWRQbG90Q29udGFpbmVyIiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJTdHlsZWRNYXBDb250YWluZXIiLCJwcm9wcyIsIndpZHRoIiwiaGVpZ2h0IiwiTWFwQ29udGFpbmVyIiwiTWFwc0xheW91dCIsIlBsb3RDb250YWluZXIiLCJfQ29tcG9uZW50IiwiX3RoaXMiLCJfY2xhc3NDYWxsQ2hlY2syIiwiY3JlYXRlUmVmIiwibWFwRmllbGRzIiwibWFwU3R5bGUiLCJpbWFnZVNpemUiLCJleHBvcnRJbWFnZVNldHRpbmciLCJtYXBTdGF0ZSIsInNjYWxlIiwiZ2V0U2NhbGVGcm9tSW1hZ2VTaXplIiwiaW1hZ2VXIiwiaW1hZ2VIIiwiaXNTcGxpdCIsImNyZWF0ZVNlbGVjdG9yIiwibWFwU3R5bGVTZWxlY3RvciIsIm1hcFNjYWxlU2VsZWN0b3IiLCJib3R0b21NYXBTdHlsZSIsInNjYWxlTWFwU3R5bGVCeVJlc29sdXRpb24iLCJ0b3BNYXBTdHlsZSIsIm1hcCIsImlzU3R5bGVMb2FkZWQiLCJfcmV0cmlldmVOZXdTY3JlZW5zaG90IiwicGxvdHRpbmdBcmVhUmVmIiwiY3VycmVudCIsIl90aGlzJHByb3BzJGV4cG9ydEltYSIsImVzY2FwZVhodG1sRm9yV2VicGFjayIsImNvbnZlcnRUb1BuZyIsInRoZW4iLCJzZXRFeHBvcnRJbWFnZURhdGFVcmkiLCJlcnIiLCJzZXRFeHBvcnRJbWFnZUVycm9yIiwiZW5hYmxlRXJyb3JOb3RpZmljYXRpb24iLCJhZGROb3RpZmljYXRpb24iLCJleHBvcnRJbWFnZUVycm9yIiwiX29uTWFwUmVuZGVyIiwiZGVib3VuY2UiLCJzdGF0ZSIsInBsb3RFZmZlY3RzIiwiZ2V0RWZmZWN0c0ZvclBsb3QiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsInZhbHVlIiwidmlzU3RhdGUiLCJlZmZlY3RzIiwiZWZmZWN0IiwiY2xvbmUiLCJjb21wb25lbnREaWRNb3VudCIsInNldEV4cG9ydEltYWdlU2V0dGluZyIsInByb2Nlc3NpbmciLCJjb21wb25lbnREaWRVcGRhdGUiLCJwcmV2UHJvcHMiLCJfdGhpczIiLCJjaGVja3MiLCJzaG91bGRSZXRyaWV2ZVNjcmVlbnNob3QiLCJzb21lIiwiaXRlbSIsInJlbmRlciIsIl90aGlzJHByb3BzIiwiX3RoaXMkcHJvcHMkc3BsaXRNYXBzIiwic3BsaXRNYXBzIiwibGF5ZXJzIiwibGF5ZXJEYXRhIiwibGVnZW5kIiwic2l6ZSIsIm5ld01hcFN0YXRlIiwiem9vbSIsIk1hdGgiLCJsb2cyIiwiY2VudGVyIiwicmVuZGVyZWRMYXllcnMiLCJsYXllciIsImlkeCIsImlkIiwiR0VPQ09ERVJfTEFZRVJfSUQiLCJzaG91bGRSZW5kZXJMYXllciIsImJvdW5kcyIsImZpbmRNYXBCb3VuZHMiLCJjZW50ZXJBbmRab29tIiwiZ2V0Q2VudGVyQW5kWm9vbUZyb21Cb3VuZHMiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsImxvbmdpdHVkZSIsImxhdGl0dWRlIiwibWFwUHJvcHMiLCJzY2FsZWRNYXBTdHlsZVNlbGVjdG9yIiwibWFwQ29udHJvbHMiLCJtYXBMZWdlbmQiLCJzaG93IiwiYWN0aXZlIiwiTWFwQ29tcG9uZW50IiwiTWFwIiwib25NYXBSZW5kZXIiLCJpc0V4cG9ydCIsImRlY2tHbFByb3BzIiwiZ2xPcHRpb25zIiwicHJlc2VydmVEcmF3aW5nQnVmZmVyIiwidXNlRGV2aWNlUGl4ZWxzIiwibWFwQ29udGFpbmVycyIsImNyZWF0ZUVsZW1lbnQiLCJfZXh0ZW5kczIiLCJpbmRleCIsInByaW1hcnkiLCJzZXR0aW5ncyIsInJlZiIsIk1hcFZpZXdTdGF0ZUNvbnRleHRQcm92aWRlciIsIkNvbXBvbmVudCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9wbG90LWNvbnRhaW5lci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuLy8gbGlicmFyaWVzXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnQsIGNyZWF0ZVJlZn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtjcmVhdGVTZWxlY3Rvcn0gZnJvbSAncmVzZWxlY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge01hcH0gZnJvbSAncmVhY3QtbWFwLWdsJztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICdsb2Rhc2gvZGVib3VuY2UnO1xuaW1wb3J0IHtcbiAgZXhwb3J0SW1hZ2VFcnJvcixcbiAgc2NhbGVNYXBTdHlsZUJ5UmVzb2x1dGlvbixcbiAgZ2V0Q2VudGVyQW5kWm9vbUZyb21Cb3VuZHMsXG4gIGNvbnZlcnRUb1BuZyxcbiAgZ2V0U2NhbGVGcm9tSW1hZ2VTaXplXG59IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtmaW5kTWFwQm91bmRzfSBmcm9tICdAa2VwbGVyLmdsL3JlZHVjZXJzJztcbmltcG9ydCBNYXBDb250YWluZXJGYWN0b3J5IGZyb20gJy4vbWFwLWNvbnRhaW5lcic7XG5pbXBvcnQgTWFwc0xheW91dEZhY3RvcnkgZnJvbSAnLi9tYXBzLWxheW91dCc7XG5pbXBvcnQge01hcFZpZXdTdGF0ZUNvbnRleHRQcm92aWRlcn0gZnJvbSAnLi9tYXAtdmlldy1zdGF0ZS1jb250ZXh0JztcblxuaW1wb3J0IHtHRU9DT0RFUl9MQVlFUl9JRCwgRXhwb3J0SW1hZ2V9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7RWZmZWN0LCBTcGxpdE1hcH0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge1xuICBBY3Rpb25IYW5kbGVyLFxuICBhZGROb3RpZmljYXRpb24sXG4gIHNldEV4cG9ydEltYWdlRGF0YVVyaSxcbiAgc2V0RXhwb3J0SW1hZ2VFcnJvcixcbiAgc2V0RXhwb3J0SW1hZ2VTZXR0aW5nXG59IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge21hcEZpZWxkc1NlbGVjdG9yfSBmcm9tICcuL2tlcGxlci1nbCc7XG5cbmNvbnN0IENMQVNTX0ZJTFRFUiA9IFtcbiAgJ21hcGxpYnJlZ2wtY29udHJvbC1jb250YWluZXInLFxuICAnbWFwYm94Z2wtY29udHJvbC1jb250YWluZXInLFxuICAnYXR0cml0aW9uLWxpbmsnLFxuICAnYXR0cml0aW9uLWxvZ28nLFxuICAnbWFwLWNvbnRyb2xfX3BhbmVsLXNwbGl0LXZpZXdwb3J0LXRvb2xzJ1xuXTtcbmNvbnN0IERPTV9GSUxURVJfRlVOQyA9IG5vZGUgPT4gIUNMQVNTX0ZJTFRFUi5pbmNsdWRlcyhub2RlLmNsYXNzTmFtZSk7XG5jb25zdCBPVVRfT0ZfU0NSRUVOX1BPU0lUSU9OID0gLTk5OTk7XG5cblBsb3RDb250YWluZXJGYWN0b3J5LmRlcHMgPSBbTWFwQ29udGFpbmVyRmFjdG9yeSwgTWFwc0xheW91dEZhY3RvcnldO1xuXG4vLyBSZW1vdmUgbWFwYm94IGxvZ28gaW4gZXhwb3J0ZWQgbWFwLCBiZWNhdXNlIGl0IGNvbnRhaW5zIG5vbi1hc2NpaSBjaGFyYWN0ZXJzXG4vLyBSZW1vdmUgc3BsaXQgdmlld3BvcnQgVUkgY29udHJvbHMgZnJvbSBleHBvcnRlZCBpbWFnZXMgd2hlbiB0aGUgbGVnZW5kIGlzIHNob3duXG5jb25zdCBTdHlsZWRQbG90Q29udGFpbmVyID0gc3R5bGVkLmRpdmBcbiAgLm1hcGxpYnJlZ2wtY3RybC1ib3R0b20tbGVmdCxcbiAgLm1hcGxpYnJlZ2wtY3RybC1ib3R0b20tcmlnaHQsXG4gIC5tYXBsaWJyZS1hdHRyaWJ1dGlvbi1jb250YWluZXIsXG4gIC5tYXBib3hnbC1jdHJsLWJvdHRvbS1sZWZ0LFxuICAubWFwYm94Z2wtY3RybC1ib3R0b20tcmlnaHQsXG4gIC5tYXBib3gtYXR0cmlidXRpb24tY29udGFpbmVyLFxuICAubWFwLWNvbnRyb2xfX3BhbmVsLXNwbGl0LXZpZXdwb3J0LXRvb2xzIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG5cbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6ICR7T1VUX09GX1NDUkVFTl9QT1NJVElPTn1weDtcbiAgbGVmdDogJHtPVVRfT0ZfU0NSRUVOX1BPU0lUSU9OfXB4O1xuYDtcblxuaW50ZXJmYWNlIFN0eWxlZE1hcENvbnRhaW5lclByb3BzIHtcbiAgd2lkdGg/OiBudW1iZXI7XG4gIGhlaWdodD86IG51bWJlcjtcbn1cblxuY29uc3QgU3R5bGVkTWFwQ29udGFpbmVyID0gc3R5bGVkLmRpdjxTdHlsZWRNYXBDb250YWluZXJQcm9wcz5gXG4gIHdpZHRoOiAke3Byb3BzID0+IHByb3BzLndpZHRofXB4O1xuICBoZWlnaHQ6ICR7cHJvcHMgPT4gcHJvcHMuaGVpZ2h0fXB4O1xuICBkaXNwbGF5OiBmbGV4O1xuYDtcblxuaW50ZXJmYWNlIFBsb3RDb250YWluZXJQcm9wcyB7XG4gIHdpZHRoPzogbnVtYmVyO1xuICBoZWlnaHQ/OiBudW1iZXI7XG4gIGV4cG9ydEltYWdlU2V0dGluZzogRXhwb3J0SW1hZ2U7XG4gIGFkZE5vdGlmaWNhdGlvbjogQWN0aW9uSGFuZGxlcjx0eXBlb2YgYWRkTm90aWZpY2F0aW9uPjtcbiAgbWFwRmllbGRzOiBSZXR1cm5UeXBlPHR5cGVvZiBtYXBGaWVsZHNTZWxlY3Rvcj47XG4gIHNldEV4cG9ydEltYWdlU2V0dGluZzogdHlwZW9mIHNldEV4cG9ydEltYWdlU2V0dGluZztcbiAgc2V0RXhwb3J0SW1hZ2VEYXRhVXJpOiB0eXBlb2Ygc2V0RXhwb3J0SW1hZ2VEYXRhVXJpO1xuICBzZXRFeHBvcnRJbWFnZUVycm9yOiB0eXBlb2Ygc2V0RXhwb3J0SW1hZ2VFcnJvcjtcbiAgc3BsaXRNYXBzPzogU3BsaXRNYXBbXTtcbiAgZW5hYmxlRXJyb3JOb3RpZmljYXRpb24/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUGxvdENvbnRhaW5lclN0YXRlIHtcbiAgcGxvdEVmZmVjdHM6IEVmZmVjdFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBQbG90Q29udGFpbmVyRmFjdG9yeShcbiAgTWFwQ29udGFpbmVyOiBSZXR1cm5UeXBlPHR5cGVvZiBNYXBDb250YWluZXJGYWN0b3J5PixcbiAgTWFwc0xheW91dDogUmV0dXJuVHlwZTx0eXBlb2YgTWFwc0xheW91dEZhY3Rvcnk+XG4pOiBSZWFjdC5Db21wb25lbnRUeXBlPFBsb3RDb250YWluZXJQcm9wcz4ge1xuICBjbGFzcyBQbG90Q29udGFpbmVyIGV4dGVuZHMgQ29tcG9uZW50PFBsb3RDb250YWluZXJQcm9wcywgUGxvdENvbnRhaW5lclN0YXRlPiB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgIHRoaXMuX29uTWFwUmVuZGVyID0gZGVib3VuY2UodGhpcy5fb25NYXBSZW5kZXIsIDUwMCk7XG4gICAgICB0aGlzLl9yZXRyaWV2ZU5ld1NjcmVlbnNob3QgPSBkZWJvdW5jZSh0aGlzLl9yZXRyaWV2ZU5ld1NjcmVlbnNob3QsIDUwMCk7XG5cbiAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgIHBsb3RFZmZlY3RzOiB0aGlzLmdldEVmZmVjdHNGb3JQbG90KClcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRFZmZlY3RzRm9yUGxvdCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLm1hcEZpZWxkcy52aXNTdGF0ZS5lZmZlY3RzLm1hcChlZmZlY3QgPT4gZWZmZWN0LmNsb25lKCkpO1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5wcm9wcy5zZXRFeHBvcnRJbWFnZVNldHRpbmcoe3Byb2Nlc3Npbmc6IHRydWV9KTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgICAvLyByZS1mZXRjaCB0aGUgbmV3IHNjcmVlbnNob3Qgb25seSB3aGVuIHJhdGlvIGxlZ2VuZCBvciByZXNvbHV0aW9uIGNoYW5nZXNcbiAgICAgIGNvbnN0IGNoZWNrcyA9IFsncmF0aW8nLCAncmVzb2x1dGlvbicsICdsZWdlbmQnXTtcbiAgICAgIGNvbnN0IHNob3VsZFJldHJpZXZlU2NyZWVuc2hvdCA9IGNoZWNrcy5zb21lKFxuICAgICAgICBpdGVtID0+IHRoaXMucHJvcHMuZXhwb3J0SW1hZ2VTZXR0aW5nW2l0ZW1dICE9PSBwcmV2UHJvcHMuZXhwb3J0SW1hZ2VTZXR0aW5nW2l0ZW1dXG4gICAgICApO1xuICAgICAgaWYgKHNob3VsZFJldHJpZXZlU2NyZWVuc2hvdCkge1xuICAgICAgICB0aGlzLnByb3BzLnNldEV4cG9ydEltYWdlU2V0dGluZyh7cHJvY2Vzc2luZzogdHJ1ZX0pO1xuICAgICAgICB0aGlzLl9yZXRyaWV2ZU5ld1NjcmVlbnNob3QoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwbG90dGluZ0FyZWFSZWYgPSBjcmVhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KCk7XG5cbiAgICBtYXBTdHlsZVNlbGVjdG9yID0gcHJvcHMgPT4gcHJvcHMubWFwRmllbGRzLm1hcFN0eWxlO1xuICAgIG1hcFNjYWxlU2VsZWN0b3IgPSBwcm9wcyA9PiB7XG4gICAgICBjb25zdCB7aW1hZ2VTaXplfSA9IHByb3BzLmV4cG9ydEltYWdlU2V0dGluZztcbiAgICAgIGNvbnN0IHttYXBTdGF0ZX0gPSBwcm9wcy5tYXBGaWVsZHM7XG4gICAgICBpZiAoaW1hZ2VTaXplLnNjYWxlKSB7XG4gICAgICAgIHJldHVybiBpbWFnZVNpemUuc2NhbGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNjYWxlID0gZ2V0U2NhbGVGcm9tSW1hZ2VTaXplKFxuICAgICAgICBpbWFnZVNpemUuaW1hZ2VXLFxuICAgICAgICBpbWFnZVNpemUuaW1hZ2VILFxuICAgICAgICBtYXBTdGF0ZS53aWR0aCAqIChtYXBTdGF0ZS5pc1NwbGl0ID8gMiA6IDEpLFxuICAgICAgICBtYXBTdGF0ZS5oZWlnaHRcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBzY2FsZSA+IDAgPyBzY2FsZSA6IDE7XG4gICAgfTtcblxuICAgIHNjYWxlZE1hcFN0eWxlU2VsZWN0b3IgPSBjcmVhdGVTZWxlY3RvcihcbiAgICAgIHRoaXMubWFwU3R5bGVTZWxlY3RvcixcbiAgICAgIHRoaXMubWFwU2NhbGVTZWxlY3RvcixcbiAgICAgIChtYXBTdHlsZSwgc2NhbGUpID0+ICh7XG4gICAgICAgIC4uLm1hcFN0eWxlLFxuICAgICAgICBib3R0b21NYXBTdHlsZTogc2NhbGVNYXBTdHlsZUJ5UmVzb2x1dGlvbihtYXBTdHlsZS5ib3R0b21NYXBTdHlsZSwgc2NhbGUpLFxuICAgICAgICB0b3BNYXBTdHlsZTogc2NhbGVNYXBTdHlsZUJ5UmVzb2x1dGlvbihtYXBTdHlsZS50b3BNYXBTdHlsZSwgc2NhbGUpXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBfb25NYXBSZW5kZXIgPSBtYXAgPT4ge1xuICAgICAgaWYgKG1hcC5pc1N0eWxlTG9hZGVkKCkpIHtcbiAgICAgICAgdGhpcy5fcmV0cmlldmVOZXdTY3JlZW5zaG90KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9yZXRyaWV2ZU5ld1NjcmVlbnNob3QgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wbG90dGluZ0FyZWFSZWYuY3VycmVudCkge1xuICAgICAgICBjb25zdCB7aW1hZ2VTaXplLCBlc2NhcGVYaHRtbEZvcldlYnBhY2t9ID0gdGhpcy5wcm9wcy5leHBvcnRJbWFnZVNldHRpbmc7XG4gICAgICAgIGNvbnZlcnRUb1BuZyh0aGlzLnBsb3R0aW5nQXJlYVJlZi5jdXJyZW50LCB7XG4gICAgICAgICAgZmlsdGVyOiBET01fRklMVEVSX0ZVTkMsXG4gICAgICAgICAgd2lkdGg6IGltYWdlU2l6ZS5pbWFnZVcsXG4gICAgICAgICAgaGVpZ2h0OiBpbWFnZVNpemUuaW1hZ2VILFxuICAgICAgICAgIGVzY2FwZVhodG1sRm9yV2VicGFja1xuICAgICAgICB9KVxuICAgICAgICAgIC50aGVuKHRoaXMucHJvcHMuc2V0RXhwb3J0SW1hZ2VEYXRhVXJpKVxuICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5zZXRFeHBvcnRJbWFnZUVycm9yKGVycik7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5lbmFibGVFcnJvck5vdGlmaWNhdGlvbikge1xuICAgICAgICAgICAgICB0aGlzLnByb3BzLmFkZE5vdGlmaWNhdGlvbihleHBvcnRJbWFnZUVycm9yKHtlcnJ9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHtleHBvcnRJbWFnZVNldHRpbmcsIG1hcEZpZWxkcywgc3BsaXRNYXBzID0gW119ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IHttYXBTdGF0ZSwgdmlzU3RhdGV9ID0gbWFwRmllbGRzO1xuICAgICAgY29uc3Qge2xheWVycywgbGF5ZXJEYXRhfSA9IHZpc1N0YXRlO1xuICAgICAgY29uc3Qge2ltYWdlU2l6ZSwgbGVnZW5kfSA9IGV4cG9ydEltYWdlU2V0dGluZztcblxuICAgICAgY29uc3QgaXNTcGxpdCA9IHNwbGl0TWFwcyAmJiBzcGxpdE1hcHMubGVuZ3RoID4gMTtcblxuICAgICAgY29uc3Qgc2l6ZSA9IHtcbiAgICAgICAgd2lkdGg6IGltYWdlU2l6ZT8uaW1hZ2VXIHx8IDEsXG4gICAgICAgIGhlaWdodDogaW1hZ2VTaXplPy5pbWFnZUggfHwgMVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHdpZHRoID0gc2l6ZS53aWR0aCAvIChpc1NwbGl0ID8gMiA6IDEpO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7XG4gICAgICBjb25zdCBzY2FsZSA9IHRoaXMubWFwU2NhbGVTZWxlY3Rvcih0aGlzLnByb3BzKTtcbiAgICAgIGNvbnN0IG5ld01hcFN0YXRlID0ge1xuICAgICAgICAuLi5tYXBTdGF0ZSxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgem9vbTogbWFwU3RhdGUuem9vbSArIChNYXRoLmxvZzIoc2NhbGUpIHx8IDApXG4gICAgICB9O1xuXG4gICAgICAvLyBjZW50ZXIgYW5kIGFsbCBsYXllciBib3VuZHNcbiAgICAgIGlmIChleHBvcnRJbWFnZVNldHRpbmcuY2VudGVyKSB7XG4gICAgICAgIGNvbnN0IHJlbmRlcmVkTGF5ZXJzID0gbGF5ZXJzLmZpbHRlcihcbiAgICAgICAgICAobGF5ZXIsIGlkeCkgPT4gbGF5ZXIuaWQgIT09IEdFT0NPREVSX0xBWUVSX0lEICYmIGxheWVyLnNob3VsZFJlbmRlckxheWVyKGxheWVyRGF0YVtpZHhdKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBib3VuZHMgPSBmaW5kTWFwQm91bmRzKHJlbmRlcmVkTGF5ZXJzKTtcbiAgICAgICAgY29uc3QgY2VudGVyQW5kWm9vbSA9IGdldENlbnRlckFuZFpvb21Gcm9tQm91bmRzKGJvdW5kcywge3dpZHRoLCBoZWlnaHR9KTtcbiAgICAgICAgaWYgKGNlbnRlckFuZFpvb20pIHtcbiAgICAgICAgICBjb25zdCB6b29tID0gTnVtYmVyLmlzRmluaXRlKGNlbnRlckFuZFpvb20uem9vbSkgPyBjZW50ZXJBbmRab29tLnpvb20gOiBtYXBTdGF0ZS56b29tO1xuXG4gICAgICAgICAgbmV3TWFwU3RhdGUubG9uZ2l0dWRlID0gY2VudGVyQW5kWm9vbS5jZW50ZXJbMF07XG4gICAgICAgICAgbmV3TWFwU3RhdGUubGF0aXR1ZGUgPSBjZW50ZXJBbmRab29tLmNlbnRlclsxXTtcbiAgICAgICAgICBuZXdNYXBTdGF0ZS56b29tID0gem9vbSArIE51bWJlcihNYXRoLmxvZzIoc2NhbGUpIHx8IDApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hcFByb3BzID0ge1xuICAgICAgICAuLi5tYXBGaWVsZHMsXG4gICAgICAgIG1hcFN0eWxlOiB0aGlzLnNjYWxlZE1hcFN0eWxlU2VsZWN0b3IodGhpcy5wcm9wcyksXG5cbiAgICAgICAgLy8gb3ZlcnJpZGUgdmlld3BvcnQgYmFzZWQgb24gZXhwb3J0IHNldHRpbmdzXG4gICAgICAgIG1hcFN0YXRlOiBuZXdNYXBTdGF0ZSxcbiAgICAgICAgbWFwQ29udHJvbHM6IHtcbiAgICAgICAgICAvLyBvdmVycmlkZSBtYXAgbGVnZW5kIHZpc2liaWxpdHlcbiAgICAgICAgICBtYXBMZWdlbmQ6IHtcbiAgICAgICAgICAgIHNob3c6IGxlZ2VuZCxcbiAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgTWFwQ29tcG9uZW50OiBNYXAsXG4gICAgICAgIG9uTWFwUmVuZGVyOiB0aGlzLl9vbk1hcFJlbmRlcixcbiAgICAgICAgaXNFeHBvcnQ6IHRydWUsXG4gICAgICAgIGRlY2tHbFByb3BzOiB7XG4gICAgICAgICAgLi4ubWFwRmllbGRzLmRlY2tHbFByb3BzLFxuICAgICAgICAgIGdsT3B0aW9uczoge1xuICAgICAgICAgICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiB0cnVlLFxuICAgICAgICAgICAgdXNlRGV2aWNlUGl4ZWxzOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdmlzU3RhdGU6IHtcbiAgICAgICAgICAuLi5tYXBGaWVsZHMudmlzU3RhdGUsXG4gICAgICAgICAgLy8gTWFrZSBzdXJlIHRvIHVzZSBlZmZlY3RzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBkaWZmZXJlbnQgV2ViR0wgY29udGV4dFxuICAgICAgICAgIGVmZmVjdHM6IHRoaXMuc3RhdGUucGxvdEVmZmVjdHNcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgbWFwQ29udGFpbmVycyA9ICFpc1NwbGl0ID8gKFxuICAgICAgICA8TWFwQ29udGFpbmVyIGluZGV4PXswfSBwcmltYXJ5PXt0cnVlfSB7Li4ubWFwUHJvcHN9IC8+XG4gICAgICApIDogKFxuICAgICAgICA8TWFwc0xheW91dCBjbGFzc05hbWU9XCJwbG90LWNvbnRhaW5lci1tYXBzXCIgbWFwU3RhdGU9e25ld01hcFN0YXRlfT5cbiAgICAgICAgICB7c3BsaXRNYXBzLm1hcCgoc2V0dGluZ3MsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICA8TWFwQ29udGFpbmVyIGtleT17aW5kZXh9IGluZGV4PXtpbmRleH0gcHJpbWFyeT17aW5kZXggPT09IDF9IHsuLi5tYXBQcm9wc30gLz5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9NYXBzTGF5b3V0PlxuICAgICAgKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxTdHlsZWRQbG90Q29udGFpbmVyIGNsYXNzTmFtZT1cImV4cG9ydC1tYXAtaW5zdGFuY2VcIj5cbiAgICAgICAgICA8U3R5bGVkTWFwQ29udGFpbmVyIHJlZj17dGhpcy5wbG90dGluZ0FyZWFSZWZ9IHdpZHRoPXtzaXplLndpZHRofSBoZWlnaHQ9e3NpemUuaGVpZ2h0fT5cbiAgICAgICAgICAgIDxNYXBWaWV3U3RhdGVDb250ZXh0UHJvdmlkZXIgbWFwU3RhdGU9e25ld01hcFN0YXRlfT5cbiAgICAgICAgICAgICAge21hcENvbnRhaW5lcnN9XG4gICAgICAgICAgICA8L01hcFZpZXdTdGF0ZUNvbnRleHRQcm92aWRlcj5cbiAgICAgICAgICA8L1N0eWxlZE1hcENvbnRhaW5lcj5cbiAgICAgICAgPC9TdHlsZWRQbG90Q29udGFpbmVyPlxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFBsb3RDb250YWluZXI7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxTQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxpQkFBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksV0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssU0FBQSxHQUFBRixzQkFBQSxDQUFBSCxPQUFB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