UNPKG

kepler.gl.geoiq

Version:

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

300 lines (243 loc) 34.2 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"] = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _reactMapGlDraw = require("react-map-gl-draw"); var _window = _interopRequireDefault(require("global/window")); var _classnames = _interopRequireDefault(require("classnames")); var _lodash = _interopRequireDefault(require("lodash.get")); var _defaultSettings = require("../../constants/default-settings"); var _featureActionPanel = _interopRequireDefault(require("./feature-action-panel")); var _featureStyles = require("./feature-styles"); var _handleStyle = require("./handle-style"); var _constants = require("../../constants"); var _reselect = require("reselect"); var _http = require("http"); var _templateObject; function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } 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 _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } var DELETE_KEY_EVENT_CODE = 46; var BACKSPACE_KEY_EVENT_CODE = 8; var ESCAPE_KEY_EVENT_CODE = 27; var StyledWrapper = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n cursor: ", ";\n position: relative;\n"])), function (props) { return props.editor.mode === _constants.EDITOR_MODES.EDIT ? 'pointer' : 'crosshair'; }); var editorLayerFilter = function editorLayerFilter(layer) { return _defaultSettings.EDITOR_AVAILABLE_LAYERS.includes(layer.type); }; var Editor = /*#__PURE__*/function (_Component) { (0, _inherits2["default"])(Editor, _Component); var _super = _createSuper(Editor); function Editor() { var _this; (0, _classCallCheck2["default"])(this, Editor); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _super.call.apply(_super, [this].concat(args)); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", { showActions: false, lastPosition: null }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "layerSelector", function (props) { return props.layers; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "layersToRenderSelector", function (props) { return props.layersToRender; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "filterSelector", function (props) { return props.filters; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "selectedFeatureIdSelector", function (props) { return (0, _lodash["default"])(props, ['editor', 'selectedFeature', 'id']); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "editorFeatureSelector", function (props) { return (0, _lodash["default"])(props, ['editor', 'features']); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "currentFilterSelector", (0, _reselect.createSelector)(_this.filterSelector, _this.selectedFeatureIdSelector, function (filters, selectedFeatureId) { return filters.find(function (f) { return f.value && f.value.id === selectedFeatureId; }); })); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "availableLayersSeletor", (0, _reselect.createSelector)(_this.layerSelector, _this.layersToRenderSelector, function (layers, layersToRender) { return layers.filter(editorLayerFilter).filter(function (layer) { return layersToRender[layer.id]; }); })); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "allFeaturesSelector", (0, _reselect.createSelector)(_this.filterSelector, _this.editorFeatureSelector, function (filters, editorFeatures) { return filters.filter(function (f) { return f.type === _defaultSettings.FILTER_TYPES.polygon; }).map(function (f) { return f.value; }).concat(editorFeatures); })); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onKeyPressed", function (event) { var isEnabled = _this.props.isEnabled; if (!isEnabled) { return; } switch (event.which) { case DELETE_KEY_EVENT_CODE: case BACKSPACE_KEY_EVENT_CODE: _this._onDeleteSelectedFeature(); break; case ESCAPE_KEY_EVENT_CODE: _this.props.onSelect(null); break; default: break; } }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onSelect", function (_ref) { var selectedFeatureId = _ref.selectedFeatureId, sourceEvent = _ref.sourceEvent; var allFeatures = _this.allFeaturesSelector(_this.props); _this.setState(_objectSpread({}, sourceEvent.rightButton ? { showActions: true, lastPosition: { x: sourceEvent.changedPointers[0].offsetX, y: sourceEvent.changedPointers[0].offsetY } } : null), function () { _this.props.onSelect(allFeatures.find(function (f) { return f.id === selectedFeatureId; })); }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onDeleteSelectedFeature", function () { if (_this.state.showActions) { _this.setState({ showActions: false }); } var editor = _this.props.editor; var _editor$selectedFeatu = editor.selectedFeature, selectedFeature = _editor$selectedFeatu === void 0 ? {} : _editor$selectedFeatu; _this.props.onDeleteFeature(selectedFeature); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_closeFeatureAction", function () { _this.setState({ showActions: false }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onToggleLayer", function (layer) { var selectedFeature = _this.props.editor.selectedFeature; var _this$props = _this.props, auth = _this$props.auth, project = _this$props.project, mapState = _this$props.mapState; if (!selectedFeature) { return; } _this.props.onTogglePolygonFilter(layer, selectedFeature, auth, project, mapState); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onUpdateFeature", function (feature, auth, project, mapState) { return _this.props.onUpdate(feature, auth, project, mapState); }); return _this; } (0, _createClass2["default"])(Editor, [{ key: "componentDidMount", value: function componentDidMount() { _window["default"].addEventListener('keydown', this._onKeyPressed); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { _window["default"].removeEventListener('keydown', this._onKeyPressed); } }, { key: "render", value: function render() { var _this2 = this; var _this$props2 = this.props, className = _this$props2.className, clickRadius = _this$props2.clickRadius, datasets = _this$props2.datasets, editor = _this$props2.editor, onUpdate = _this$props2.onUpdate, style = _this$props2.style, auth = _this$props2.auth, project = _this$props2.project, mapState = _this$props2.mapState; var _this$state = this.state, lastPosition = _this$state.lastPosition, showActions = _this$state.showActions; var selectedFeatureId = (0, _lodash["default"])(editor, ['selectedFeature', 'id']); var currentFilter = this.currentFilterSelector(this.props); var availableLayers = this.availableLayersSeletor(this.props); var allFeatures = this.allFeaturesSelector(this.props); return (/*#__PURE__*/_react["default"].createElement(StyledWrapper, { editor: editor, className: (0, _classnames["default"])('editor', className), style: style }, /*#__PURE__*/_react["default"].createElement(_reactMapGlDraw.Editor, { clickRadius: clickRadius, mode: editor.mode, features: allFeatures, selectedFeatureId: selectedFeatureId, onSelect: this._onSelect, onUpdate: function onUpdate(feature) { return _this2._onUpdateFeature(feature, auth, project, mapState); }, getEditHandleShape: _handleStyle.getEditHandleShape, getFeatureStyle: _featureStyles.getStyle, getEditHandleStyle: _handleStyle.getStyle }), showActions && Boolean(selectedFeatureId) ? /*#__PURE__*/_react["default"].createElement(_featureActionPanel["default"], { datasets: datasets, layers: availableLayers, currentFilter: currentFilter, onClose: this._closeFeatureAction, onDeleteFeature: this._onDeleteSelectedFeature, onToggleLayer: this._onToggleLayer, position: lastPosition, auth: auth, project: project, mapState: mapState }) : null) ); } }]); return Editor; }(_react.Component); (0, _defineProperty2["default"])(Editor, "propTypes", { filters: _propTypes["default"].arrayOf(_propTypes["default"].object).isRequired, layers: _propTypes["default"].arrayOf(_propTypes["default"].object).isRequired, datasets: _propTypes["default"].object.isRequired, editor: _propTypes["default"].object.isRequired, layersToRender: _propTypes["default"].object.isRequired, onSelect: _propTypes["default"].func.isRequired, onUpdate: _propTypes["default"].func.isRequired, onDeleteFeature: _propTypes["default"].func.isRequired, onTogglePolygonFilter: _propTypes["default"].func.isRequired, index: _propTypes["default"].number, classnames: _propTypes["default"].string, clickRadius: _propTypes["default"].number, isEnabled: _propTypes["default"].bool, auth: _propTypes["default"].string, project: _propTypes["default"].project, mapState: _propTypes["default"].object }); (0, _defineProperty2["default"])(Editor, "defaultProps", { clickRadius: _featureStyles.DEFAULT_RADIUS }); var _default = exports["default"] = Editor; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2VkaXRvci9lZGl0b3IuanMiXSwibmFtZXMiOlsiREVMRVRFX0tFWV9FVkVOVF9DT0RFIiwiQkFDS1NQQUNFX0tFWV9FVkVOVF9DT0RFIiwiRVNDQVBFX0tFWV9FVkVOVF9DT0RFIiwiU3R5bGVkV3JhcHBlciIsInN0eWxlZCIsImRpdiIsInByb3BzIiwiZWRpdG9yIiwibW9kZSIsIkVESVRPUl9NT0RFUyIsIkVESVQiLCJlZGl0b3JMYXllckZpbHRlciIsImxheWVyIiwiRURJVE9SX0FWQUlMQUJMRV9MQVlFUlMiLCJpbmNsdWRlcyIsInR5cGUiLCJFZGl0b3IiLCJzaG93QWN0aW9ucyIsImxhc3RQb3NpdGlvbiIsImxheWVycyIsImxheWVyc1RvUmVuZGVyIiwiZmlsdGVycyIsImZpbHRlclNlbGVjdG9yIiwic2VsZWN0ZWRGZWF0dXJlSWRTZWxlY3RvciIsInNlbGVjdGVkRmVhdHVyZUlkIiwiZmluZCIsImYiLCJ2YWx1ZSIsImlkIiwibGF5ZXJTZWxlY3RvciIsImxheWVyc1RvUmVuZGVyU2VsZWN0b3IiLCJmaWx0ZXIiLCJlZGl0b3JGZWF0dXJlU2VsZWN0b3IiLCJlZGl0b3JGZWF0dXJlcyIsIkZJTFRFUl9UWVBFUyIsInBvbHlnb24iLCJtYXAiLCJjb25jYXQiLCJldmVudCIsImlzRW5hYmxlZCIsIndoaWNoIiwiX29uRGVsZXRlU2VsZWN0ZWRGZWF0dXJlIiwib25TZWxlY3QiLCJzb3VyY2VFdmVudCIsImFsbEZlYXR1cmVzIiwiYWxsRmVhdHVyZXNTZWxlY3RvciIsInNldFN0YXRlIiwicmlnaHRCdXR0b24iLCJ4IiwiY2hhbmdlZFBvaW50ZXJzIiwib2Zmc2V0WCIsInkiLCJvZmZzZXRZIiwic3RhdGUiLCJzZWxlY3RlZEZlYXR1cmUiLCJvbkRlbGV0ZUZlYXR1cmUiLCJhdXRoIiwicHJvamVjdCIsIm1hcFN0YXRlIiwib25Ub2dnbGVQb2x5Z29uRmlsdGVyIiwiZmVhdHVyZSIsIm9uVXBkYXRlIiwid2luZG93IiwiYWRkRXZlbnRMaXN0ZW5lciIsIl9vbktleVByZXNzZWQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiY2xhc3NOYW1lIiwiY2xpY2tSYWRpdXMiLCJkYXRhc2V0cyIsInN0eWxlIiwiY3VycmVudEZpbHRlciIsImN1cnJlbnRGaWx0ZXJTZWxlY3RvciIsImF2YWlsYWJsZUxheWVycyIsImF2YWlsYWJsZUxheWVyc1NlbGV0b3IiLCJfb25TZWxlY3QiLCJfb25VcGRhdGVGZWF0dXJlIiwiZ2V0RWRpdEhhbmRsZVNoYXBlIiwiZ2V0RmVhdHVyZVN0eWxlIiwiZ2V0RWRpdEhhbmRsZVN0eWxlIiwiQm9vbGVhbiIsIl9jbG9zZUZlYXR1cmVBY3Rpb24iLCJfb25Ub2dnbGVMYXllciIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsImFycmF5T2YiLCJvYmplY3QiLCJpc1JlcXVpcmVkIiwiZnVuYyIsImluZGV4IiwibnVtYmVyIiwiY2xhc3NuYW1lcyIsInN0cmluZyIsImJvb2wiLCJERUZBVUxUX1JBRElVUyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUdBOztBQUNBOztBQUlBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTUEscUJBQXFCLEdBQUcsRUFBOUI7QUFDQSxJQUFNQyx3QkFBd0IsR0FBRyxDQUFqQztBQUNBLElBQU1DLHFCQUFxQixHQUFHLEVBQTlCOztBQUVBLElBQU1DLGFBQWEsR0FBR0MsNkJBQU9DLEdBQVYsaUlBQ1AsVUFBQUMsS0FBSztBQUFBLFNBQ2JBLEtBQUssQ0FBQ0MsTUFBTixDQUFhQyxJQUFiLEtBQXNCQyx3QkFBYUMsSUFBbkMsR0FBMEMsU0FBMUMsR0FBc0QsV0FEekM7QUFBQSxDQURFLENBQW5COztBQU1BLElBQU1DLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBb0IsQ0FBQUMsS0FBSztBQUFBLFNBQUlDLHlDQUF3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VWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7RWRpdG9yIGFzIERyYXd9IGZyb20gJ3JlYWN0LW1hcC1nbC1kcmF3JztcbmltcG9ydCB3aW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoLmdldCc7XG5cbmltcG9ydCB7RURJVE9SX0FWQUlMQUJMRV9MQVlFUlN9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcbmltcG9ydCBGZWF0dXJlQWN0aW9uUGFuZWwgZnJvbSAnLi9mZWF0dXJlLWFjdGlvbi1wYW5lbCc7XG5pbXBvcnQge0ZJTFRFUl9UWVBFU30gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuXG5pbXBvcnQge0RFRkFVTFRfUkFESVVTLCBnZXRTdHlsZSBhcyBnZXRGZWF0dXJlU3R5bGV9IGZyb20gJy4vZmVhdHVyZS1zdHlsZXMnO1xuaW1wb3J0IHtcbiAgZ2V0U3R5bGUgYXMgZ2V0RWRpdEhhbmRsZVN0eWxlLFxuICBnZXRFZGl0SGFuZGxlU2hhcGVcbn0gZnJvbSAnLi9oYW5kbGUtc3R5bGUnO1xuaW1wb3J0IHtFRElUT1JfTU9ERVN9IGZyb20gJ2NvbnN0YW50cyc7XG5pbXBvcnQge2NyZWF0ZVNlbGVjdG9yfSBmcm9tICdyZXNlbGVjdCc7XG5pbXBvcnQge0luY29taW5nTWVzc2FnZX0gZnJvbSAnaHR0cCc7XG5cbmNvbnN0IERFTEVURV9LRVlfRVZFTlRfQ09ERSA9IDQ2O1xuY29uc3QgQkFDS1NQQUNFX0tFWV9FVkVOVF9DT0RFID0gODtcbmNvbnN0IEVTQ0FQRV9LRVlfRVZFTlRfQ09ERSA9IDI3O1xuXG5jb25zdCBTdHlsZWRXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgY3Vyc29yOiAke3Byb3BzID0+XG4gICAgcHJvcHMuZWRpdG9yLm1vZGUgPT09IEVESVRPUl9NT0RFUy5FRElUID8gJ3BvaW50ZXInIDogJ2Nyb3NzaGFpcid9O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xuXG5jb25zdCBlZGl0b3JMYXllckZpbHRlciA9IGxheWVyID0+IEVESVRPUl9BVkFJTEFCTEVfTEFZRVJTLmluY2x1ZGVzKGxheWVyLnR5cGUpO1xuXG5jbGFzcyBFZGl0b3IgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIGZpbHRlcnM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLmlzUmVxdWlyZWQsXG4gICAgbGF5ZXJzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KS5pc1JlcXVpcmVkLFxuICAgIGRhdGFzZXRzOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgZWRpdG9yOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgbGF5ZXJzVG9SZW5kZXI6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICBvblNlbGVjdDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBvblVwZGF0ZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBvbkRlbGV0ZUZlYXR1cmU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgb25Ub2dnbGVQb2x5Z29uRmlsdGVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuXG4gICAgaW5kZXg6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgY2xhc3NuYW1lczogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjbGlja1JhZGl1czogUHJvcFR5cGVzLm51bWJlcixcbiAgICBpc0VuYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gICAgYXV0aDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBwcm9qZWN0OiBQcm9wVHlwZXMucHJvamVjdCxcbiAgICBtYXBTdGF0ZTogUHJvcFR5cGVzLm9iamVjdFxuICB9O1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgY2xpY2tSYWRpdXM6IERFRkFVTFRfUkFESVVTXG4gIH07XG5cbiAgc3RhdGUgPSB7XG4gICAgc2hvd0FjdGlvbnM6IGZhbHNlLFxuICAgIGxhc3RQb3NpdGlvbjogbnVsbFxuICB9O1xuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fb25LZXlQcmVzc2VkKTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fb25LZXlQcmVzc2VkKTtcbiAgfVxuXG4gIGxheWVyU2VsZWN0b3IgPSBwcm9wcyA9PiBwcm9wcy5sYXllcnM7XG4gIGxheWVyc1RvUmVuZGVyU2VsZWN0b3IgPSBwcm9wcyA9PiBwcm9wcy5sYXllcnNUb1JlbmRlcjtcbiAgZmlsdGVyU2VsZWN0b3IgPSBwcm9wcyA9PiBwcm9wcy5maWx0ZXJzO1xuICBzZWxlY3RlZEZlYXR1cmVJZFNlbGVjdG9yID0gcHJvcHMgPT5cbiAgICBnZXQocHJvcHMsIFsnZWRpdG9yJywgJ3NlbGVjdGVkRmVhdHVyZScsICdpZCddKTtcbiAgZWRpdG9yRmVhdHVyZVNlbGVjdG9yID0gcHJvcHMgPT4gZ2V0KHByb3BzLCBbJ2VkaXRvcicsICdmZWF0dXJlcyddKTtcblxuICBjdXJyZW50RmlsdGVyU2VsZWN0b3IgPSBjcmVhdGVTZWxlY3RvcihcbiAgICB0aGlzLmZpbHRlclNlbGVjdG9yLFxuICAgIHRoaXMuc2VsZWN0ZWRGZWF0dXJlSWRTZWxlY3RvcixcbiAgICAoZmlsdGVycywgc2VsZWN0ZWRGZWF0dXJlSWQpID0+XG4gICAgICBmaWx0ZXJzLmZpbmQoZiA9PiBmLnZhbHVlICYmIGYudmFsdWUuaWQgPT09IHNlbGVjdGVkRmVhdHVyZUlkKVxuICApO1xuXG4gIGF2YWlsYWJsZUxheWVyc1NlbGV0b3IgPSBjcmVhdGVTZWxlY3RvcihcbiAgICB0aGlzLmxheWVyU2VsZWN0b3IsXG4gICAgdGhpcy5sYXllcnNUb1JlbmRlclNlbGVjdG9yLFxuICAgIChsYXllcnMsIGxheWVyc1RvUmVuZGVyKSA9PlxuICAgICAgbGF5ZXJzLmZpbHRlcihlZGl0b3JMYXllckZpbHRlcikuZmlsdGVyKGxheWVyID0+IHtcbiAgICAgICAgcmV0dXJuIGxheWVyc1RvUmVuZGVyW2xheWVyLmlkXTtcbiAgICAgIH0pXG4gICk7XG5cbiAgYWxsRmVhdHVyZXNTZWxlY3RvciA9IGNyZWF0ZVNlbGVjdG9yKFxuICAgIHRoaXMuZmlsdGVyU2VsZWN0b3IsXG4gICAgdGhpcy5lZGl0b3JGZWF0dXJlU2VsZWN0b3IsXG4gICAgKGZpbHRlcnMsIGVkaXRvckZlYXR1cmVzKSA9PlxuICAgICAgZmlsdGVyc1xuICAgICAgICAuZmlsdGVyKGYgPT4gZi50eXBlID09PSBGSUxURVJfVFlQRVMucG9seWdvbilcbiAgICAgICAgLm1hcChmID0+IGYudmFsdWUpXG4gICAgICAgIC5jb25jYXQoZWRpdG9yRmVhdHVyZXMpXG4gICk7XG5cbiAgX29uS2V5UHJlc3NlZCA9IGV2ZW50ID0+IHtcbiAgICBjb25zdCB7aXNFbmFibGVkfSA9IHRoaXMucHJvcHM7XG5cbiAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZXZlbnQud2hpY2gpIHtcbiAgICAgIGNhc2UgREVMRVRFX0tFWV9FVkVOVF9DT0RFOlxuICAgICAgY2FzZSBCQUNLU1BBQ0VfS0VZX0VWRU5UX0NPREU6XG4gICAgICAgIHRoaXMuX29uRGVsZXRlU2VsZWN0ZWRGZWF0dXJlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFU0NBUEVfS0VZX0VWRU5UX0NPREU6XG4gICAgICAgIHRoaXMucHJvcHMub25TZWxlY3QobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9O1xuXG4gIF9vblNlbGVjdCA9ICh7c2VsZWN0ZWRGZWF0dXJlSWQsIHNvdXJjZUV2ZW50fSkgPT4ge1xuICAgIGNvbnN0IGFsbEZlYXR1cmVzID0gdGhpcy5hbGxGZWF0dXJlc1NlbGVjdG9yKHRoaXMucHJvcHMpO1xuICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICB7XG4gICAgICAgIC4uLihzb3VyY2VFdmVudC5yaWdodEJ1dHRvblxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBzaG93QWN0aW9uczogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFzdFBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgeDogc291cmNlRXZlbnQuY2hhbmdlZFBvaW50ZXJzWzBdLm9mZnNldFgsXG4gICAgICAgICAgICAgICAgeTogc291cmNlRXZlbnQuY2hhbmdlZFBvaW50ZXJzWzBdLm9mZnNldFlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogbnVsbClcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMucHJvcHMub25TZWxlY3QoYWxsRmVhdHVyZXMuZmluZChmID0+IGYuaWQgPT09IHNlbGVjdGVkRmVhdHVyZUlkKSk7XG4gICAgICB9XG4gICAgKTtcbiAgfTtcblxuICBfb25EZWxldGVTZWxlY3RlZEZlYXR1cmUgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUuc2hvd0FjdGlvbnMpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe3Nob3dBY3Rpb25zOiBmYWxzZX0pO1xuICAgIH1cblxuICAgIGNvbnN0IHtlZGl0b3J9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7c2VsZWN0ZWRGZWF0dXJlID0ge319ID0gZWRpdG9yO1xuICAgIHRoaXMucHJvcHMub25EZWxldGVGZWF0dXJlKHNlbGVjdGVkRmVhdHVyZSk7XG4gIH07XG5cbiAgX2Nsb3NlRmVhdHVyZUFjdGlvbiA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtzaG93QWN0aW9uczogZmFsc2V9KTtcbiAgfTtcblxuICBfb25Ub2dnbGVMYXllciA9IGxheWVyID0+IHtcbiAgICBjb25zdCB7c2VsZWN0ZWRGZWF0dXJlfSA9IHRoaXMucHJvcHMuZWRpdG9yO1xuICAgIGNvbnN0IHthdXRoLCBwcm9qZWN0LCBtYXBTdGF0ZX0gPSB0aGlzLnByb3BzO1xuICAgIGlmICghc2VsZWN0ZWRGZWF0dXJlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wcm9wcy5vblRvZ2dsZVBvbHlnb25GaWx0ZXIoXG4gICAgICBsYXllcixcbiAgICAgIHNlbGVjdGVkRmVhdHVyZSxcbiAgICAgIGF1dGgsXG4gICAgICBwcm9qZWN0LFxuICAgICAgbWFwU3RhdGVcbiAgICApO1xuICB9O1xuXG4gIF9vblVwZGF0ZUZlYXR1cmUgPSAoZmVhdHVyZSwgYXV0aCwgcHJvamVjdCwgbWFwU3RhdGUpID0+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5vblVwZGF0ZShmZWF0dXJlLCBhdXRoLCBwcm9qZWN0LCBtYXBTdGF0ZSk7XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGNsaWNrUmFkaXVzLFxuICAgICAgZGF0YXNldHMsXG4gICAgICBlZGl0b3IsXG4gICAgICBvblVwZGF0ZSxcbiAgICAgIHN0eWxlLFxuICAgICAgYXV0aCxcbiAgICAgIHByb2plY3QsXG4gICAgICBtYXBTdGF0ZVxuICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgY29uc3Qge2xhc3RQb3NpdGlvbiwgc2hvd0FjdGlvbnN9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBzZWxlY3RlZEZlYXR1cmVJZCA9IGdldChlZGl0b3IsIFsnc2VsZWN0ZWRGZWF0dXJlJywgJ2lkJ10pO1xuICAgIGNvbnN0IGN1cnJlbnRGaWx0ZXIgPSB0aGlzLmN1cnJlbnRGaWx0ZXJTZWxlY3Rvcih0aGlzLnByb3BzKTtcbiAgICBjb25zdCBhdmFpbGFibGVMYXllcnMgPSB0aGlzLmF2YWlsYWJsZUxheWVyc1NlbGV0b3IodGhpcy5wcm9wcyk7XG4gICAgY29uc3QgYWxsRmVhdHVyZXMgPSB0aGlzLmFsbEZlYXR1cmVzU2VsZWN0b3IodGhpcy5wcm9wcyk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFN0eWxlZFdyYXBwZXJcbiAgICAgICAgZWRpdG9yPXtlZGl0b3J9XG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NuYW1lcygnZWRpdG9yJywgY2xhc3NOYW1lKX1cbiAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgPlxuICAgICAgICA8RHJhd1xuICAgICAgICAgIGNsaWNrUmFkaXVzPXtjbGlja1JhZGl1c31cbiAgICAgICAgICBtb2RlPXtlZGl0b3IubW9kZX1cbiAgICAgICAgICBmZWF0dXJlcz17YWxsRmVhdHVyZXN9XG4gICAgICAgICAgc2VsZWN0ZWRGZWF0dXJlSWQ9e3NlbGVjdGVkRmVhdHVyZUlkfVxuICAgICAgICAgIG9uU2VsZWN0PXt0aGlzLl9vblNlbGVjdH1cbiAgICAgICAgICBvblVwZGF0ZT17ZmVhdHVyZSA9PlxuICAgICAgICAgICAgdGhpcy5fb25VcGRhdGVGZWF0dXJlKGZlYXR1cmUsIGF1dGgsIHByb2plY3QsIG1hcFN0YXRlKVxuICAgICAgICAgIH1cbiAgICAgICAgICBnZXRFZGl0SGFuZGxlU2hhcGU9e2dldEVkaXRIYW5kbGVTaGFwZX1cbiAgICAgICAgICBnZXRGZWF0dXJlU3R5bGU9e2dldEZlYXR1cmVTdHlsZX1cbiAgICAgICAgICBnZXRFZGl0SGFuZGxlU3R5bGU9e2dldEVkaXRIYW5kbGVTdHlsZX1cbiAgICAgICAgLz5cbiAgICAgICAge3Nob3dBY3Rpb25zICYmIEJvb2xlYW4oc2VsZWN0ZWRGZWF0dXJlSWQpID8gKFxuICAgICAgICAgIDxGZWF0dXJlQWN0aW9uUGFuZWxcbiAgICAgICAgICAgIGRhdGFzZXRzPXtkYXRhc2V0c31cbiAgICAgICAgICAgIGxheWVycz17YXZhaWxhYmxlTGF5ZXJzfVxuICAgICAgICAgICAgY3VycmVudEZpbHRlcj17Y3VycmVudEZpbHRlcn1cbiAgICAgICAgICAgIG9uQ2xvc2U9e3RoaXMuX2Nsb3NlRmVhdHVyZUFjdGlvbn1cbiAgICAgICAgICAgIG9uRGVsZXRlRmVhdHVyZT17dGhpcy5fb25EZWxldGVTZWxlY3RlZEZlYXR1cmV9XG4gICAgICAgICAgICBvblRvZ2dsZUxheWVyPXt0aGlzLl9vblRvZ2dsZUxheWVyfVxuICAgICAgICAgICAgcG9zaXRpb249e2xhc3RQb3NpdGlvbn1cbiAgICAgICAgICAgIGF1dGg9e2F1dGh9XG4gICAgICAgICAgICBwcm9qZWN0PXtwcm9qZWN0fVxuICAgICAgICAgICAgbWFwU3RhdGU9e21hcFN0YXRlfVxuICAgICAgICAgIC8+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgPC9TdHlsZWRXcmFwcGVyPlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRWRpdG9yO1xuIl19