UNPKG

kepler.gl

Version:

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

223 lines (220 loc) 39.7 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 _lodash = _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, _lodash["default"])(_this._onMapRender, 500); _this._retrieveNewScreenshot = (0, _lodash["default"])(_this._retrieveNewScreenshot, 500); return _this; } (0, _inherits2["default"])(PlotContainer, _Component); return (0, _createClass2["default"])(PlotContainer, [{ 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 } }) }); 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVzZWxlY3QiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcmVhY3RNYXBHbCIsIl9sb2Rhc2giLCJfdXRpbHMiLCJfcmVkdWNlcnMiLCJfbWFwQ29udGFpbmVyIiwiX21hcHNMYXlvdXQiLCJfbWFwVmlld1N0YXRlQ29udGV4dCIsIl9jb25zdGFudHMiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX2NhbGxTdXBlciIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJDTEFTU19GSUxURVIiLCJET01fRklMVEVSX0ZVTkMiLCJub2RlIiwiaW5jbHVkZXMiLCJjbGFzc05hbWUiLCJPVVRfT0ZfU0NSRUVOX1BPU0lUSU9OIiwiUGxvdENvbnRhaW5lckZhY3RvcnkiLCJkZXBzIiwiTWFwQ29udGFpbmVyRmFjdG9yeSIsIk1hcHNMYXlvdXRGYWN0b3J5IiwiU3R5bGVkUGxvdENvbnRhaW5lciIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwiU3R5bGVkTWFwQ29udGFpbmVyIiwicHJvcHMiLCJ3aWR0aCIsImhlaWdodCIsIk1hcENvbnRhaW5lciIsIk1hcHNMYXlvdXQiLCJQbG90Q29udGFpbmVyIiwiX0NvbXBvbmVudCIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsImNyZWF0ZVJlZiIsIm1hcEZpZWxkcyIsIm1hcFN0eWxlIiwiaW1hZ2VTaXplIiwiZXhwb3J0SW1hZ2VTZXR0aW5nIiwibWFwU3RhdGUiLCJzY2FsZSIsImdldFNjYWxlRnJvbUltYWdlU2l6ZSIsImltYWdlVyIsImltYWdlSCIsImlzU3BsaXQiLCJjcmVhdGVTZWxlY3RvciIsIm1hcFN0eWxlU2VsZWN0b3IiLCJtYXBTY2FsZVNlbGVjdG9yIiwiYm90dG9tTWFwU3R5bGUiLCJzY2FsZU1hcFN0eWxlQnlSZXNvbHV0aW9uIiwidG9wTWFwU3R5bGUiLCJtYXAiLCJpc1N0eWxlTG9hZGVkIiwiX3JldHJpZXZlTmV3U2NyZWVuc2hvdCIsInBsb3R0aW5nQXJlYVJlZiIsImN1cnJlbnQiLCJfdGhpcyRwcm9wcyRleHBvcnRJbWEiLCJlc2NhcGVYaHRtbEZvcldlYnBhY2siLCJjb252ZXJ0VG9QbmciLCJ0aGVuIiwic2V0RXhwb3J0SW1hZ2VEYXRhVXJpIiwiZXJyIiwic2V0RXhwb3J0SW1hZ2VFcnJvciIsImVuYWJsZUVycm9yTm90aWZpY2F0aW9uIiwiYWRkTm90aWZpY2F0aW9uIiwiZXhwb3J0SW1hZ2VFcnJvciIsIl9vbk1hcFJlbmRlciIsImRlYm91bmNlIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJ2YWx1ZSIsImNvbXBvbmVudERpZE1vdW50Iiwic2V0RXhwb3J0SW1hZ2VTZXR0aW5nIiwicHJvY2Vzc2luZyIsImNvbXBvbmVudERpZFVwZGF0ZSIsInByZXZQcm9wcyIsIl90aGlzMiIsImNoZWNrcyIsInNob3VsZFJldHJpZXZlU2NyZWVuc2hvdCIsInNvbWUiLCJpdGVtIiwicmVuZGVyIiwiX3RoaXMkcHJvcHMiLCJfdGhpcyRwcm9wcyRzcGxpdE1hcHMiLCJzcGxpdE1hcHMiLCJ2aXNTdGF0ZSIsImxheWVycyIsImxheWVyRGF0YSIsImxlZ2VuZCIsInNpemUiLCJuZXdNYXBTdGF0ZSIsInpvb20iLCJNYXRoIiwibG9nMiIsImNlbnRlciIsInJlbmRlcmVkTGF5ZXJzIiwibGF5ZXIiLCJpZHgiLCJpZCIsIkdFT0NPREVSX0xBWUVSX0lEIiwic2hvdWxkUmVuZGVyTGF5ZXIiLCJib3VuZHMiLCJmaW5kTWFwQm91bmRzIiwiY2VudGVyQW5kWm9vbSIsImdldENlbnRlckFuZFpvb21Gcm9tQm91bmRzIiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJsb25naXR1ZGUiLCJsYXRpdHVkZSIsIm1hcFByb3BzIiwic2NhbGVkTWFwU3R5bGVTZWxlY3RvciIsIm1hcENvbnRyb2xzIiwibWFwTGVnZW5kIiwic2hvdyIsImFjdGl2ZSIsIk1hcENvbXBvbmVudCIsIk1hcCIsIm9uTWFwUmVuZGVyIiwiaXNFeHBvcnQiLCJkZWNrR2xQcm9wcyIsImdsT3B0aW9ucyIsInByZXNlcnZlRHJhd2luZ0J1ZmZlciIsInVzZURldmljZVBpeGVscyIsIm1hcENvbnRhaW5lcnMiLCJjcmVhdGVFbGVtZW50IiwiX2V4dGVuZHMyIiwiaW5kZXgiLCJwcmltYXJ5Iiwic2V0dGluZ3MiLCJyZWYiLCJNYXBWaWV3U3RhdGVDb250ZXh0UHJvdmlkZXIiLCJDb21wb25lbnQiXSwic291cmNlcyI6WyIuLi9zcmMvcGxvdC1jb250YWluZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbi8vIGxpYnJhcmllc1xuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50LCBjcmVhdGVSZWZ9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7Y3JlYXRlU2VsZWN0b3J9IGZyb20gJ3Jlc2VsZWN0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtNYXB9IGZyb20gJ3JlYWN0LW1hcC1nbCc7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSAnbG9kYXNoLmRlYm91bmNlJztcbmltcG9ydCB7XG4gIGV4cG9ydEltYWdlRXJyb3IsXG4gIHNjYWxlTWFwU3R5bGVCeVJlc29sdXRpb24sXG4gIGdldENlbnRlckFuZFpvb21Gcm9tQm91bmRzLFxuICBjb252ZXJ0VG9QbmcsXG4gIGdldFNjYWxlRnJvbUltYWdlU2l6ZVxufSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7ZmluZE1hcEJvdW5kc30gZnJvbSAnQGtlcGxlci5nbC9yZWR1Y2Vycyc7XG5pbXBvcnQgTWFwQ29udGFpbmVyRmFjdG9yeSBmcm9tICcuL21hcC1jb250YWluZXInO1xuaW1wb3J0IE1hcHNMYXlvdXRGYWN0b3J5IGZyb20gJy4vbWFwcy1sYXlvdXQnO1xuaW1wb3J0IHtNYXBWaWV3U3RhdGVDb250ZXh0UHJvdmlkZXJ9IGZyb20gJy4vbWFwLXZpZXctc3RhdGUtY29udGV4dCc7XG5cbmltcG9ydCB7R0VPQ09ERVJfTEFZRVJfSUQsIEV4cG9ydEltYWdlfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge1NwbGl0TWFwfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7XG4gIEFjdGlvbkhhbmRsZXIsXG4gIGFkZE5vdGlmaWNhdGlvbixcbiAgc2V0RXhwb3J0SW1hZ2VEYXRhVXJpLFxuICBzZXRFeHBvcnRJbWFnZUVycm9yLFxuICBzZXRFeHBvcnRJbWFnZVNldHRpbmdcbn0gZnJvbSAnQGtlcGxlci5nbC9hY3Rpb25zJztcbmltcG9ydCB7bWFwRmllbGRzU2VsZWN0b3J9IGZyb20gJy4va2VwbGVyLWdsJztcblxuY29uc3QgQ0xBU1NfRklMVEVSID0gW1xuICAnbWFwbGlicmVnbC1jb250cm9sLWNvbnRhaW5lcicsXG4gICdtYXBib3hnbC1jb250cm9sLWNvbnRhaW5lcicsXG4gICdhdHRyaXRpb24tbGluaycsXG4gICdhdHRyaXRpb24tbG9nbycsXG4gICdtYXAtY29udHJvbF9fcGFuZWwtc3BsaXQtdmlld3BvcnQtdG9vbHMnXG5dO1xuY29uc3QgRE9NX0ZJTFRFUl9GVU5DID0gbm9kZSA9PiAhQ0xBU1NfRklMVEVSLmluY2x1ZGVzKG5vZGUuY2xhc3NOYW1lKTtcbmNvbnN0IE9VVF9PRl9TQ1JFRU5fUE9TSVRJT04gPSAtOTk5OTtcblxuUGxvdENvbnRhaW5lckZhY3RvcnkuZGVwcyA9IFtNYXBDb250YWluZXJGYWN0b3J5LCBNYXBzTGF5b3V0RmFjdG9yeV07XG5cbi8vIFJlbW92ZSBtYXBib3ggbG9nbyBpbiBleHBvcnRlZCBtYXAsIGJlY2F1c2UgaXQgY29udGFpbnMgbm9uLWFzY2lpIGNoYXJhY3RlcnNcbi8vIFJlbW92ZSBzcGxpdCB2aWV3cG9ydCBVSSBjb250cm9scyBmcm9tIGV4cG9ydGVkIGltYWdlcyB3aGVuIHRoZSBsZWdlbmQgaXMgc2hvd25cbmNvbnN0IFN0eWxlZFBsb3RDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICAubWFwbGlicmVnbC1jdHJsLWJvdHRvbS1sZWZ0LFxuICAubWFwbGlicmVnbC1jdHJsLWJvdHRvbS1yaWdodCxcbiAgLm1hcGxpYnJlLWF0dHJpYnV0aW9uLWNvbnRhaW5lcixcbiAgLm1hcGJveGdsLWN0cmwtYm90dG9tLWxlZnQsXG4gIC5tYXBib3hnbC1jdHJsLWJvdHRvbS1yaWdodCxcbiAgLm1hcGJveC1hdHRyaWJ1dGlvbi1jb250YWluZXIsXG4gIC5tYXAtY29udHJvbF9fcGFuZWwtc3BsaXQtdmlld3BvcnQtdG9vbHMge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cblxuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogJHtPVVRfT0ZfU0NSRUVOX1BPU0lUSU9OfXB4O1xuICBsZWZ0OiAke09VVF9PRl9TQ1JFRU5fUE9TSVRJT059cHg7XG5gO1xuXG5pbnRlcmZhY2UgU3R5bGVkTWFwQ29udGFpbmVyUHJvcHMge1xuICB3aWR0aD86IG51bWJlcjtcbiAgaGVpZ2h0PzogbnVtYmVyO1xufVxuXG5jb25zdCBTdHlsZWRNYXBDb250YWluZXIgPSBzdHlsZWQuZGl2PFN0eWxlZE1hcENvbnRhaW5lclByb3BzPmBcbiAgd2lkdGg6ICR7cHJvcHMgPT4gcHJvcHMud2lkdGh9cHg7XG4gIGhlaWdodDogJHtwcm9wcyA9PiBwcm9wcy5oZWlnaHR9cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG5gO1xuXG5pbnRlcmZhY2UgUGxvdENvbnRhaW5lclByb3BzIHtcbiAgd2lkdGg/OiBudW1iZXI7XG4gIGhlaWdodD86IG51bWJlcjtcbiAgZXhwb3J0SW1hZ2VTZXR0aW5nOiBFeHBvcnRJbWFnZTtcbiAgYWRkTm90aWZpY2F0aW9uOiBBY3Rpb25IYW5kbGVyPHR5cGVvZiBhZGROb3RpZmljYXRpb24+O1xuICBtYXBGaWVsZHM6IFJldHVyblR5cGU8dHlwZW9mIG1hcEZpZWxkc1NlbGVjdG9yPjtcbiAgc2V0RXhwb3J0SW1hZ2VTZXR0aW5nOiB0eXBlb2Ygc2V0RXhwb3J0SW1hZ2VTZXR0aW5nO1xuICBzZXRFeHBvcnRJbWFnZURhdGFVcmk6IHR5cGVvZiBzZXRFeHBvcnRJbWFnZURhdGFVcmk7XG4gIHNldEV4cG9ydEltYWdlRXJyb3I6IHR5cGVvZiBzZXRFeHBvcnRJbWFnZUVycm9yO1xuICBzcGxpdE1hcHM/OiBTcGxpdE1hcFtdO1xuICBlbmFibGVFcnJvck5vdGlmaWNhdGlvbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFBsb3RDb250YWluZXJGYWN0b3J5KFxuICBNYXBDb250YWluZXI6IFJldHVyblR5cGU8dHlwZW9mIE1hcENvbnRhaW5lckZhY3Rvcnk+LFxuICBNYXBzTGF5b3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBNYXBzTGF5b3V0RmFjdG9yeT5cbik6IFJlYWN0LkNvbXBvbmVudFR5cGU8UGxvdENvbnRhaW5lclByb3BzPiB7XG4gIGNsYXNzIFBsb3RDb250YWluZXIgZXh0ZW5kcyBDb21wb25lbnQ8UGxvdENvbnRhaW5lclByb3BzPiB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgIHRoaXMuX29uTWFwUmVuZGVyID0gZGVib3VuY2UodGhpcy5fb25NYXBSZW5kZXIsIDUwMCk7XG4gICAgICB0aGlzLl9yZXRyaWV2ZU5ld1NjcmVlbnNob3QgPSBkZWJvdW5jZSh0aGlzLl9yZXRyaWV2ZU5ld1NjcmVlbnNob3QsIDUwMCk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLnByb3BzLnNldEV4cG9ydEltYWdlU2V0dGluZyh7cHJvY2Vzc2luZzogdHJ1ZX0pO1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgIC8vIHJlLWZldGNoIHRoZSBuZXcgc2NyZWVuc2hvdCBvbmx5IHdoZW4gcmF0aW8gbGVnZW5kIG9yIHJlc29sdXRpb24gY2hhbmdlc1xuICAgICAgY29uc3QgY2hlY2tzID0gWydyYXRpbycsICdyZXNvbHV0aW9uJywgJ2xlZ2VuZCddO1xuICAgICAgY29uc3Qgc2hvdWxkUmV0cmlldmVTY3JlZW5zaG90ID0gY2hlY2tzLnNvbWUoXG4gICAgICAgIGl0ZW0gPT4gdGhpcy5wcm9wcy5leHBvcnRJbWFnZVNldHRpbmdbaXRlbV0gIT09IHByZXZQcm9wcy5leHBvcnRJbWFnZVNldHRpbmdbaXRlbV1cbiAgICAgICk7XG4gICAgICBpZiAoc2hvdWxkUmV0cmlldmVTY3JlZW5zaG90KSB7XG4gICAgICAgIHRoaXMucHJvcHMuc2V0RXhwb3J0SW1hZ2VTZXR0aW5nKHtwcm9jZXNzaW5nOiB0cnVlfSk7XG4gICAgICAgIHRoaXMuX3JldHJpZXZlTmV3U2NyZWVuc2hvdCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBsb3R0aW5nQXJlYVJlZiA9IGNyZWF0ZVJlZjxIVE1MRGl2RWxlbWVudD4oKTtcblxuICAgIG1hcFN0eWxlU2VsZWN0b3IgPSBwcm9wcyA9PiBwcm9wcy5tYXBGaWVsZHMubWFwU3R5bGU7XG4gICAgbWFwU2NhbGVTZWxlY3RvciA9IHByb3BzID0+IHtcbiAgICAgIGNvbnN0IHtpbWFnZVNpemV9ID0gcHJvcHMuZXhwb3J0SW1hZ2VTZXR0aW5nO1xuICAgICAgY29uc3Qge21hcFN0YXRlfSA9IHByb3BzLm1hcEZpZWxkcztcbiAgICAgIGlmIChpbWFnZVNpemUuc2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGltYWdlU2l6ZS5zY2FsZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2NhbGUgPSBnZXRTY2FsZUZyb21JbWFnZVNpemUoXG4gICAgICAgIGltYWdlU2l6ZS5pbWFnZVcsXG4gICAgICAgIGltYWdlU2l6ZS5pbWFnZUgsXG4gICAgICAgIG1hcFN0YXRlLndpZHRoICogKG1hcFN0YXRlLmlzU3BsaXQgPyAyIDogMSksXG4gICAgICAgIG1hcFN0YXRlLmhlaWdodFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHNjYWxlID4gMCA/IHNjYWxlIDogMTtcbiAgICB9O1xuXG4gICAgc2NhbGVkTWFwU3R5bGVTZWxlY3RvciA9IGNyZWF0ZVNlbGVjdG9yKFxuICAgICAgdGhpcy5tYXBTdHlsZVNlbGVjdG9yLFxuICAgICAgdGhpcy5tYXBTY2FsZVNlbGVjdG9yLFxuICAgICAgKG1hcFN0eWxlLCBzY2FsZSkgPT4gKHtcbiAgICAgICAgLi4ubWFwU3R5bGUsXG4gICAgICAgIGJvdHRvbU1hcFN0eWxlOiBzY2FsZU1hcFN0eWxlQnlSZXNvbHV0aW9uKG1hcFN0eWxlLmJvdHRvbU1hcFN0eWxlLCBzY2FsZSksXG4gICAgICAgIHRvcE1hcFN0eWxlOiBzY2FsZU1hcFN0eWxlQnlSZXNvbHV0aW9uKG1hcFN0eWxlLnRvcE1hcFN0eWxlLCBzY2FsZSlcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIF9vbk1hcFJlbmRlciA9IG1hcCA9PiB7XG4gICAgICBpZiAobWFwLmlzU3R5bGVMb2FkZWQoKSkge1xuICAgICAgICB0aGlzLl9yZXRyaWV2ZU5ld1NjcmVlbnNob3QoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3JldHJpZXZlTmV3U2NyZWVuc2hvdCA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBsb3R0aW5nQXJlYVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnN0IHtpbWFnZVNpemUsIGVzY2FwZVhodG1sRm9yV2VicGFja30gPSB0aGlzLnByb3BzLmV4cG9ydEltYWdlU2V0dGluZztcbiAgICAgICAgY29udmVydFRvUG5nKHRoaXMucGxvdHRpbmdBcmVhUmVmLmN1cnJlbnQsIHtcbiAgICAgICAgICBmaWx0ZXI6IERPTV9GSUxURVJfRlVOQyxcbiAgICAgICAgICB3aWR0aDogaW1hZ2VTaXplLmltYWdlVyxcbiAgICAgICAgICBoZWlnaHQ6IGltYWdlU2l6ZS5pbWFnZUgsXG4gICAgICAgICAgZXNjYXBlWGh0bWxGb3JXZWJwYWNrXG4gICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4odGhpcy5wcm9wcy5zZXRFeHBvcnRJbWFnZURhdGFVcmkpXG4gICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLnNldEV4cG9ydEltYWdlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLmVuYWJsZUVycm9yTm90aWZpY2F0aW9uKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJvcHMuYWRkTm90aWZpY2F0aW9uKGV4cG9ydEltYWdlRXJyb3Ioe2Vycn0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge2V4cG9ydEltYWdlU2V0dGluZywgbWFwRmllbGRzLCBzcGxpdE1hcHMgPSBbXX0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3Qge21hcFN0YXRlLCB2aXNTdGF0ZX0gPSBtYXBGaWVsZHM7XG4gICAgICBjb25zdCB7bGF5ZXJzLCBsYXllckRhdGF9ID0gdmlzU3RhdGU7XG4gICAgICBjb25zdCB7aW1hZ2VTaXplLCBsZWdlbmR9ID0gZXhwb3J0SW1hZ2VTZXR0aW5nO1xuXG4gICAgICBjb25zdCBpc1NwbGl0ID0gc3BsaXRNYXBzICYmIHNwbGl0TWFwcy5sZW5ndGggPiAxO1xuXG4gICAgICBjb25zdCBzaXplID0ge1xuICAgICAgICB3aWR0aDogaW1hZ2VTaXplPy5pbWFnZVcgfHwgMSxcbiAgICAgICAgaGVpZ2h0OiBpbWFnZVNpemU/LmltYWdlSCB8fCAxXG4gICAgICB9O1xuICAgICAgY29uc3Qgd2lkdGggPSBzaXplLndpZHRoIC8gKGlzU3BsaXQgPyAyIDogMSk7XG4gICAgICBjb25zdCBoZWlnaHQgPSBzaXplLmhlaWdodDtcbiAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5tYXBTY2FsZVNlbGVjdG9yKHRoaXMucHJvcHMpO1xuICAgICAgY29uc3QgbmV3TWFwU3RhdGUgPSB7XG4gICAgICAgIC4uLm1hcFN0YXRlLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICB6b29tOiBtYXBTdGF0ZS56b29tICsgKE1hdGgubG9nMihzY2FsZSkgfHwgMClcbiAgICAgIH07XG5cbiAgICAgIC8vIGNlbnRlciBhbmQgYWxsIGxheWVyIGJvdW5kc1xuICAgICAgaWYgKGV4cG9ydEltYWdlU2V0dGluZy5jZW50ZXIpIHtcbiAgICAgICAgY29uc3QgcmVuZGVyZWRMYXllcnMgPSBsYXllcnMuZmlsdGVyKFxuICAgICAgICAgIChsYXllciwgaWR4KSA9PiBsYXllci5pZCAhPT0gR0VPQ09ERVJfTEFZRVJfSUQgJiYgbGF5ZXIuc2hvdWxkUmVuZGVyTGF5ZXIobGF5ZXJEYXRhW2lkeF0pXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IGZpbmRNYXBCb3VuZHMocmVuZGVyZWRMYXllcnMpO1xuICAgICAgICBjb25zdCBjZW50ZXJBbmRab29tID0gZ2V0Q2VudGVyQW5kWm9vbUZyb21Cb3VuZHMoYm91bmRzLCB7d2lkdGgsIGhlaWdodH0pO1xuICAgICAgICBpZiAoY2VudGVyQW5kWm9vbSkge1xuICAgICAgICAgIGNvbnN0IHpvb20gPSBOdW1iZXIuaXNGaW5pdGUoY2VudGVyQW5kWm9vbS56b29tKSA/IGNlbnRlckFuZFpvb20uem9vbSA6IG1hcFN0YXRlLnpvb207XG5cbiAgICAgICAgICBuZXdNYXBTdGF0ZS5sb25naXR1ZGUgPSBjZW50ZXJBbmRab29tLmNlbnRlclswXTtcbiAgICAgICAgICBuZXdNYXBTdGF0ZS5sYXRpdHVkZSA9IGNlbnRlckFuZFpvb20uY2VudGVyWzFdO1xuICAgICAgICAgIG5ld01hcFN0YXRlLnpvb20gPSB6b29tICsgTnVtYmVyKE1hdGgubG9nMihzY2FsZSkgfHwgMCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbWFwUHJvcHMgPSB7XG4gICAgICAgIC4uLm1hcEZpZWxkcyxcbiAgICAgICAgbWFwU3R5bGU6IHRoaXMuc2NhbGVkTWFwU3R5bGVTZWxlY3Rvcih0aGlzLnByb3BzKSxcblxuICAgICAgICAvLyBvdmVycmlkZSB2aWV3cG9ydCBiYXNlZCBvbiBleHBvcnQgc2V0dGluZ3NcbiAgICAgICAgbWFwU3RhdGU6IG5ld01hcFN0YXRlLFxuICAgICAgICBtYXBDb250cm9sczoge1xuICAgICAgICAgIC8vIG92ZXJyaWRlIG1hcCBsZWdlbmQgdmlzaWJpbGl0eVxuICAgICAgICAgIG1hcExlZ2VuZDoge1xuICAgICAgICAgICAgc2hvdzogbGVnZW5kLFxuICAgICAgICAgICAgYWN0aXZlOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBNYXBDb21wb25lbnQ6IE1hcCxcbiAgICAgICAgb25NYXBSZW5kZXI6IHRoaXMuX29uTWFwUmVuZGVyLFxuICAgICAgICBpc0V4cG9ydDogdHJ1ZSxcbiAgICAgICAgZGVja0dsUHJvcHM6IHtcbiAgICAgICAgICAuLi5tYXBGaWVsZHMuZGVja0dsUHJvcHMsXG4gICAgICAgICAgZ2xPcHRpb25zOiB7XG4gICAgICAgICAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IHRydWUsXG4gICAgICAgICAgICB1c2VEZXZpY2VQaXhlbHM6IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtYXBDb250YWluZXJzID0gIWlzU3BsaXQgPyAoXG4gICAgICAgIDxNYXBDb250YWluZXIgaW5kZXg9ezB9IHByaW1hcnk9e3RydWV9IHsuLi5tYXBQcm9wc30gLz5cbiAgICAgICkgOiAoXG4gICAgICAgIDxNYXBzTGF5b3V0IGNsYXNzTmFtZT1cInBsb3QtY29udGFpbmVyLW1hcHNcIiBtYXBTdGF0ZT17bmV3TWFwU3RhdGV9PlxuICAgICAgICAgIHtzcGxpdE1hcHMubWFwKChzZXR0aW5ncywgaW5kZXgpID0+IChcbiAgICAgICAgICAgIDxNYXBDb250YWluZXIga2V5PXtpbmRleH0gaW5kZXg9e2luZGV4fSBwcmltYXJ5PXtpbmRleCA9PT0gMX0gey4uLm1hcFByb3BzfSAvPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L01hcHNMYXlvdXQ+XG4gICAgICApO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFN0eWxlZFBsb3RDb250YWluZXIgY2xhc3NOYW1lPVwiZXhwb3J0LW1hcC1pbnN0YW5jZVwiPlxuICAgICAgICAgIDxTdHlsZWRNYXBDb250YWluZXIgcmVmPXt0aGlzLnBsb3R0aW5nQXJlYVJlZn0gd2lkdGg9e3NpemUud2lkdGh9IGhlaWdodD17c2l6ZS5oZWlnaHR9PlxuICAgICAgICAgICAgPE1hcFZpZXdTdGF0ZUNvbnRleHRQcm92aWRlciBtYXBTdGF0ZT17bmV3TWFwU3RhdGV9PlxuICAgICAgICAgICAgICB7bWFwQ29udGFpbmVyc31cbiAgICAgICAgICAgIDwvTWFwVmlld1N0YXRlQ29udGV4dFByb3ZpZGVyPlxuICAgICAgICAgIDwvU3R5bGVkTWFwQ29udGFpbmVyPlxuICAgICAgICA8L1N0eWxlZFBsb3RDb250YWluZXI+XG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gUGxvdENvbnRhaW5lcjtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUlBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFNBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxXQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxPQUFBLEdBQUFGLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBTSxNQUFBLEdBQUFOLE9BQUE7QUFPQSxJQUFBTyxTQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxhQUFBLEdBQUFMLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBUyxXQUFBLEdBQUFOLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBVSxvQkFBQSxHQUFBVixPQUFBO0FBRUEsSUFBQVcsVUFBQSxHQUFBWCxPQUFBO0FBQW9FLElBQUFZLGVBQUEsRUFBQUMsZ0JBQUEsRUFyQnBFO0FBQ0E7QUFFQTtBQUFBLFNBQUFDLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLHlCQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBaEIsd0JBQUFnQixDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JBQUFLLE9BQUEsQ0FBQUwsQ0FBQSwwQkFBQUEsQ0FBQSxzQkFBQUEsQ0FBQSxRQUFBRyxDQUFBLEdBQUFKLHdCQUFBLENBQUFH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