UNPKG

kepler.gl

Version:

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

172 lines (170 loc) 28.9 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 _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react")); var _styledComponents = _interopRequireDefault(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/styled-components")); var _classnames3 = _interopRequireDefault(require("classnames")); var _sortable = require("@dnd-kit/sortable"); var _utilities = require("@dnd-kit/utilities"); var _layerPanel = _interopRequireDefault(require("./layer-panel")); var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/utils/src"); var _src2 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/constants/src"); var _dndLayerItems = require("../../common/dnd-layer-items"); var _templateObject, _templateObject2; // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project 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; } // 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 Container = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n gap: 8px;\n"]))); var SortableStyledItem = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n transition: ", ";\n transform: ", ";\n &.sorting {\n opacity: 0.3;\n pointer-events: none;\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"])), function (props) { return props.$transition; }, function (props) { return props.$transform; }, 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; }); var INITIAL_LAYERS_TO_SHOW = []; LayerListFactory.deps = [_layerPanel["default"]]; function LayerListFactory(LayerPanel) { // 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 = function SortableItem(_ref) { var layer = _ref.layer, idx = _ref.idx, panelProps = _ref.panelProps, layerActions = _ref.layerActions, disabled = _ref.disabled; var _useSortable = (0, _sortable.useSortable)({ id: layer.id, data: { type: _dndLayerItems.SORTABLE_LAYER_TYPE, parent: _dndLayerItems.SORTABLE_SIDE_PANEL_TYPE }, disabled: disabled }), attributes = _useSortable.attributes, listeners = _useSortable.listeners, setNodeRef = _useSortable.setNodeRef, isDragging = _useSortable.isDragging, transform = _useSortable.transform, transition = _useSortable.transition; return /*#__PURE__*/_react["default"].createElement(SortableStyledItem, (0, _extends2["default"])({ ref: setNodeRef, className: (0, _classnames3["default"])((0, _defineProperty2["default"])({}, _src2.dataTestIds.sortableLayerItem, !disabled), (0, _defineProperty2["default"])({}, _src2.dataTestIds.staticLayerItem, disabled), { sorting: isDragging }), "data-testid": disabled ? _src2.dataTestIds.staticLayerItem : _src2.dataTestIds.sortableLayerItem, $transform: _utilities.CSS.Transform.toString(transform), $transition: transition }, attributes), /*#__PURE__*/_react["default"].createElement(LayerPanel, (0, _extends2["default"])({}, panelProps, layerActions, { key: layer.id, idx: idx, layer: layer, listeners: listeners, isDraggable: !disabled }))); }; var LayerList = function LayerList(props) { var layers = props.layers, datasets = props.datasets, layerOrder = props.layerOrder, uiStateActions = props.uiStateActions, visStateActions = props.visStateActions, mapStateActions = props.mapStateActions, layerClasses = props.layerClasses, _props$isSortable = props.isSortable, isSortable = _props$isSortable === void 0 ? true : _props$isSortable, splitMap = props.splitMap; var openModal = uiStateActions.toggleModal; var layersToShow = (0, _react.useMemo)(function () { return layerOrder.reduce(function (acc, layerId) { var layer = (0, _src.findById)(layerId)(layers.filter(Boolean)); if (!layer) { return acc; } return !layer.config.hidden ? [].concat((0, _toConsumableArray2["default"])(acc), [layer]) : acc; }, INITIAL_LAYERS_TO_SHOW); }, [layers, layerOrder]); var sidePanelDndItems = (0, _react.useMemo)(function () { return layersToShow.map(function (_ref2) { var id = _ref2.id; return id; }); }, [layersToShow]); var layerTypeOptions = (0, _react.useMemo)(function () { return Object.keys(layerClasses).map(function (key) { var layer = new layerClasses[key]({ dataId: '' }); return { id: key, label: layer.name, icon: layer.layerIcon, requireData: layer.requireData }; }); }, [layerClasses]); var layerActions = (0, _react.useMemo)(function () { return { layerColorUIChange: visStateActions.layerColorUIChange, layerConfigChange: visStateActions.layerConfigChange, layerVisualChannelConfigChange: visStateActions.layerVisualChannelConfigChange, layerToggleVisibility: visStateActions.layerToggleVisibility, layerTypeChange: visStateActions.layerTypeChange, layerVisConfigChange: visStateActions.layerVisConfigChange, layerTextLabelChange: visStateActions.layerTextLabelChange, removeLayer: visStateActions.removeLayer, zoomToLayer: mapStateActions.fitBounds, duplicateLayer: visStateActions.duplicateLayer, layerSetIsValid: visStateActions.layerSetIsValid }; }, [visStateActions, mapStateActions]); var panelProps = (0, _react.useMemo)(function () { return { datasets: datasets, openModal: openModal, layerTypeOptions: layerTypeOptions, splitMap: splitMap }; }, [datasets, openModal, layerTypeOptions, splitMap]); return /*#__PURE__*/_react["default"].createElement(Container, null, /*#__PURE__*/_react["default"].createElement(_sortable.SortableContext, { id: _dndLayerItems.SORTABLE_SIDE_PANEL_TYPE, items: sidePanelDndItems, strategy: _sortable.verticalListSortingStrategy, disabled: !isSortable }, layersToShow.map(function (layer) { return /*#__PURE__*/_react["default"].createElement(SortableItem, { key: layer.id, layer: layer, idx: layers.findIndex(function (l) { return (l === null || l === void 0 ? void 0 : l.id) === layer.id; }), panelProps: panelProps, layerActions: layerActions, disabled: !isSortable }); }))); }; return LayerList; } var _default = exports["default"] = LayerListFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY2xhc3NuYW1lczMiLCJfc29ydGFibGUiLCJfdXRpbGl0aWVzIiwiX2xheWVyUGFuZWwiLCJfc3JjIiwiX3NyYzIiLCJfZG5kTGF5ZXJJdGVtcyIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJDb250YWluZXIiLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsIlNvcnRhYmxlU3R5bGVkSXRlbSIsInByb3BzIiwiJHRyYW5zaXRpb24iLCIkdHJhbnNmb3JtIiwidGhlbWUiLCJwYW5lbEJhY2tncm91bmRIb3ZlciIsImZvbnRGYW1pbHkiLCJmb250V2VpZ2h0IiwiZm9udFNpemUiLCJsaW5lSGVpZ2h0IiwidGV4dENvbG9ySGwiLCJJTklUSUFMX0xBWUVSU19UT19TSE9XIiwiTGF5ZXJMaXN0RmFjdG9yeSIsImRlcHMiLCJMYXllclBhbmVsRmFjdG9yeSIsIkxheWVyUGFuZWwiLCJTb3J0YWJsZUl0ZW0iLCJfcmVmIiwibGF5ZXIiLCJpZHgiLCJwYW5lbFByb3BzIiwibGF5ZXJBY3Rpb25zIiwiZGlzYWJsZWQiLCJfdXNlU29ydGFibGUiLCJ1c2VTb3J0YWJsZSIsImlkIiwiZGF0YSIsInR5cGUiLCJTT1JUQUJMRV9MQVlFUl9UWVBFIiwicGFyZW50IiwiU09SVEFCTEVfU0lERV9QQU5FTF9UWVBFIiwiYXR0cmlidXRlcyIsImxpc3RlbmVycyIsInNldE5vZGVSZWYiLCJpc0RyYWdnaW5nIiwidHJhbnNmb3JtIiwidHJhbnNpdGlvbiIsImNyZWF0ZUVsZW1lbnQiLCJfZXh0ZW5kczIiLCJyZWYiLCJjbGFzc05hbWUiLCJjbGFzc25hbWVzIiwiX2RlZmluZVByb3BlcnR5MiIsImRhdGFUZXN0SWRzIiwic29ydGFibGVMYXllckl0ZW0iLCJzdGF0aWNMYXllckl0ZW0iLCJzb3J0aW5nIiwiQ1NTIiwiVHJhbnNmb3JtIiwidG9TdHJpbmciLCJrZXkiLCJpc0RyYWdnYWJsZSIsIkxheWVyTGlzdCIsImxheWVycyIsImRhdGFzZXRzIiwibGF5ZXJPcmRlciIsInVpU3RhdGVBY3Rpb25zIiwidmlzU3RhdGVBY3Rpb25zIiwibWFwU3RhdGVBY3Rpb25zIiwibGF5ZXJDbGFzc2VzIiwiX3Byb3BzJGlzU29ydGFibGUiLCJpc1NvcnRhYmxlIiwic3BsaXRNYXAiLCJvcGVuTW9kYWwiLCJ0b2dnbGVNb2RhbCIsImxheWVyc1RvU2hvdyIsInVzZU1lbW8iLCJyZWR1Y2UiLCJhY2MiLCJsYXllcklkIiwiZmluZEJ5SWQiLCJmaWx0ZXIiLCJCb29sZWFuIiwiY29uZmlnIiwiaGlkZGVuIiwiY29uY2F0IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsInNpZGVQYW5lbERuZEl0ZW1zIiwibWFwIiwiX3JlZjIiLCJsYXllclR5cGVPcHRpb25zIiwia2V5cyIsImRhdGFJZCIsImxhYmVsIiwibmFtZSIsImljb24iLCJsYXllckljb24iLCJyZXF1aXJlRGF0YSIsImxheWVyQ29sb3JVSUNoYW5nZSIsImxheWVyQ29uZmlnQ2hhbmdlIiwibGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlIiwibGF5ZXJUb2dnbGVWaXNpYmlsaXR5IiwibGF5ZXJUeXBlQ2hhbmdlIiwibGF5ZXJWaXNDb25maWdDaGFuZ2UiLCJsYXllclRleHRMYWJlbENoYW5nZSIsInJlbW92ZUxheWVyIiwiem9vbVRvTGF5ZXIiLCJmaXRCb3VuZHMiLCJkdXBsaWNhdGVMYXllciIsImxheWVyU2V0SXNWYWxpZCIsIlNvcnRhYmxlQ29udGV4dCIsIml0ZW1zIiwic3RyYXRlZ3kiLCJ2ZXJ0aWNhbExpc3RTb3J0aW5nU3RyYXRlZ3kiLCJmaW5kSW5kZXgiLCJsIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc3JjL3NpZGUtcGFuZWwvbGF5ZXItcGFuZWwvbGF5ZXItbGlzdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7dXNlTWVtb30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcblxuaW1wb3J0IHtMYXllciwgTGF5ZXJDbGFzc2VzVHlwZX0gZnJvbSAnQGtlcGxlci5nbC9sYXllcnMnO1xuaW1wb3J0IHtEYXRhc2V0c30gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5pbXBvcnQge1VJU3RhdGVBY3Rpb25zLCBWaXNTdGF0ZUFjdGlvbnMsIE1hcFN0YXRlQWN0aW9uc30gZnJvbSAnQGtlcGxlci5nbC9hY3Rpb25zJztcblxuaW1wb3J0IHt1c2VTb3J0YWJsZSwgU29ydGFibGVDb250ZXh0LCB2ZXJ0aWNhbExpc3RTb3J0aW5nU3RyYXRlZ3l9IGZyb20gJ0BkbmQta2l0L3NvcnRhYmxlJztcbmltcG9ydCB7Q1NTfSBmcm9tICdAZG5kLWtpdC91dGlsaXRpZXMnO1xuaW1wb3J0IExheWVyUGFuZWxGYWN0b3J5IGZyb20gJy4vbGF5ZXItcGFuZWwnO1xuaW1wb3J0IHtmaW5kQnlJZH0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge2RhdGFUZXN0SWRzfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge1NwbGl0TWFwfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7U09SVEFCTEVfTEFZRVJfVFlQRSwgU09SVEFCTEVfU0lERV9QQU5FTF9UWVBFfSBmcm9tICcuLi8uLi9jb21tb24vZG5kLWxheWVyLWl0ZW1zJztcblxuZXhwb3J0IHR5cGUgTGF5ZXJMaXN0UHJvcHMgPSB7XG4gIGRhdGFzZXRzOiBEYXRhc2V0cztcbiAgbGF5ZXJzOiBMYXllcltdO1xuICBsYXllck9yZGVyOiBzdHJpbmdbXTtcbiAgbGF5ZXJDbGFzc2VzOiBMYXllckNsYXNzZXNUeXBlO1xuICBpc1NvcnRhYmxlPzogYm9vbGVhbjtcbiAgc3BsaXRNYXA/OiBTcGxpdE1hcDtcbiAgdWlTdGF0ZUFjdGlvbnM6IHR5cGVvZiBVSVN0YXRlQWN0aW9ucztcbiAgdmlzU3RhdGVBY3Rpb25zOiB0eXBlb2YgVmlzU3RhdGVBY3Rpb25zO1xuICBtYXBTdGF0ZUFjdGlvbnM6IHR5cGVvZiBNYXBTdGF0ZUFjdGlvbnM7XG59O1xuXG5leHBvcnQgdHlwZSBMYXllckxpc3RGYWN0b3J5RGVwcyA9IFt0eXBlb2YgTGF5ZXJQYW5lbEZhY3RvcnldO1xuXG4vLyBtYWtlIHN1cmUgdGhlIGVsZW1lbnQgaXMgYWx3YXlzIHZpc2libGUgd2hpbGUgaXMgYmVpbmcgZHJhZ2dlZFxuLy8gaXRlbSBiZWluZyBkcmFnZ2VkIGlzIGFwcGVuZGVkIGluIGJvZHksIGhlcmUgdG8gcmVzZXQgaXRzIGdsb2JhbCBzdHlsZVxuXG5jb25zdCBDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDhweDtcbmA7XG5cbmludGVyZmFjZSBTb3J0YWJsZVN0eWxlZEl0ZW1Qcm9wcyB7XG4gICR0cmFuc2l0aW9uPzogc3RyaW5nO1xuICAkdHJhbnNmb3JtPzogc3RyaW5nO1xufVxuXG5jb25zdCBTb3J0YWJsZVN0eWxlZEl0ZW0gPSBzdHlsZWQuZGl2PFNvcnRhYmxlU3R5bGVkSXRlbVByb3BzPmBcbiAgdHJhbnNpdGlvbjogJHtwcm9wcyA9PiBwcm9wcy4kdHJhbnNpdGlvbn07XG4gIHRyYW5zZm9ybTogJHtwcm9wcyA9PiBwcm9wcy4kdHJhbnNmb3JtfTtcbiAgJi5zb3J0aW5nIHtcbiAgICBvcGFjaXR5OiAwLjM7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIH1cbiAgJi5zb3J0aW5nLWxheWVycyAubGF5ZXItcGFuZWxfX2hlYWRlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEJhY2tncm91bmRIb3Zlcn07XG4gICAgZm9udC1mYW1pbHk6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZm9udEZhbWlseX07XG4gICAgZm9udC13ZWlnaHQ6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZm9udFdlaWdodH07XG4gICAgZm9udC1zaXplOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmZvbnRTaXplfTtcbiAgICBsaW5lLWhlaWdodDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5saW5lSGVpZ2h0fTtcbiAgICAqLFxuICAgICo6YmVmb3JlLFxuICAgICo6YWZ0ZXIge1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG4gICAgLmxheWVyX19kcmFnLWhhbmRsZSB7XG4gICAgICBvcGFjaXR5OiAxO1xuICAgICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9ySGx9O1xuICAgIH1cbiAgfVxuYDtcblxuY29uc3QgSU5JVElBTF9MQVlFUlNfVE9fU0hPVzogTGF5ZXJbXSA9IFtdO1xuXG5MYXllckxpc3RGYWN0b3J5LmRlcHMgPSBbTGF5ZXJQYW5lbEZhY3RvcnldO1xuXG5mdW5jdGlvbiBMYXllckxpc3RGYWN0b3J5KExheWVyUGFuZWw6IFJldHVyblR5cGU8dHlwZW9mIExheWVyUGFuZWxGYWN0b3J5Pikge1xuICAvLyBCeSB3cmFwcGluZyBsYXllciBwYW5lbCB1c2luZyBhIHNvcnRhYmxlIGVsZW1lbnQgd2UgZG9uJ3QgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIGRyYWcgYW5kIGRyb3AgbG9naWMgaW50byB0aGUgcGFuZWwgaXRzZWxmO1xuICAvLyBEZXZlbG9wZXJzIGNhbiBwcm92aWRlIGFueSBsYXllciBwYW5lbCBpbXBsZW1lbnRhdGlvbiBhbmQgaXQgd2lsbCBzdGlsbCBiZSBzb3J0YWJsZVxuICBjb25zdCBTb3J0YWJsZUl0ZW0gPSAoe2xheWVyLCBpZHgsIHBhbmVsUHJvcHMsIGxheWVyQWN0aW9ucywgZGlzYWJsZWR9KSA9PiB7XG4gICAgY29uc3Qge2F0dHJpYnV0ZXMsIGxpc3RlbmVycywgc2V0Tm9kZVJlZiwgaXNEcmFnZ2luZywgdHJhbnNmb3JtLCB0cmFuc2l0aW9ufSA9IHVzZVNvcnRhYmxlKHtcbiAgICAgIGlkOiBsYXllci5pZCxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdHlwZTogU09SVEFCTEVfTEFZRVJfVFlQRSxcbiAgICAgICAgcGFyZW50OiBTT1JUQUJMRV9TSURFX1BBTkVMX1RZUEVcbiAgICAgIH0sXG4gICAgICBkaXNhYmxlZFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTb3J0YWJsZVN0eWxlZEl0ZW1cbiAgICAgICAgcmVmPXtzZXROb2RlUmVmfVxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzbmFtZXMoXG4gICAgICAgICAge1tkYXRhVGVzdElkcy5zb3J0YWJsZUxheWVySXRlbV06ICFkaXNhYmxlZH0sXG4gICAgICAgICAge1tkYXRhVGVzdElkcy5zdGF0aWNMYXllckl0ZW1dOiBkaXNhYmxlZH0sXG4gICAgICAgICAge3NvcnRpbmc6IGlzRHJhZ2dpbmd9XG4gICAgICAgICl9XG4gICAgICAgIGRhdGEtdGVzdGlkPXtkaXNhYmxlZCA/IGRhdGFUZXN0SWRzLnN0YXRpY0xheWVySXRlbSA6IGRhdGFUZXN0SWRzLnNvcnRhYmxlTGF5ZXJJdGVtfVxuICAgICAgICAkdHJhbnNmb3JtPXtDU1MuVHJhbnNmb3JtLnRvU3RyaW5nKHRyYW5zZm9ybSl9XG4gICAgICAgICR0cmFuc2l0aW9uPXt0cmFuc2l0aW9ufVxuICAgICAgICB7Li4uYXR0cmlidXRlc31cbiAgICAgID5cbiAgICAgICAgPExheWVyUGFuZWxcbiAgICAgICAgICB7Li4ucGFuZWxQcm9wc31cbiAgICAgICAgICB7Li4ubGF5ZXJBY3Rpb25zfVxuICAgICAgICAgIGtleT17bGF5ZXIuaWR9XG4gICAgICAgICAgaWR4PXtpZHh9XG4gICAgICAgICAgbGF5ZXI9e2xheWVyfVxuICAgICAgICAgIGxpc3RlbmVycz17bGlzdGVuZXJzfVxuICAgICAgICAgIGlzRHJhZ2dhYmxlPXshZGlzYWJsZWR9XG4gICAgICAgIC8+XG4gICAgICA8L1NvcnRhYmxlU3R5bGVkSXRlbT5cbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IExheWVyTGlzdDogUmVhY3QuRkM8TGF5ZXJMaXN0UHJvcHM+ID0gcHJvcHMgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGxheWVycyxcbiAgICAgIGRhdGFzZXRzLFxuICAgICAgbGF5ZXJPcmRlcixcbiAgICAgIHVpU3RhdGVBY3Rpb25zLFxuICAgICAgdmlzU3RhdGVBY3Rpb25zLFxuICAgICAgbWFwU3RhdGVBY3Rpb25zLFxuICAgICAgbGF5ZXJDbGFzc2VzLFxuICAgICAgaXNTb3J0YWJsZSA9IHRydWUsXG4gICAgICBzcGxpdE1hcFxuICAgIH0gPSBwcm9wcztcbiAgICBjb25zdCB7dG9nZ2xlTW9kYWw6IG9wZW5Nb2RhbH0gPSB1aVN0YXRlQWN0aW9ucztcblxuICAgIGNvbnN0IGxheWVyc1RvU2hvdyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgcmV0dXJuIGxheWVyT3JkZXIucmVkdWNlKChhY2MsIGxheWVySWQpID0+IHtcbiAgICAgICAgY29uc3QgbGF5ZXIgPSBmaW5kQnlJZChsYXllcklkKShsYXllcnMuZmlsdGVyKEJvb2xlYW4pKTtcbiAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFsYXllci5jb25maWcuaGlkZGVuID8gWy4uLmFjYywgbGF5ZXJdIDogYWNjO1xuICAgICAgfSwgSU5JVElBTF9MQVlFUlNfVE9fU0hPVyk7XG4gICAgfSwgW2xheWVycywgbGF5ZXJPcmRlcl0pO1xuXG4gICAgY29uc3Qgc2lkZVBhbmVsRG5kSXRlbXMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgIHJldHVybiBsYXllcnNUb1Nob3cubWFwKCh7aWR9KSA9PiBpZCk7XG4gICAgfSwgW2xheWVyc1RvU2hvd10pO1xuXG4gICAgY29uc3QgbGF5ZXJUeXBlT3B0aW9ucyA9IHVzZU1lbW8oXG4gICAgICAoKSA9PlxuICAgICAgICBPYmplY3Qua2V5cyhsYXllckNsYXNzZXMpLm1hcChrZXkgPT4ge1xuICAgICAgICAgIGNvbnN0IGxheWVyID0gbmV3IGxheWVyQ2xhc3Nlc1trZXldKHtkYXRhSWQ6ICcnfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBrZXksXG4gICAgICAgICAgICBsYWJlbDogbGF5ZXIubmFtZSxcbiAgICAgICAgICAgIGljb246IGxheWVyLmxheWVySWNvbixcbiAgICAgICAgICAgIHJlcXVpcmVEYXRhOiBsYXllci5yZXF1aXJlRGF0YVxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgW2xheWVyQ2xhc3Nlc11cbiAgICApO1xuXG4gICAgY29uc3QgbGF5ZXJBY3Rpb25zID0gdXNlTWVtbyhcbiAgICAgICgpID0+ICh7XG4gICAgICAgIGxheWVyQ29sb3JVSUNoYW5nZTogdmlzU3RhdGVBY3Rpb25zLmxheWVyQ29sb3JVSUNoYW5nZSxcbiAgICAgICAgbGF5ZXJDb25maWdDaGFuZ2U6IHZpc1N0YXRlQWN0aW9ucy5sYXllckNvbmZpZ0NoYW5nZSxcbiAgICAgICAgbGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlOiB2aXNTdGF0ZUFjdGlvbnMubGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlLFxuICAgICAgICBsYXllclRvZ2dsZVZpc2liaWxpdHk6IHZpc1N0YXRlQWN0aW9ucy5sYXllclRvZ2dsZVZpc2liaWxpdHksXG4gICAgICAgIGxheWVyVHlwZUNoYW5nZTogdmlzU3RhdGVBY3Rpb25zLmxheWVyVHlwZUNoYW5nZSxcbiAgICAgICAgbGF5ZXJWaXNDb25maWdDaGFuZ2U6IHZpc1N0YXRlQWN0aW9ucy5sYXllclZpc0NvbmZpZ0NoYW5nZSxcbiAgICAgICAgbGF5ZXJUZXh0TGFiZWxDaGFuZ2U6IHZpc1N0YXRlQWN0aW9ucy5sYXllclRleHRMYWJlbENoYW5nZSxcbiAgICAgICAgcmVtb3ZlTGF5ZXI6IHZpc1N0YXRlQWN0aW9ucy5yZW1vdmVMYXllcixcbiAgICAgICAgem9vbVRvTGF5ZXI6IG1hcFN0YXRlQWN0aW9ucy5maXRCb3VuZHMsXG4gICAgICAgIGR1cGxpY2F0ZUxheWVyOiB2aXNTdGF0ZUFjdGlvbnMuZHVwbGljYXRlTGF5ZXIsXG4gICAgICAgIGxheWVyU2V0SXNWYWxpZDogdmlzU3RhdGVBY3Rpb25zLmxheWVyU2V0SXNWYWxpZFxuICAgICAgfSksXG4gICAgICBbdmlzU3RhdGVBY3Rpb25zLCBtYXBTdGF0ZUFjdGlvbnNdXG4gICAgKTtcblxuICAgIGNvbnN0IHBhbmVsUHJvcHMgPSB1c2VNZW1vKFxuICAgICAgKCkgPT4gKHtcbiAgICAgICAgZGF0YXNldHMsXG4gICAgICAgIG9wZW5Nb2RhbCxcbiAgICAgICAgbGF5ZXJUeXBlT3B0aW9ucyxcbiAgICAgICAgc3BsaXRNYXBcbiAgICAgIH0pLFxuICAgICAgW2RhdGFzZXRzLCBvcGVuTW9kYWwsIGxheWVyVHlwZU9wdGlvbnMsIHNwbGl0TWFwXVxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPENvbnRhaW5lcj5cbiAgICAgICAgPFNvcnRhYmxlQ29udGV4dFxuICAgICAgICAgIGlkPXtTT1JUQUJMRV9TSURFX1BBTkVMX1RZUEV9XG4gICAgICAgICAgaXRlbXM9e3NpZGVQYW5lbERuZEl0ZW1zfVxuICAgICAgICAgIHN0cmF0ZWd5PXt2ZXJ0aWNhbExpc3RTb3J0aW5nU3RyYXRlZ3l9XG4gICAgICAgICAgZGlzYWJsZWQ9eyFpc1NvcnRhYmxlfVxuICAgICAgICA+XG4gICAgICAgICAgey8qIHdhcm5pbmc6IGNvbnRhaW5lcklkIHNob3VsZCBiZSBzaW1pbGFyIHRvIHRoZSBmaXJzdCBrZXkgaW4gZG5kSXRlbXMgZGVmaW5lZCBpbiBrZXBsZXItZ2wuanMqL31cbiAgICAgICAgICB7bGF5ZXJzVG9TaG93Lm1hcChsYXllciA9PiAoXG4gICAgICAgICAgICA8U29ydGFibGVJdGVtXG4gICAgICAgICAgICAgIGtleT17bGF5ZXIuaWR9XG4gICAgICAgICAgICAgIGxheWVyPXtsYXllcn1cbiAgICAgICAgICAgICAgaWR4PXtsYXllcnMuZmluZEluZGV4KGwgPT4gbD8uaWQgPT09IGxheWVyLmlkKX1cbiAgICAgICAgICAgICAgcGFuZWxQcm9wcz17cGFuZWxQcm9wc31cbiAgICAgICAgICAgICAgbGF5ZXJBY3Rpb25zPXtsYXllckFjdGlvbnN9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXshaXNTb3J0YWJsZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvU29ydGFibGVDb250ZXh0PlxuICAgICAgPC9Db250YWluZXI+XG4gICAgKTtcbiAgfTtcbiAgcmV0dXJuIExheWVyTGlzdDtcbn1cbmV4cG9ydCBkZWZhdWx0IExheWVyTGlzdEZhY3Rvcnk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxZQUFBLEdBQUFELHNCQUFBLENBQUFGLE9BQUE7QUFNQSxJQUFBSSxTQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxVQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxXQUFBLEdBQUFKLHNCQUFBLENB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