UNPKG

kepler.gl

Version:

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

322 lines (271 loc) 38.5 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.AddDataButtonFactory = AddDataButtonFactory; exports["default"] = void 0; 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 _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _propTypes = _interopRequireDefault(require("prop-types")); var _reactSortableHoc = require("react-sortable-hoc"); var _styledComponents = _interopRequireDefault(require("styled-components")); var _reselect = require("reselect"); var _reactIntl = require("react-intl"); var _dataUtils = require("../../utils/data-utils"); var _layerPanel = _interopRequireDefault(require("./layer-panel/layer-panel")); var _sourceDataCatalog = _interopRequireDefault(require("./common/source-data-catalog")); var _icons = require("../common/icons"); var _itemSelector = _interopRequireDefault(require("../common/item-selector/item-selector")); var _styledComponents2 = require("../common/styled-components"); var _defaultSettings = require("../../constants/default-settings"); function _templateObject() { var data = (0, _taggedTemplateLiteral2["default"])(["\n z-index: ", ";\n\n &.sorting {\n pointer-events: none;\n }\n\n &.sorting-layers .layer-panel__header {\n background-color: ", ";\n font-family: ", ";\n font-weight: ", ";\n font-size: ", ";\n line-height: ", ";\n *,\n *:before,\n *:after {\n box-sizing: border-box;\n }\n .layer__drag-handle {\n opacity: 1;\n color: ", ";\n }\n }\n"]); _templateObject = function _templateObject() { return data; }; return data; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var LayerBlendingSelector = function LayerBlendingSelector(_ref) { var layerBlending = _ref.layerBlending, updateLayerBlending = _ref.updateLayerBlending, intl = _ref.intl; var labeledLayerBlendings = Object.keys(_defaultSettings.LAYER_BLENDINGS).reduce(function (acc, current) { return _objectSpread({}, acc, (0, _defineProperty2["default"])({}, intl.formatMessage({ id: _defaultSettings.LAYER_BLENDINGS[current].label }), current)); }, {}); var onChange = (0, _react.useCallback)(function (blending) { return updateLayerBlending(labeledLayerBlendings[blending]); }, [updateLayerBlending, labeledLayerBlendings]); return _react["default"].createElement(_styledComponents2.SidePanelSection, null, _react["default"].createElement(_styledComponents2.PanelLabel, null, _react["default"].createElement(_reactIntl.FormattedMessage, { id: "layerBlending.title" })), _react["default"].createElement(_itemSelector["default"], { selectedItems: intl.formatMessage({ id: _defaultSettings.LAYER_BLENDINGS[layerBlending].label }), options: Object.keys(labeledLayerBlendings), multiSelect: false, searchable: false, onChange: onChange })); }; // make sure the element is always visible while is being dragged // item being dragged is appended in body, here to reset its global style var SortableStyledItem = _styledComponents["default"].div(_templateObject(), function (props) { return props.theme.dropdownWrapperZ + 1; }, function (props) { return props.theme.panelBackgroundHover; }, function (props) { return props.theme.fontFamily; }, function (props) { return props.theme.fontWeight; }, function (props) { return props.theme.fontSize; }, function (props) { return props.theme.lineHeight; }, function (props) { return props.theme.textColorHl; }); function AddDataButtonFactory() { var AddDataButton = function AddDataButton(_ref2) { var onClick = _ref2.onClick, isInactive = _ref2.isInactive; return _react["default"].createElement(_styledComponents2.Button, { className: "add-data-button", onClick: onClick, isInactive: !isInactive, width: "105px", secondary: true }, _react["default"].createElement(_icons.Add, { height: "12px" }), _react["default"].createElement(_reactIntl.FormattedMessage, { id: 'layerManager.addData' })); }; return AddDataButton; } LayerManagerFactory.deps = [AddDataButtonFactory, _layerPanel["default"], _sourceDataCatalog["default"]]; function LayerManagerFactory(AddDataButton, LayerPanel, SourceDataCatalog) { // By wrapping layer panel using a sortable element we don't have to implement the drag and drop logic into the panel itself; // Developers can provide any layer panel implementation and it will still be sortable var SortableItem = (0, _reactSortableHoc.sortableElement)(function (_ref3) { var children = _ref3.children, isSorting = _ref3.isSorting; return _react["default"].createElement(SortableStyledItem, { className: (0, _classnames["default"])('sortable-layer-items', { sorting: isSorting }) }, children); }); var SortableContainer = (0, _reactSortableHoc.sortableContainer)(function (_ref4) { var children = _ref4.children; return _react["default"].createElement("div", null, children); }); var LayerManager = /*#__PURE__*/ function (_Component) { (0, _inherits2["default"])(LayerManager, _Component); function LayerManager() { var _getPrototypeOf2; var _this; (0, _classCallCheck2["default"])(this, LayerManager); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = (0, _possibleConstructorReturn2["default"])(this, (_getPrototypeOf2 = (0, _getPrototypeOf3["default"])(LayerManager)).call.apply(_getPrototypeOf2, [this].concat(args))); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", { isSorting: false }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "layerClassSelector", function (props) { return props.layerClasses; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "layerTypeOptionsSelector", (0, _reselect.createSelector)(_this.layerClassSelector, function (layerClasses) { return Object.keys(layerClasses).map(function (key) { var layer = new layerClasses[key](); return { id: key, label: layer.name, icon: layer.layerIcon }; }); })); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_addEmptyNewLayer", function () { _this.props.addLayer(); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handleSort", function (_ref5) { var oldIndex = _ref5.oldIndex, newIndex = _ref5.newIndex; _this.props.updateLayerOrder((0, _dataUtils.arrayMove)(_this.props.layerOrder, oldIndex, newIndex)); _this.setState({ isSorting: false }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onSortStart", function () { _this.setState({ isSorting: true }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_updateBeforeSortStart", function (_ref6) { var index = _ref6.index; // if layer config is active, close it var _this$props = _this.props, layerOrder = _this$props.layerOrder, layers = _this$props.layers, layerConfigChange = _this$props.layerConfigChange; var layerIdx = layerOrder[index]; if (layers[layerIdx].config.isConfigActive) { layerConfigChange(layers[layerIdx], { isConfigActive: false }); } }); return _this; } (0, _createClass2["default"])(LayerManager, [{ key: "render", value: function render() { var _this2 = this; var _this$props2 = this.props, layers = _this$props2.layers, datasets = _this$props2.datasets, layerOrder = _this$props2.layerOrder, openModal = _this$props2.openModal, intl = _this$props2.intl; var defaultDataset = Object.keys(datasets)[0]; var layerTypeOptions = this.layerTypeOptionsSelector(this.props); var layerActions = { layerColorUIChange: this.props.layerColorUIChange, layerConfigChange: this.props.layerConfigChange, layerVisualChannelConfigChange: this.props.layerVisualChannelConfigChange, layerTypeChange: this.props.layerTypeChange, layerVisConfigChange: this.props.layerVisConfigChange, layerTextLabelChange: this.props.layerTextLabelChange, removeLayer: this.props.removeLayer }; var panelProps = { datasets: datasets, openModal: openModal, layerTypeOptions: layerTypeOptions }; return _react["default"].createElement("div", { className: "layer-manager" }, _react["default"].createElement(SourceDataCatalog, { datasets: datasets, showDatasetTable: this.props.showDatasetTable, removeDataset: this.props.removeDataset, showDeleteDataset: true }), _react["default"].createElement(AddDataButton, { onClick: this.props.showAddDataModal, isInactive: !defaultDataset }), _react["default"].createElement(_styledComponents2.SidePanelDivider, null), _react["default"].createElement(_styledComponents2.SidePanelSection, null, _react["default"].createElement(SortableContainer, { onSortEnd: this._handleSort, onSortStart: this._onSortStart, updateBeforeSortStart: this._updateBeforeSortStart, lockAxis: "y", helperClass: "sorting-layers", useDragHandle: true }, layerOrder.map(function (layerIdx, index) { return _react["default"].createElement(SortableItem, { key: "layer-".concat(layerIdx), index: index, isSorting: _this2.state.isSorting }, _react["default"].createElement(LayerPanel, (0, _extends2["default"])({}, panelProps, layerActions, { sortData: layerIdx, key: layers[layerIdx].id, idx: layerIdx, layer: layers[layerIdx] }))); }))), _react["default"].createElement(_styledComponents2.SidePanelSection, null, defaultDataset ? _react["default"].createElement(_styledComponents2.Button, { className: "add-layer-button", onClick: this._addEmptyNewLayer, width: "105px" }, _react["default"].createElement(_icons.Add, { height: "12px" }), _react["default"].createElement(_reactIntl.FormattedMessage, { id: 'layerManager.addLayer' })) : null), _react["default"].createElement(LayerBlendingSelector, { layerBlending: this.props.layerBlending, updateLayerBlending: this.props.updateLayerBlending, intl: intl })); } }]); return LayerManager; }(_react.Component); (0, _defineProperty2["default"])(LayerManager, "propTypes", { datasets: _propTypes["default"].object.isRequired, layerBlending: _propTypes["default"].string.isRequired, layerClasses: _propTypes["default"].object.isRequired, layers: _propTypes["default"].arrayOf(_propTypes["default"].any).isRequired, // functions addLayer: _propTypes["default"].func.isRequired, layerColorUIChange: _propTypes["default"].func.isRequired, layerConfigChange: _propTypes["default"].func.isRequired, layerTextLabelChange: _propTypes["default"].func.isRequired, layerVisualChannelConfigChange: _propTypes["default"].func.isRequired, layerTypeChange: _propTypes["default"].func.isRequired, layerVisConfigChange: _propTypes["default"].func.isRequired, openModal: _propTypes["default"].func.isRequired, removeLayer: _propTypes["default"].func.isRequired, removeDataset: _propTypes["default"].func.isRequired, showDatasetTable: _propTypes["default"].func.isRequired, updateLayerBlending: _propTypes["default"].func.isRequired, updateLayerOrder: _propTypes["default"].func.isRequired }); return (0, _reactIntl.injectIntl)(LayerManager); } var _default = LayerManagerFactory; exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvbGF5ZXItbWFuYWdlci5qcyJdLCJuYW1lcyI6WyJMYXllckJsZW5kaW5nU2VsZWN0b3IiLCJsYXllckJsZW5kaW5nIiwidXBkYXRlTGF5ZXJCbGVuZGluZyIsImludGwiLCJsYWJlbGVkTGF5ZXJCbGVuZGluZ3MiLCJPYmplY3QiLCJrZXlzIiwiTEFZRVJfQkxFTkRJTkdTIiwicmVkdWNlIiwiYWNjIiwiY3VycmVudCIsImZvcm1hdE1lc3NhZ2UiLCJpZCIsImxhYmVsIiwib25DaGFuZ2UiLCJibGVuZGluZyIsIlNvcnRhYmxlU3R5bGVkSXRlbSIsInN0eWxlZCIsImRpdiIsInByb3BzIiwidGhlbWUiLCJkcm9wZG93bldyYXBwZXJaIiwicGFuZWxCYWNrZ3JvdW5kSG92ZXIiLCJmb250RmFtaWx5IiwiZm9udFdlaWdodCIsImZvbnRTaXplIiwibGluZUhlaWdodCIsInRleHRDb2xvckhsIiwiQWRkRGF0YUJ1dHRvbkZhY3RvcnkiLCJBZGREYXRhQnV0dG9uIiwib25DbGljayIsImlzSW5hY3RpdmUiLCJMYXllck1hbmFnZXJGYWN0b3J5IiwiZGVwcyIsIkxheWVyUGFuZWxGYWN0b3J5IiwiU291cmNlRGF0YUNhdGFsb2dGYWN0b3J5IiwiTGF5ZXJQYW5lbCIsIlNvdXJjZURhdGFDYXRhbG9nIiwiU29ydGFibGVJdGVtIiwiY2hpbGRyZW4iLCJpc1NvcnRpbmciLCJzb3J0aW5nIiwiU29ydGFibGVDb250YWluZXIiLCJMYXllck1hbmFnZXIiLCJsYXllckNsYXNzZXMiLCJsYXllckNsYXNzU2VsZWN0b3IiLCJtYXAiLCJrZXkiLCJsYXllciIsIm5hbWUiLCJpY29uIiwibGF5ZXJJY29uIiwiYWRkTGF5ZXIiLCJvbGRJbmRleCIsIm5ld0luZGV4IiwidXBkYXRlTGF5ZXJPcmRlciIsImxheWVyT3JkZXIiLCJzZXRTdGF0ZSIsImluZGV4IiwibGF5ZXJzIiwibGF5ZXJDb25maWdDaGFuZ2UiLCJsYXllcklkeCIsImNvbmZpZyIsImlzQ29uZmlnQWN0aXZlIiwiZGF0YXNldHMiLCJvcGVuTW9kYWwiLCJkZWZhdWx0RGF0YXNldCIsImxheWVyVHlwZU9wdGlvbnMiLCJsYXllclR5cGVPcHRpb25zU2VsZWN0b3IiLCJsYXllckFjdGlvbnMiLCJsYXllckNvbG9yVUlDaGFuZ2UiLCJsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2UiLCJsYXllclR5cGVDaGFuZ2UiLCJsYXllclZpc0NvbmZpZ0NoYW5nZSIsImxheWVyVGV4dExhYmVsQ2hhbmdlIiwicmVtb3ZlTGF5ZXIiLCJwYW5lbFByb3BzIiwic2hvd0RhdGFzZXRUYWJsZSIsInJlbW92ZURhdGFzZXQiLCJzaG93QWRkRGF0YU1vZGFsIiwiX2hhbmRsZVNvcnQiLCJfb25Tb3J0U3RhcnQiLCJfdXBkYXRlQmVmb3JlU29ydFN0YXJ0Iiwic3RhdGUiLCJfYWRkRW1wdHlOZXdMYXllciIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsIm9iamVjdCIsImlzUmVxdWlyZWQiLCJzdHJpbmciLCJhcnJheU9mIiwiYW55IiwiZnVuYyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQU9BOzs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTUEscUJBQXFCLEdBQUcsU0FBeEJBLHFCQUF3QixPQUFnRDtBQUFBLE1BQTlDQyxhQUE4QyxRQUE5Q0EsYUFBOEM7QUFBQSxNQUEvQkMsbUJBQStCLFFBQS9CQSxtQkFBK0I7QUFBQSxNQUFWQyxJQUFVLFFBQVZBLElBQVU7QUFDNUUsTUFBTUMscUJBQXFCLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZQyxnQ0FBWixFQUE2QkMsTUFBN0IsQ0FDNUIsVUFBQ0MsR0FBRCxFQUFNQyxPQUFOO0FBQUEsNkJBQ0tELEdBREwsdUNBRUdOLElBQUksQ0FBQ1EsYUFBTCxDQUFtQjtBQUFDQyxNQUFBQSxFQUFFLEVBQUVMLGlDQUFnQkcsT0FBaEIsRUFBeUJHO0FBQTlCLEtBQW5CLENBRkgsRUFFOERILE9BRjlEO0FBQUEsR0FENEIsRUFLNUIsRUFMNEIsQ0FBOUI7QUFRQSxNQUFNSSxRQUFRLEdBQUcsd0JBQVksVUFBQUMsUUFBUTtBQUFBLFdBQUliLG1CQUFtQixDQUFDRSxxQkFBcUIsQ0FBQ1csUUFBRCxDQUF0QixDQUF2QjtBQUFBLEdBQXBCLEVBQThFLENBQzdGYixtQkFENkYsRUFFN0ZFLHFCQUY2RixDQUE5RSxDQUFqQjtBQUtBLFNBQ0UsZ0NBQUMsbUNBQUQsUUFDRSxnQ0FBQyw2QkFBRCxRQUNFLGdDQUFDLDJCQUFEO0FBQWtCLElBQUEsRUFBRSxFQUFDO0FBQXJCLElBREYsQ0FERixFQUlFLGdDQUFDLHdCQUFEO0FBQ0UsSUFBQSxhQUFhLEVBQUVELElBQUksQ0FBQ1EsYUFBTCxDQUFtQjtBQUFDQyxNQUFBQSxFQUFFLEVBQUVMLGlDQUFnQk4sYUFBaEIsRUFBK0JZO0FBQXBDLEtBQW5CLENBRGpCO0FBRUUsSUFBQSxPQUFPLEVBQUVSLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZRixxQkFBWixDQUZYO0FBR0UsSUFBQSxXQUFXLEVBQUUsS0FIZjtBQUlFLElBQUEsVUFBVSxFQUFFLEtBSmQ7QUFLRSxJQUFBLFFBQVEsRUFBRVU7QUFMWixJQUpGLENBREY7QUFjRCxDQTVCRCxDLENBOEJBO0FBQ0E7OztBQUNBLElBQU1FLGtCQUFrQixHQUFHQyw2QkFBT0MsR0FBVixvQkFDWCxVQUFBQyxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlDLGdCQUFaLEdBQStCLENBQW5DO0FBQUEsQ0FETSxFQVFBLFVBQUFGLEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUUsb0JBQWhCO0FBQUEsQ0FSTCxFQVNMLFVBQUFILEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUcsVUFBaEI7QUFBQSxDQVRBLEVBVUwsVUFBQUosS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZSSxVQUFoQjtBQUFBLENBVkEsRUFXUCxVQUFBTCxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlLLFFBQWhCO0FBQUEsQ0FYRSxFQVlMLFVBQUFOLEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWU0sVUFBaEI7QUFBQSxDQVpBLEVBb0JULFVBQUFQLEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWU8sV0FBaEI7QUFBQSxDQXBCSSxDQUF4Qjs7QUF5Qk8sU0FBU0Msb0JBQVQsR0FBZ0M7QUFDckMsTUFBTUMsYUFBYSxHQUFHLFNBQWhCQSxhQUFnQjtBQUFBLFFBQUVDLE9BQUYsU0FBRUEsT0FBRjtBQUFBLFFBQVdDLFVBQVgsU0FBV0EsVUFBWDtBQUFBLFdBQ3BCLGdDQUFDLHlCQUFEO0FBQ0UsTUFBQSxTQUFTLEVBQUMsaUJBRFo7QUFFRSxNQUFBLE9BQU8sRUFBRUQsT0FGWDtBQUdFLE1BQUEsVUFBVSxFQUFFLENBQUNDLFVBSGY7QUFJRSxNQUFBLEtBQUssRUFBQyxPQUpSO0FBS0UsTUFBQSxTQUFTO0FBTFgsT0FPRSxnQ0FBQyxVQUFEO0FBQUssTUFBQSxNQUFNLEVBQUM7QUFBWixNQVBGLEVBUUUsZ0NBQUMsMkJBQUQ7QUFBa0IsTUFBQSxFQUFFLEVBQUU7QUFBdEIsTUFSRixDQURvQjtBQUFBLEdBQXRCOztBQWFBLFNBQU9GLGFBQVA7QUFDRDs7QUFFREcsbUJBQW1CLENBQUNDLElBQXBCLEdBQTJCLENBQUNMLG9CQUFELEVBQXVCTSxzQkFBdkIsRUFBMENDLDZCQUExQyxDQUEzQjs7QUFFQSxTQUFTSCxtQkFBVCxDQUE2QkgsYUFBN0IsRUFBNENPLFVBQTVDLEVBQXdEQyxpQkFBeEQsRUFBMkU7QUFDekU7QUFDQTtBQUNBLE1BQU1DLFlBQVksR0FBRyx1Q0FBZ0IsaUJBQTJCO0FBQUEsUUFBekJDLFFBQXlCLFNBQXpCQSxRQUF5QjtBQUFBLFFBQWZDLFNBQWUsU0FBZkEsU0FBZTtBQUM5RCxXQUNFLGdDQUFDLGtCQUFEO0FBQW9CLE1BQUEsU0FBUyxFQUFFLDRCQUFXLHNCQUFYLEVBQW1DO0FBQUNDLFFBQUFBLE9BQU8sRUFBRUQ7QUFBVixPQUFuQztBQUEvQixPQUNHRCxRQURILENBREY7QUFLRCxHQU5vQixDQUFyQjtBQVFBLE1BQU1HLGlCQUFpQixHQUFHLHlDQUFrQixpQkFBZ0I7QUFBQSxRQUFkSCxRQUFjLFNBQWRBLFFBQWM7QUFDMUQsV0FBTyw2Q0FBTUEsUUFBTixDQUFQO0FBQ0QsR0FGeUIsQ0FBMUI7O0FBWHlFLE1BZW5FSSxZQWZtRTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBOztBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLGdHQW9DL0Q7QUFDTkgsUUFBQUEsU0FBUyxFQUFFO0FBREwsT0FwQytEO0FBQUEsNkdBd0NsRCxVQUFBckIsS0FBSztBQUFBLGVBQUlBLEtBQUssQ0FBQ3lCLFlBQVY7QUFBQSxPQXhDNkM7QUFBQSxtSEF5QzVDLDhCQUFlLE1BQUtDLGtCQUFwQixFQUF3QyxVQUFBRCxZQUFZO0FBQUEsZUFDN0V2QyxNQUFNLENBQUNDLElBQVAsQ0FBWXNDLFlBQVosRUFBMEJFLEdBQTFCLENBQThCLFVBQUFDLEdBQUcsRUFBSTtBQUNuQyxjQUFNQyxLQUFLLEdBQUcsSUFBSUosWUFBWSxDQUFDRyxHQUFELENBQWhCLEVBQWQ7QUFDQSxpQkFBTztBQUNMbkMsWUFBQUEsRUFBRSxFQUFFbUMsR0FEQztBQUVMbEMsWUFBQUEsS0FBSyxFQUFFbUMsS0FBSyxDQUFDQyxJQUZSO0FBR0xDLFlBQUFBLElBQUksRUFBRUYsS0FBSyxDQUFDRztBQUhQLFdBQVA7QUFLRCxTQVBELENBRDZFO0FBQUEsT0FBcEQsQ0F6QzRDO0FBQUEsNEdBb0RuRCxZQUFNO0FBQ3hCLGNBQUtoQyxLQUFMLENBQVdpQyxRQUFYO0FBQ0QsT0F0RHNFO0FBQUEsc0dBd0R6RCxpQkFBMEI7QUFBQSxZQUF4QkMsUUFBd0IsU0FBeEJBLFFBQXdCO0FBQUEsWUFBZEMsUUFBYyxTQUFkQSxRQUFjOztBQUN0QyxjQUFLbkMsS0FBTCxDQUFXb0MsZ0JBQVgsQ0FBNEIsMEJBQVUsTUFBS3BDLEtBQUwsQ0FBV3FDLFVBQXJCLEVBQWlDSCxRQUFqQyxFQUEyQ0MsUUFBM0MsQ0FBNUI7O0FBQ0EsY0FBS0csUUFBTCxDQUFjO0FBQUNqQixVQUFBQSxTQUFTLEVBQUU7QUFBWixTQUFkO0FBQ0QsT0EzRHNFO0FBQUEsdUdBNkR4RCxZQUFNO0FBQ25CLGNBQUtpQixRQUFMLENBQWM7QUFBQ2pCLFVBQUFBLFNBQVMsRUFBRTtBQUFaLFNBQWQ7QUFDRCxPQS9Ec0U7QUFBQSxpSEFpRTlDLGlCQUFhO0FBQUEsWUFBWGtCLEtBQVcsU0FBWEEsS0FBVztBQUNwQztBQURvQywwQkFFWSxNQUFLdkMsS0FGakI7QUFBQSxZQUU3QnFDLFVBRjZCLGVBRTdCQSxVQUY2QjtBQUFBLFlBRWpCRyxNQUZpQixlQUVqQkEsTUFGaUI7QUFBQSxZQUVUQyxpQkFGUyxlQUVUQSxpQkFGUztBQUdwQyxZQUFNQyxRQUFRLEdBQUdMLFVBQVUsQ0FBQ0UsS0FBRCxDQUEzQjs7QUFDQSxZQUFJQyxNQUFNLENBQUNFLFFBQUQsQ0FBTixDQUFpQkMsTUFBakIsQ0FBd0JDLGNBQTVCLEVBQTRDO0FBQzFDSCxVQUFBQSxpQkFBaUIsQ0FBQ0QsTUFBTSxDQUFDRSxRQUFELENBQVAsRUFBbUI7QUFBQ0UsWUFBQUEsY0FBYyxFQUFFO0FBQWpCLFdBQW5CLENBQWpCO0FBQ0Q7QUFDRixPQXhFc0U7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQSwrQkEwRTlEO0FBQUE7O0FBQUEsMkJBQ2lELEtBQUs1QyxLQUR0RDtBQUFBLFlBQ0F3QyxNQURBLGdCQUNBQSxNQURBO0FBQUEsWUFDUUssUUFEUixnQkFDUUEsUUFEUjtBQUFBLFlBQ2tCUixVQURsQixnQkFDa0JBLFVBRGxCO0FBQUEsWUFDOEJTLFNBRDlCLGdCQUM4QkEsU0FEOUI7QUFBQSxZQUN5QzlELElBRHpDLGdCQUN5Q0EsSUFEekM7QUFFUCxZQUFNK0QsY0FBYyxHQUFHN0QsTUFBTSxDQUFDQyxJQUFQLENBQVkwRCxRQUFaLEVBQXNCLENBQXRCLENBQXZCO0FBQ0EsWUFBTUcsZ0JBQWdCLEdBQUcsS0FBS0Msd0JBQUwsQ0FBOEIsS0FBS2pELEtBQW5DLENBQXpCO0FBRUEsWUFBTWtELFlBQVksR0FBRztBQUNuQkMsVUFBQUEsa0JBQWtCLEVBQUUsS0FBS25ELEtBQUwsQ0FBV21ELGtCQURaO0FBRW5CVixVQUFBQSxpQkFBaUIsRUFBRSxLQUFLekMsS0FBTCxDQUFXeUMsaUJBRlg7QUFHbkJXLFVBQUFBLDhCQUE4QixFQUFFLEtBQUtwRCxLQUFMLENBQVdvRCw4QkFIeEI7QUFJbkJDLFVBQUFBLGVBQWUsRUFBRSxLQUFLckQsS0FBTCxDQUFXcUQsZUFKVDtBQUtuQkMsVUFBQUEsb0JBQW9CLEVBQUUsS0FBS3RELEtBQUwsQ0FBV3NELG9CQUxkO0FBTW5CQyxVQUFBQSxvQkFBb0IsRUFBRSxLQUFLdkQsS0FBTCxDQUFXdUQsb0JBTmQ7QUFPbkJDLFVBQUFBLFdBQVcsRUFBRSxLQUFLeEQsS0FBTCxDQUFXd0Q7QUFQTCxTQUFyQjtBQVVBLFlBQU1DLFVBQVUsR0FBRztBQUNqQlosVUFBQUEsUUFBUSxFQUFSQSxRQURpQjtBQUVqQkMsVUFBQUEsU0FBUyxFQUFUQSxTQUZpQjtBQUdqQkUsVUFBQUEsZ0JBQWdCLEVBQWhCQTtBQUhpQixTQUFuQjtBQU1BLGVBQ0U7QUFBSyxVQUFBLFNBQVMsRUFBQztBQUFmLFdBQ0UsZ0NBQUMsaUJBQUQ7QUFDRSxVQUFBLFFBQVEsRUFBRUgsUUFEWjtBQUVFLFVBQUEsZ0JBQWdCLEVBQUUsS0FBSzdDLEtBQUwsQ0FBVzBELGdCQUYvQjtBQUdFLFVBQUEsYUFBYSxFQUFFLEtBQUsxRCxLQUFMLENBQVcyRCxhQUg1QjtBQUlFLFVBQUEsaUJBQWlCO0FBSm5CLFVBREYsRUFPRSxnQ0FBQyxhQUFEO0FBQWUsVUFBQSxPQUFPLEVBQUUsS0FBSzNELEtBQUwsQ0FBVzRELGdCQUFuQztBQUFxRCxVQUFBLFVBQVUsRUFBRSxDQUFDYjtBQUFsRSxVQVBGLEVBUUUsZ0NBQUMsbUNBQUQsT0FSRixFQVNFLGdDQUFDLG1DQUFELFFBQ0UsZ0NBQUMsaUJBQUQ7QUFDRSxVQUFBLFNBQVMsRUFBRSxLQUFLYyxXQURsQjtBQUVFLFVBQUEsV0FBVyxFQUFFLEtBQUtDLFlBRnBCO0FBR0UsVUFBQSxxQkFBcUIsRUFBRSxLQUFLQyxzQkFIOUI7QUFJRSxVQUFBLFFBQVEsRUFBQyxHQUpYO0FBS0UsVUFBQSxXQUFXLEVBQUMsZ0JBTGQ7QUFNRSxVQUFBLGFBQWE7QUFOZixXQVFHMUIsVUFBVSxDQUFDVixHQUFYLENBQWUsVUFBQ2UsUUFBRCxFQUFXSCxLQUFYO0FBQUEsaUJBQ2QsZ0NBQUMsWUFBRDtBQUNFLFlBQUEsR0FBRyxrQkFBV0csUUFBWCxDQURMO0FBRUUsWUFBQSxLQUFLLEVBQUVILEtBRlQ7QUFHRSxZQUFBLFNBQVMsRUFBRSxNQUFJLENBQUN5QixLQUFMLENBQVczQztBQUh4QixhQUtFLGdDQUFDLFVBQUQsZ0NBQ01vQyxVQUROLEVBRU1QLFlBRk47QUFHRSxZQUFBLFFBQVEsRUFBRVIsUUFIWjtBQUlFLFlBQUEsR0FBRyxFQUFFRixNQUFNLENBQUNFLFFBQUQsQ0FBTixDQUFpQmpELEVBSnhCO0FBS0UsWUFBQSxHQUFHLEVBQUVpRCxRQUxQO0FBTUUsWUFBQSxLQUFLLEVBQUVGLE1BQU0sQ0FBQ0UsUUFBRDtBQU5mLGFBTEYsQ0FEYztBQUFBLFNBQWYsQ0FSSCxDQURGLENBVEYsRUFvQ0UsZ0NBQUMsbUNBQUQsUUFDR0ssY0FBYyxHQUNiLGdDQUFDLHlCQUFEO0FBQVEsVUFBQSxTQUFTLEVBQUMsa0JBQWxCO0FBQXFDLFVBQUEsT0FBTyxFQUFFLEtBQUtrQixpQkFBbkQ7QUFBc0UsVUFBQSxLQUFLLEVBQUM7QUFBNUUsV0FDRSxnQ0FBQyxVQUFEO0FBQUssVUFBQSxNQUFNLEVBQUM7QUFBWixVQURGLEVBRUUsZ0NBQUMsMkJBQUQ7QUFBa0IsVUFBQSxFQUFFLEVBQUU7QUFBdEIsVUFGRixDQURhLEdBS1gsSUFOTixDQXBDRixFQTRDRSxnQ0FBQyxxQkFBRDtBQUNFLFVBQUEsYUFBYSxFQUFFLEtBQUtqRSxLQUFMLENBQVdsQixhQUQ1QjtBQUVFLFVBQUEsbUJBQW1CLEVBQUUsS0FBS2tCLEtBQUwsQ0FBV2pCLG1CQUZsQztBQUdFLFVBQUEsSUFBSSxFQUFFQztBQUhSLFVBNUNGLENBREY7QUFvREQ7QUFuSnNFO0FBQUE7QUFBQSxJQWU5Q2tGLGdCQWY4Qzs7QUFBQSxtQ0FlbkUxQyxZQWZtRSxlQWdCcEQ7QUFDakJxQixJQUFBQSxRQUFRLEVBQUVzQixzQkFBVUMsTUFBVixDQUFpQkMsVUFEVjtBQUVqQnZGLElBQUFBLGFBQWEsRUFBRXFGLHNCQUFVRyxNQUFWLENBQWlCRCxVQUZmO0FBR2pCNUMsSUFBQUEsWUFBWSxFQUFFMEMsc0JBQVVDLE1BQVYsQ0FBaUJDLFVBSGQ7QUFJakI3QixJQUFBQSxNQUFNLEVBQUUyQixzQkFBVUksT0FBVixDQUFrQkosc0JBQVVLLEdBQTVCLEVBQWlDSCxVQUp4QjtBQUtqQjtBQUNBcEMsSUFBQUEsUUFBUSxFQUFFa0Msc0JBQVVNLElBQVYsQ0FBZUosVUFOUjtBQU9qQmxCLElBQUFBLGtCQUFrQixFQUFFZ0Isc0JBQVVNLElBQVYsQ0FBZUosVUFQbEI7QUFRakI1QixJQUFBQSxpQkFBaUIsRUFBRTBCLHNCQUFVTSxJQUFWLENBQWVKLFVBUmpCO0FBU2pCZCxJQUFBQSxvQkFBb0IsRUFBRVksc0JBQVVNLElBQVYsQ0FBZUosVUFUcEI7QUFVakJqQixJQUFBQSw4QkFBOEIsRUFBRWUsc0JBQVVNLElBQVYsQ0FBZUosVUFWOUI7QUFXakJoQixJQUFBQSxlQUFlLEVBQUVjLHNCQUFVTSxJQUFWLENBQWVKLFVBWGY7QUFZakJmLElBQUFBLG9CQUFvQixFQUFFYSxzQkFBVU0sSUFBVixDQUFlSixVQVpwQjtBQWFqQnZCLElBQUFBLFNBQVMsRUFBRXFCLHNCQUFVTSxJQUFWLENBQWVKLFVBYlQ7QUFjakJiLElBQUFBLFdBQVcsRUFBRVcsc0JBQVVNLElBQVYsQ0FBZUosVUFkWDtBQWVqQlYsSUFBQUEsYUFBYSxFQUFFUSxzQkFBVU0sSUFBVixDQUFlSixVQWZiO0FBZ0JqQlgsSUFBQUEsZ0JBQWdCLEVBQUVTLHNCQUFVTSxJQUFWLENBQWVKLFVBaEJoQjtBQWlCakJ0RixJQUFBQSxtQkFBbUIsRUFBRW9GLHNCQUFVTSxJQUFWLENBQWVKLFVBakJuQjtBQWtCakJqQyxJQUFBQSxnQkFBZ0IsRUFBRStCLHNCQUFVTSxJQUFWLENBQWVKO0FBbEJoQixHQWhCb0Q7QUFxSnpFLFNBQU8sMkJBQVc3QyxZQUFYLENBQVA7QUFDRDs7ZUFFY1gsbUIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjAgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnQsIHVzZUNhbGxiYWNrfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcblxuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7c29ydGFibGVDb250YWluZXIsIHNvcnRhYmxlRWxlbWVudH0gZnJvbSAncmVhY3Qtc29ydGFibGUtaG9jJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtjcmVhdGVTZWxlY3Rvcn0gZnJvbSAncmVzZWxlY3QnO1xuaW1wb3J0IHtGb3JtYXR0ZWRNZXNzYWdlLCBpbmplY3RJbnRsfSBmcm9tICdyZWFjdC1pbnRsJztcbmltcG9ydCB7YXJyYXlNb3ZlfSBmcm9tICd1dGlscy9kYXRhLXV0aWxzJztcblxuaW1wb3J0IExheWVyUGFuZWxGYWN0b3J5IGZyb20gJy4vbGF5ZXItcGFuZWwvbGF5ZXItcGFuZWwnO1xuaW1wb3J0IFNvdXJjZURhdGFDYXRhbG9nRmFjdG9yeSBmcm9tICcuL2NvbW1vbi9zb3VyY2UtZGF0YS1jYXRhbG9nJztcbmltcG9ydCB7QWRkfSBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9pY29ucyc7XG5pbXBvcnQgSXRlbVNlbGVjdG9yIGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2l0ZW0tc2VsZWN0b3IvaXRlbS1zZWxlY3Rvcic7XG5pbXBvcnQge1xuICBCdXR0b24sXG4gIFBhbmVsTGFiZWwsXG4gIFNpZGVQYW5lbERpdmlkZXIsXG4gIFNpZGVQYW5lbFNlY3Rpb25cbn0gZnJvbSAnY29tcG9uZW50cy9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuXG5pbXBvcnQge0xBWUVSX0JMRU5ESU5HU30gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuXG5jb25zdCBMYXllckJsZW5kaW5nU2VsZWN0b3IgPSAoe2xheWVyQmxlbmRpbmcsIHVwZGF0ZUxheWVyQmxlbmRpbmcsIGludGx9KSA9PiB7XG4gIGNvbnN0IGxhYmVsZWRMYXllckJsZW5kaW5ncyA9IE9iamVjdC5rZXlzKExBWUVSX0JMRU5ESU5HUykucmVkdWNlKFxuICAgIChhY2MsIGN1cnJlbnQpID0+ICh7XG4gICAgICAuLi5hY2MsXG4gICAgICBbaW50bC5mb3JtYXRNZXNzYWdlKHtpZDogTEFZRVJfQkxFTkRJTkdTW2N1cnJlbnRdLmxhYmVsfSldOiBjdXJyZW50XG4gICAgfSksXG4gICAge31cbiAgKTtcblxuICBjb25zdCBvbkNoYW5nZSA9IHVzZUNhbGxiYWNrKGJsZW5kaW5nID0+IHVwZGF0ZUxheWVyQmxlbmRpbmcobGFiZWxlZExheWVyQmxlbmRpbmdzW2JsZW5kaW5nXSksIFtcbiAgICB1cGRhdGVMYXllckJsZW5kaW5nLFxuICAgIGxhYmVsZWRMYXllckJsZW5kaW5nc1xuICBdKTtcblxuICByZXR1cm4gKFxuICAgIDxTaWRlUGFuZWxTZWN0aW9uPlxuICAgICAgPFBhbmVsTGFiZWw+XG4gICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPVwibGF5ZXJCbGVuZGluZy50aXRsZVwiIC8+XG4gICAgICA8L1BhbmVsTGFiZWw+XG4gICAgICA8SXRlbVNlbGVjdG9yXG4gICAgICAgIHNlbGVjdGVkSXRlbXM9e2ludGwuZm9ybWF0TWVzc2FnZSh7aWQ6IExBWUVSX0JMRU5ESU5HU1tsYXllckJsZW5kaW5nXS5sYWJlbH0pfVxuICAgICAgICBvcHRpb25zPXtPYmplY3Qua2V5cyhsYWJlbGVkTGF5ZXJCbGVuZGluZ3MpfVxuICAgICAgICBtdWx0aVNlbGVjdD17ZmFsc2V9XG4gICAgICAgIHNlYXJjaGFibGU9e2ZhbHNlfVxuICAgICAgICBvbkNoYW5nZT17b25DaGFuZ2V9XG4gICAgICAvPlxuICAgIDwvU2lkZVBhbmVsU2VjdGlvbj5cbiAgKTtcbn07XG5cbi8vIG1ha2Ugc3VyZSB0aGUgZWxlbWVudCBpcyBhbHdheXMgdmlzaWJsZSB3aGlsZSBpcyBiZWluZyBkcmFnZ2VkXG4vLyBpdGVtIGJlaW5nIGRyYWdnZWQgaXMgYXBwZW5kZWQgaW4gYm9keSwgaGVyZSB0byByZXNldCBpdHMgZ2xvYmFsIHN0eWxlXG5jb25zdCBTb3J0YWJsZVN0eWxlZEl0ZW0gPSBzdHlsZWQuZGl2YFxuICB6LWluZGV4OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmRyb3Bkb3duV3JhcHBlclogKyAxfTtcblxuICAmLnNvcnRpbmcge1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB9XG5cbiAgJi5zb3J0aW5nLWxheWVycyAubGF5ZXItcGFuZWxfX2hlYWRlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEJhY2tncm91bmRIb3Zlcn07XG4gICAgZm9udC1mYW1pbHk6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZm9udEZhbWlseX07XG4gICAgZm9udC13ZWlnaHQ6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZm9udFdlaWdodH07XG4gICAgZm9udC1zaXplOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmZvbnRTaXplfTtcbiAgICBsaW5lLWhlaWdodDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5saW5lSGVpZ2h0fTtcbiAgICAqLFxuICAgICo6YmVmb3JlLFxuICAgICo6YWZ0ZXIge1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG4gICAgLmxheWVyX19kcmFnLWhhbmRsZSB7XG4gICAgICBvcGFjaXR5OiAxO1xuICAgICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9ySGx9O1xuICAgIH1cbiAgfVxuYDtcblxuZXhwb3J0IGZ1bmN0aW9uIEFkZERhdGFCdXR0b25GYWN0b3J5KCkge1xuICBjb25zdCBBZGREYXRhQnV0dG9uID0gKHtvbkNsaWNrLCBpc0luYWN0aXZlfSkgPT4gKFxuICAgIDxCdXR0b25cbiAgICAgIGNsYXNzTmFtZT1cImFkZC1kYXRhLWJ1dHRvblwiXG4gICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgaXNJbmFjdGl2ZT17IWlzSW5hY3RpdmV9XG4gICAgICB3aWR0aD1cIjEwNXB4XCJcbiAgICAgIHNlY29uZGFyeVxuICAgID5cbiAgICAgIDxBZGQgaGVpZ2h0PVwiMTJweFwiIC8+XG4gICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17J2xheWVyTWFuYWdlci5hZGREYXRhJ30gLz5cbiAgICA8L0J1dHRvbj5cbiAgKTtcblxuICByZXR1cm4gQWRkRGF0YUJ1dHRvbjtcbn1cblxuTGF5ZXJNYW5hZ2VyRmFjdG9yeS5kZXBzID0gW0FkZERhdGFCdXR0b25GYWN0b3J5LCBMYXllclBhbmVsRmFjdG9yeSwgU291cmNlRGF0YUNhdGFsb2dGYWN0b3J5XTtcblxuZnVuY3Rpb24gTGF5ZXJNYW5hZ2VyRmFjdG9yeShBZGREYXRhQnV0dG9uLCBMYXllclBhbmVsLCBTb3VyY2VEYXRhQ2F0YWxvZykge1xuICAvLyBCeSB3cmFwcGluZyBsYXllciBwYW5lbCB1c2luZyBhIHNvcnRhYmxlIGVsZW1lbnQgd2UgZG9uJ3QgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIGRyYWcgYW5kIGRyb3AgbG9naWMgaW50byB0aGUgcGFuZWwgaXRzZWxmO1xuICAvLyBEZXZlbG9wZXJzIGNhbiBwcm92aWRlIGFueSBsYXllciBwYW5lbCBpbXBsZW1lbnRhdGlvbiBhbmQgaXQgd2lsbCBzdGlsbCBiZSBzb3J0YWJsZVxuICBjb25zdCBTb3J0YWJsZUl0ZW0gPSBzb3J0YWJsZUVsZW1lbnQoKHtjaGlsZHJlbiwgaXNTb3J0aW5nfSkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICA8U29ydGFibGVTdHlsZWRJdGVtIGNsYXNzTmFtZT17Y2xhc3NuYW1lcygnc29ydGFibGUtbGF5ZXItaXRlbXMnLCB7c29ydGluZzogaXNTb3J0aW5nfSl9PlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICA8L1NvcnRhYmxlU3R5bGVkSXRlbT5cbiAgICApO1xuICB9KTtcblxuICBjb25zdCBTb3J0YWJsZUNvbnRhaW5lciA9IHNvcnRhYmxlQ29udGFpbmVyKCh7Y2hpbGRyZW59KSA9PiB7XG4gICAgcmV0dXJuIDxkaXY+e2NoaWxkcmVufTwvZGl2PjtcbiAgfSk7XG5cbiAgY2xhc3MgTGF5ZXJNYW5hZ2VyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgZGF0YXNldHM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICAgIGxheWVyQmxlbmRpbmc6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAgIGxheWVyQ2xhc3NlczogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgICAgbGF5ZXJzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuYW55KS5pc1JlcXVpcmVkLFxuICAgICAgLy8gZnVuY3Rpb25zXG4gICAgICBhZGRMYXllcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIGxheWVyQ29sb3JVSUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIGxheWVyQ29uZmlnQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgbGF5ZXJUZXh0TGFiZWxDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICBsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICBsYXllclR5cGVDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICBsYXllclZpc0NvbmZpZ0NoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIG9wZW5Nb2RhbDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIHJlbW92ZUxheWVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgcmVtb3ZlRGF0YXNldDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIHNob3dEYXRhc2V0VGFibGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICB1cGRhdGVMYXllckJsZW5kaW5nOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgdXBkYXRlTGF5ZXJPcmRlcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxuICAgIH07XG4gICAgc3RhdGUgPSB7XG4gICAgICBpc1NvcnRpbmc6IGZhbHNlXG4gICAgfTtcblxuICAgIGxheWVyQ2xhc3NTZWxlY3RvciA9IHByb3BzID0+IHByb3BzLmxheWVyQ2xhc3NlcztcbiAgICBsYXllclR5cGVPcHRpb25zU2VsZWN0b3IgPSBjcmVhdGVTZWxlY3Rvcih0aGlzLmxheWVyQ2xhc3NTZWxlY3RvciwgbGF5ZXJDbGFzc2VzID0+XG4gICAgICBPYmplY3Qua2V5cyhsYXllckNsYXNzZXMpLm1hcChrZXkgPT4ge1xuICAgICAgICBjb25zdCBsYXllciA9IG5ldyBsYXllckNsYXNzZXNba2V5XSgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlkOiBrZXksXG4gICAgICAgICAgbGFiZWw6IGxheWVyLm5hbWUsXG4gICAgICAgICAgaWNvbjogbGF5ZXIubGF5ZXJJY29uXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBfYWRkRW1wdHlOZXdMYXllciA9ICgpID0+IHtcbiAgICAgIHRoaXMucHJvcHMuYWRkTGF5ZXIoKTtcbiAgICB9O1xuXG4gICAgX2hhbmRsZVNvcnQgPSAoe29sZEluZGV4LCBuZXdJbmRleH0pID0+IHtcbiAgICAgIHRoaXMucHJvcHMudXBkYXRlTGF5ZXJPcmRlcihhcnJheU1vdmUodGhpcy5wcm9wcy5sYXllck9yZGVyLCBvbGRJbmRleCwgbmV3SW5kZXgpKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe2lzU29ydGluZzogZmFsc2V9KTtcbiAgICB9O1xuXG4gICAgX29uU29ydFN0YXJ0ID0gKCkgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7aXNTb3J0aW5nOiB0cnVlfSk7XG4gICAgfTtcblxuICAgIF91cGRhdGVCZWZvcmVTb3J0U3RhcnQgPSAoe2luZGV4fSkgPT4ge1xuICAgICAgLy8gaWYgbGF5ZXIgY29uZmlnIGlzIGFjdGl2ZSwgY2xvc2UgaXRcbiAgICAgIGNvbnN0IHtsYXllck9yZGVyLCBsYXllcnMsIGxheWVyQ29uZmlnQ2hhbmdlfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCBsYXllcklkeCA9IGxheWVyT3JkZXJbaW5kZXhdO1xuICAgICAgaWYgKGxheWVyc1tsYXllcklkeF0uY29uZmlnLmlzQ29uZmlnQWN0aXZlKSB7XG4gICAgICAgIGxheWVyQ29uZmlnQ2hhbmdlKGxheWVyc1tsYXllcklkeF0sIHtpc0NvbmZpZ0FjdGl2ZTogZmFsc2V9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge2xheWVycywgZGF0YXNldHMsIGxheWVyT3JkZXIsIG9wZW5Nb2RhbCwgaW50bH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgZGVmYXVsdERhdGFzZXQgPSBPYmplY3Qua2V5cyhkYXRhc2V0cylbMF07XG4gICAgICBjb25zdCBsYXllclR5cGVPcHRpb25zID0gdGhpcy5sYXllclR5cGVPcHRpb25zU2VsZWN0b3IodGhpcy5wcm9wcyk7XG5cbiAgICAgIGNvbnN0IGxheWVyQWN0aW9ucyA9IHtcbiAgICAgICAgbGF5ZXJDb2xvclVJQ2hhbmdlOiB0aGlzLnByb3BzLmxheWVyQ29sb3JVSUNoYW5nZSxcbiAgICAgICAgbGF5ZXJDb25maWdDaGFuZ2U6IHRoaXMucHJvcHMubGF5ZXJDb25maWdDaGFuZ2UsXG4gICAgICAgIGxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZTogdGhpcy5wcm9wcy5sYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2UsXG4gICAgICAgIGxheWVyVHlwZUNoYW5nZTogdGhpcy5wcm9wcy5sYXllclR5cGVDaGFuZ2UsXG4gICAgICAgIGxheWVyVmlzQ29uZmlnQ2hhbmdlOiB0aGlzLnByb3BzLmxheWVyVmlzQ29uZmlnQ2hhbmdlLFxuICAgICAgICBsYXllclRleHRMYWJlbENoYW5nZTogdGhpcy5wcm9wcy5sYXllclRleHRMYWJlbENoYW5nZSxcbiAgICAgICAgcmVtb3ZlTGF5ZXI6IHRoaXMucHJvcHMucmVtb3ZlTGF5ZXJcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHBhbmVsUHJvcHMgPSB7XG4gICAgICAgIGRhdGFzZXRzLFxuICAgICAgICBvcGVuTW9kYWwsXG4gICAgICAgIGxheWVyVHlwZU9wdGlvbnNcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGF5ZXItbWFuYWdlclwiPlxuICAgICAgICAgIDxTb3VyY2VEYXRhQ2F0YWxvZ1xuICAgICAgICAgICAgZGF0YXNldHM9e2RhdGFzZXRzfVxuICAgICAgICAgICAgc2hvd0RhdGFzZXRUYWJsZT17dGhpcy5wcm9wcy5zaG93RGF0YXNldFRhYmxlfVxuICAgICAgICAgICAgcmVtb3ZlRGF0YXNldD17dGhpcy5wcm9wcy5yZW1vdmVEYXRhc2V0fVxuICAgICAgICAgICAgc2hvd0RlbGV0ZURhdGFzZXRcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxBZGREYXRhQnV0dG9uIG9uQ2xpY2s9e3RoaXMucHJvcHMuc2hvd0FkZERhdGFNb2RhbH0gaXNJbmFjdGl2ZT17IWRlZmF1bHREYXRhc2V0fSAvPlxuICAgICAgICAgIDxTaWRlUGFuZWxEaXZpZGVyIC8+XG4gICAgICAgICAgPFNpZGVQYW5lbFNlY3Rpb24+XG4gICAgICAgICAgICA8U29ydGFibGVDb250YWluZXJcbiAgICAgICAgICAgICAgb25Tb3J0RW5kPXt0aGlzLl9oYW5kbGVTb3J0fVxuICAgICAgICAgICAgICBvblNvcnRTdGFydD17dGhpcy5fb25Tb3J0U3RhcnR9XG4gICAgICAgICAgICAgIHVwZGF0ZUJlZm9yZVNvcnRTdGFydD17dGhpcy5fdXBkYXRlQmVmb3JlU29ydFN0YXJ0fVxuICAgICAgICAgICAgICBsb2NrQXhpcz1cInlcIlxuICAgICAgICAgICAgICBoZWxwZXJDbGFzcz1cInNvcnRpbmctbGF5ZXJzXCJcbiAgICAgICAgICAgICAgdXNlRHJhZ0hhbmRsZVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7bGF5ZXJPcmRlci5tYXAoKGxheWVySWR4LCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgIDxTb3J0YWJsZUl0ZW1cbiAgICAgICAgICAgICAgICAgIGtleT17YGxheWVyLSR7bGF5ZXJJZHh9YH1cbiAgICAgICAgICAgICAgICAgIGluZGV4PXtpbmRleH1cbiAgICAgICAgICAgICAgICAgIGlzU29ydGluZz17dGhpcy5zdGF0ZS5pc1NvcnRpbmd9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPExheWVyUGFuZWxcbiAgICAgICAgICAgICAgICAgICAgey4uLnBhbmVsUHJvcHN9XG4gICAgICAgICAgICAgICAgICAgIHsuLi5sYXllckFjdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgIHNvcnREYXRhPXtsYXllcklkeH1cbiAgICAgICAgICAgICAgICAgICAga2V5PXtsYXllcnNbbGF5ZXJJZHhdLmlkfVxuICAgICAgICAgICAgICAgICAgICBpZHg9e2xheWVySWR4fVxuICAgICAgICAgICAgICAgICAgICBsYXllcj17bGF5ZXJzW2xheWVySWR4XX1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9Tb3J0YWJsZUl0ZW0+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9Tb3J0YWJsZUNvbnRhaW5lcj5cbiAgICAgICAgICA8L1NpZGVQYW5lbFNlY3Rpb24+XG4gICAgICAgICAgPFNpZGVQYW5lbFNlY3Rpb24+XG4gICAgICAgICAgICB7ZGVmYXVsdERhdGFzZXQgPyAoXG4gICAgICAgICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPVwiYWRkLWxheWVyLWJ1dHRvblwiIG9uQ2xpY2s9e3RoaXMuX2FkZEVtcHR5TmV3TGF5ZXJ9IHdpZHRoPVwiMTA1cHhcIj5cbiAgICAgICAgICAgICAgICA8QWRkIGhlaWdodD1cIjEycHhcIiAvPlxuICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXsnbGF5ZXJNYW5hZ2VyLmFkZExheWVyJ30gLz5cbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICA8L1NpZGVQYW5lbFNlY3Rpb24+XG4gICAgICAgICAgPExheWVyQmxlbmRpbmdTZWxlY3RvclxuICAgICAgICAgICAgbGF5ZXJCbGVuZGluZz17dGhpcy5wcm9wcy5sYXllckJsZW5kaW5nfVxuICAgICAgICAgICAgdXBkYXRlTGF5ZXJCbGVuZGluZz17dGhpcy5wcm9wcy51cGRhdGVMYXllckJsZW5kaW5nfVxuICAgICAgICAgICAgaW50bD17aW50bH1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbmplY3RJbnRsKExheWVyTWFuYWdlcik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IExheWVyTWFuYWdlckZhY3Rvcnk7XG4iXX0=