UNPKG

kepler.gl

Version:

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

274 lines (273 loc) 48.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.LayerLabelEditor = exports.HeaderWarning = exports.DragHandle = void 0; exports.LayerPanelHeaderActionSectionFactory = LayerPanelHeaderActionSectionFactory; exports.LayerTitleSectionFactory = LayerTitleSectionFactory; exports["default"] = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _styledComponents = _interopRequireWildcard(require("styled-components")); var _panelHeaderAction = _interopRequireDefault(require("../panel-header-action")); var _styledComponents2 = require("../../common/styled-components"); var _icons = require("../../common/icons"); var _localization = require("@kepler.gl/localization"); var _constants = require("@kepler.gl/constants"); var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8; // 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; } var getBorderCss = function getBorderCss(status) { return (0, _styledComponents.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n border-top: 2px solid ", ";\n border-bottom: 2px solid ", ";\n border-right: 2px solid ", ";\n "])), function (_ref) { var theme = _ref.theme; return theme.notificationColors[status]; }, function (_ref2) { var theme = _ref2.theme; return theme.notificationColors[status]; }, function (_ref3) { var theme = _ref3.theme; return theme.notificationColors[status]; }); }; var StyledLayerPanelHeader = (0, _styledComponents["default"])(_styledComponents2.StyledPanelHeader)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n height: ", "px;\n position: relative;\n align-items: stretch;\n\n .layer__remove-layer {\n opacity: 0;\n }\n\n .layer__drag-handle__placeholder {\n height: 20px;\n padding: 10px;\n }\n\n ", "\n\n &:hover {\n cursor: pointer;\n background-color: ", ";\n\n .layer__drag-handle {\n opacity: 1;\n }\n\n .layer__remove-layer {\n opacity: 1;\n }\n }\n"])), function (props) { return props.theme.layerPanelHeaderHeight; }, function (props) { return props.warning ? getBorderCss('warning') : props.isValid ? '' : getBorderCss('error'); }, function (props) { return props.theme.panelBackgroundHover; }); var HeaderLabelSection = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n color: ", ";\n flex-grow: 1;\n align-items: stretch;\n // leave space for eye and collapse icon\n padding-right: 50px;\n"])), function (props) { return props.theme.textColor; }); var HeaderActionSection = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n position: absolute;\n height: 100%;\n align-items: stretch;\n right: 10px;\n pointer-events: ", ";\n &:hover {\n .layer-panel__header__actions__hidden {\n opacity: 1;\n background-color: ", ";\n }\n }\n"])), function (props) { return props.isEditingLabel ? 'none' : 'all'; }, function (props) { return props.theme.panelBackgroundHover; }); // Hiden actions only show up on hover var StyledPanelHeaderHiddenActions = _styledComponents["default"].div.attrs({ className: 'layer-panel__header__actions__hidden' })(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n opacity: 0;\n display: flex;\n align-items: center;\n background-color: ", ";\n transition: opacity 0.4s ease, background-color 0.4s ease;\n\n &:hover {\n opacity: 1;\n }\n"])), function (props) { return props.isConfigActive ? props.theme.panelBackgroundHover : props.theme.panelBackground; }); var StyledDragHandle = _styledComponents["default"].div(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n opacity: 0;\n z-index: 1000;\n\n &:hover {\n cursor: move;\n opacity: 1;\n color: ", ";\n }\n"])), function (props) { return props.theme.textColorHl; }); var DragHandle = exports.DragHandle = function DragHandle(_ref4) { var className = _ref4.className, listeners = _ref4.listeners, children = _ref4.children; return /*#__PURE__*/_react["default"].createElement(StyledDragHandle, (0, _extends2["default"])({ className: className }, listeners ? listeners : {}), children); }; var noOp = function noOp(event) { event.stopPropagation(); event.preventDefault(); }; var LayerLabelEditor = exports.LayerLabelEditor = function LayerLabelEditor(_ref5) { var layerId = _ref5.layerId, label = _ref5.label, onEdit = _ref5.onEdit, onFocus = _ref5.onFocus, onBlur = _ref5.onBlur; return /*#__PURE__*/_react["default"].createElement(_styledComponents2.InlineInput, { type: "text", className: "layer__title__editor", "data-testid": _constants.dataTestIds.layerTitleEditor, value: label, onClick: noOp, onChange: onEdit, onFocus: onFocus, onBlur: onBlur, id: "".concat(layerId, ":input-layer-label") }); }; function LayerTitleSectionFactory() { var StyledLayerTitleSection = _styledComponents["default"].div(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["\n margin-left: 4px;\n flex-grow: 1;\n align-items: center;\n display: flex;\n .layer__title__inner {\n flex-grow: 1;\n }\n\n .layer__title__type {\n color: ", ";\n font-size: 10px;\n line-height: 12px;\n letter-spacing: 0.37px;\n text-transform: capitalize;\n }\n "])), function (props) { return props.theme.subtextColor; }); var LayerTitleSection = function LayerTitleSection(_ref6) { var layerType = _ref6.layerType, layerId = _ref6.layerId, label = _ref6.label, onUpdateLayerLabel = _ref6.onUpdateLayerLabel, onFocus = _ref6.onFocus, onBlur = _ref6.onBlur; return /*#__PURE__*/_react["default"].createElement(StyledLayerTitleSection, { className: "layer__title" }, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(LayerLabelEditor, { layerId: layerId, label: label, onEdit: onUpdateLayerLabel, onFocus: onFocus, onBlur: onBlur }), /*#__PURE__*/_react["default"].createElement("div", { className: "layer__title__type" }, layerType && /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: "layer.type.".concat(layerType.toLowerCase()) })))); }; return LayerTitleSection; } LayerPanelHeaderActionSectionFactory.deps = [_panelHeaderAction["default"]]; function LayerPanelHeaderActionSectionFactory(PanelHeaderAction) { var LayerPanelHeaderActionSection = function LayerPanelHeaderActionSection(props) { var isConfigActive = props.isConfigActive, allowDuplicate = props.allowDuplicate, isVisible = props.isVisible, isValid = props.isValid, layerId = props.layerId, onToggleVisibility = props.onToggleVisibility, onResetIsValid = props.onResetIsValid, onToggleEnableConfig = props.onToggleEnableConfig, onDuplicateLayer = props.onDuplicateLayer, onRemoveLayer = props.onRemoveLayer, onZoomToLayer = props.onZoomToLayer, _props$showRemoveLaye = props.showRemoveLayer, showRemoveLayer = _props$showRemoveLaye === void 0 ? true : _props$showRemoveLaye, isEditingLabel = props.isEditingLabel, _props$actionIcons = props.actionIcons, actionIcons = _props$actionIcons === void 0 ? defaultActionIcons : _props$actionIcons; return /*#__PURE__*/_react["default"].createElement(HeaderActionSection, { className: "layer-panel__header__actions", isEditingLabel: isEditingLabel }, /*#__PURE__*/_react["default"].createElement(StyledPanelHeaderHiddenActions, { isConfigActive: isConfigActive }, showRemoveLayer ? /*#__PURE__*/_react["default"].createElement(PanelHeaderAction, { className: "layer__remove-layer", testId: "remove-layer-action", id: layerId, tooltip: 'tooltip.removeLayer', onClick: onRemoveLayer, tooltipType: "error", IconComponent: actionIcons.remove }) : null, /*#__PURE__*/_react["default"].createElement(PanelHeaderAction, { className: "layer__duplicate", id: layerId, tooltip: 'tooltip.duplicateLayer', onClick: onDuplicateLayer, IconComponent: actionIcons.duplicate, disabled: !allowDuplicate }), /*#__PURE__*/_react["default"].createElement(PanelHeaderAction, { className: "layer__zoom-to-layer", id: layerId, tooltip: 'tooltip.zoomToLayer', onClick: onZoomToLayer, IconComponent: actionIcons.crosshairs })), isValid ? /*#__PURE__*/_react["default"].createElement(PanelHeaderAction, { className: "layer__visibility-toggle", id: layerId, tooltip: isVisible ? 'tooltip.hideLayer' : 'tooltip.showLayer', onClick: onToggleVisibility, IconComponent: isVisible ? actionIcons.visible : actionIcons.hidden }) : /*#__PURE__*/_react["default"].createElement(PanelHeaderAction, { className: "layer__is-valid-refresh", id: layerId, tooltip: 'tooltip.resetAfterError', onClick: onResetIsValid, IconComponent: actionIcons.resetIsValid }), /*#__PURE__*/_react["default"].createElement(PanelHeaderAction, { className: (0, _classnames["default"])('layer__enable-config ', { 'is-open': isConfigActive }), id: layerId, tooltip: 'tooltip.layerSettings', onClick: onToggleEnableConfig, IconComponent: actionIcons.enableConfig })); }; return LayerPanelHeaderActionSection; } var StyledHeaderWaring = _styledComponents["default"].div(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n right: -9px;\n top: calc(50% - 9px);\n color: ", ";\n"])), function (_ref7) { var theme = _ref7.theme; return theme.notificationColors.warning; }); var HeaderWarning = exports.HeaderWarning = function HeaderWarning(_ref8) { var warning = _ref8.warning, id = _ref8.id; return /*#__PURE__*/_react["default"].createElement(StyledHeaderWaring, null, /*#__PURE__*/_react["default"].createElement(_icons.WarningSign, { "data-tip": true, "data-for": "layer-".concat(id, "-warning"), height: "16px" }), /*#__PURE__*/_react["default"].createElement(_styledComponents2.Tooltip, { id: "layer-".concat(id, "-warning"), type: "warning", effect: "solid", textColor: "black" }, warning)); }; var defaultActionIcons = { remove: _icons.Trash, visible: _icons.EyeSeen, hidden: _icons.EyeUnseen, enableConfig: _icons.ArrowDown, duplicate: _icons.Copy, resetIsValid: _icons.Reset, crosshairs: _icons.Crosshairs }; LayerPanelHeaderFactory.deps = [LayerTitleSectionFactory, LayerPanelHeaderActionSectionFactory]; function LayerPanelHeaderFactory(LayerTitleSection, LayerPanelHeaderActionSection) { var LayerPanelHeader = function LayerPanelHeader(props) { var isConfigActive = props.isConfigActive, _props$isDragNDropEna = props.isDragNDropEnabled, isDragNDropEnabled = _props$isDragNDropEna === void 0 ? true : _props$isDragNDropEna, isValid = props.isValid, warning = props.warning, label = props.label, layerId = props.layerId, layerType = props.layerType, labelRCGColorValues = props.labelRCGColorValues, onUpdateLayerLabel = props.onUpdateLayerLabel, onToggleEnableConfig = props.onToggleEnableConfig, listeners = props.listeners; var _useState = (0, _react.useState)(false), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), isEditingLabel = _useState2[0], setIsEditingLabel = _useState2[1]; return /*#__PURE__*/_react["default"].createElement(StyledLayerPanelHeader, { className: (0, _classnames["default"])('layer-panel__header', { 'sort--handle': !isConfigActive }), isValid: isValid, warning: warning, active: isConfigActive, labelRCGColorValues: labelRCGColorValues, onClick: onToggleEnableConfig }, warning ? /*#__PURE__*/_react["default"].createElement(HeaderWarning, { warning: warning, id: layerId }) : null, /*#__PURE__*/_react["default"].createElement(HeaderLabelSection, { className: "layer-panel__header__content" }, isDragNDropEnabled ? /*#__PURE__*/_react["default"].createElement(DragHandle, { className: "layer__drag-handle", listeners: listeners }, /*#__PURE__*/_react["default"].createElement(_icons.VertDots, { height: "20px" })) : /*#__PURE__*/_react["default"].createElement("div", { className: "layer__drag-handle__placeholder" }), /*#__PURE__*/_react["default"].createElement(LayerTitleSection, { layerId: layerId, label: label, onUpdateLayerLabel: onUpdateLayerLabel, layerType: layerType, onFocus: function onFocus() { setIsEditingLabel(true); }, onBlur: function onBlur() { setIsEditingLabel(false); } })), /*#__PURE__*/_react["default"].createElement(LayerPanelHeaderActionSection, (0, _extends2["default"])({}, props, { isEditingLabel: isEditingLabel }))); }; return LayerPanelHeader; } var _default = exports["default"] = LayerPanelHeaderFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9wYW5lbEhlYWRlckFjdGlvbiIsIl9zdHlsZWRDb21wb25lbnRzMiIsIl9pY29ucyIsIl9sb2NhbGl6YXRpb24iLCJfY29uc3RhbnRzIiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl90ZW1wbGF0ZU9iamVjdDMiLCJfdGVtcGxhdGVPYmplY3Q0IiwiX3RlbXBsYXRlT2JqZWN0NSIsIl90ZW1wbGF0ZU9iamVjdDYiLCJfdGVtcGxhdGVPYmplY3Q3IiwiX3RlbXBsYXRlT2JqZWN0OCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsImdldEJvcmRlckNzcyIsInN0YXR1cyIsImNzcyIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwiX3JlZiIsInRoZW1lIiwibm90aWZpY2F0aW9uQ29sb3JzIiwiX3JlZjIiLCJfcmVmMyIsIlN0eWxlZExheWVyUGFuZWxIZWFkZXIiLCJzdHlsZWQiLCJTdHlsZWRQYW5lbEhlYWRlciIsInByb3BzIiwibGF5ZXJQYW5lbEhlYWRlckhlaWdodCIsIndhcm5pbmciLCJpc1ZhbGlkIiwicGFuZWxCYWNrZ3JvdW5kSG92ZXIiLCJIZWFkZXJMYWJlbFNlY3Rpb24iLCJkaXYiLCJ0ZXh0Q29sb3IiLCJIZWFkZXJBY3Rpb25TZWN0aW9uIiwiaXNFZGl0aW5nTGFiZWwiLCJTdHlsZWRQYW5lbEhlYWRlckhpZGRlbkFjdGlvbnMiLCJhdHRycyIsImNsYXNzTmFtZSIsImlzQ29uZmlnQWN0aXZlIiwicGFuZWxCYWNrZ3JvdW5kIiwiU3R5bGVkRHJhZ0hhbmRsZSIsInRleHRDb2xvckhsIiwiRHJhZ0hhbmRsZSIsImV4cG9ydHMiLCJfcmVmNCIsImxpc3RlbmVycyIsImNoaWxkcmVuIiwiY3JlYXRlRWxlbWVudCIsIl9leHRlbmRzMiIsIm5vT3AiLCJldmVudCIsInN0b3BQcm9wYWdhdGlvbiIsInByZXZlbnREZWZhdWx0IiwiTGF5ZXJMYWJlbEVkaXRvciIsIl9yZWY1IiwibGF5ZXJJZCIsImxhYmVsIiwib25FZGl0Iiwib25Gb2N1cyIsIm9uQmx1ciIsIklubGluZUlucHV0IiwidHlwZSIsImRhdGFUZXN0SWRzIiwibGF5ZXJUaXRsZUVkaXRvciIsInZhbHVlIiwib25DbGljayIsIm9uQ2hhbmdlIiwiaWQiLCJjb25jYXQiLCJMYXllclRpdGxlU2VjdGlvbkZhY3RvcnkiLCJTdHlsZWRMYXllclRpdGxlU2VjdGlvbiIsInN1YnRleHRDb2xvciIsIkxheWVyVGl0bGVTZWN0aW9uIiwiX3JlZjYiLCJsYXllclR5cGUiLCJvblVwZGF0ZUxheWVyTGFiZWwiLCJGb3JtYXR0ZWRNZXNzYWdlIiwidG9Mb3dlckNhc2UiLCJMYXllclBhbmVsSGVhZGVyQWN0aW9uU2VjdGlvbkZhY3RvcnkiLCJkZXBzIiwiUGFuZWxIZWFkZXJBY3Rpb25GYWN0b3J5IiwiUGFuZWxIZWFkZXJBY3Rpb24iLCJMYXllclBhbmVsSGVhZGVyQWN0aW9uU2VjdGlvbiIsImFsbG93RHVwbGljYXRlIiwiaXNWaXNpYmxlIiwib25Ub2dnbGVWaXNpYmlsaXR5Iiwib25SZXNldElzVmFsaWQiLCJvblRvZ2dsZUVuYWJsZUNvbmZpZyIsIm9uRHVwbGljYXRlTGF5ZXIiLCJvblJlbW92ZUxheWVyIiwib25ab29tVG9MYXllciIsIl9wcm9wcyRzaG93UmVtb3ZlTGF5ZSIsInNob3dSZW1vdmVMYXllciIsIl9wcm9wcyRhY3Rpb25JY29ucyIsImFjdGlvbkljb25zIiwiZGVmYXVsdEFjdGlvbkljb25zIiwidGVzdElkIiwidG9vbHRpcCIsInRvb2x0aXBUeXBlIiwiSWNvbkNvbXBvbmVudCIsInJlbW92ZSIsImR1cGxpY2F0ZSIsImRpc2FibGVkIiwiY3Jvc3NoYWlycyIsInZpc2libGUiLCJoaWRkZW4iLCJyZXNldElzVmFsaWQiLCJjbGFzc25hbWVzIiwiZW5hYmxlQ29uZmlnIiwiU3R5bGVkSGVhZGVyV2FyaW5nIiwiX3JlZjciLCJIZWFkZXJXYXJuaW5nIiwiX3JlZjgiLCJXYXJuaW5nU2lnbiIsImhlaWdodCIsIlRvb2x0aXAiLCJlZmZlY3QiLCJUcmFzaCIsIkV5ZVNlZW4iLCJFeWVVbnNlZW4iLCJBcnJvd0Rvd24iLCJDb3B5IiwiUmVzZXQiLCJDcm9zc2hhaXJzIiwiTGF5ZXJQYW5lbEhlYWRlckZhY3RvcnkiLCJMYXllclBhbmVsSGVhZGVyIiwiX3Byb3BzJGlzRHJhZ05Ecm9wRW5hIiwiaXNEcmFnTkRyb3BFbmFibGVkIiwibGFiZWxSQ0dDb2xvclZhbHVlcyIsIl91c2VTdGF0ZSIsInVzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5MiIsInNldElzRWRpdGluZ0xhYmVsIiwiYWN0aXZlIiwiVmVydERvdHMiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zaWRlLXBhbmVsL2xheWVyLXBhbmVsL2xheWVyLXBhbmVsLWhlYWRlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7XG4gIHVzZVN0YXRlLFxuICBDb21wb25lbnRUeXBlLFxuICBNb3VzZUV2ZW50SGFuZGxlcixcbiAgTW91c2VFdmVudCxcbiAgQ2hhbmdlRXZlbnRIYW5kbGVyXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHN0eWxlZCwge2Nzc30gZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IFBhbmVsSGVhZGVyQWN0aW9uRmFjdG9yeSBmcm9tICcuLi9wYW5lbC1oZWFkZXItYWN0aW9uJztcbmltcG9ydCB7VG9vbHRpcH0gZnJvbSAnLi4vLi4vY29tbW9uL3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7XG4gIENvcHksXG4gIEFycm93RG93bixcbiAgRXllU2VlbixcbiAgRXllVW5zZWVuLFxuICBUcmFzaCxcbiAgVmVydERvdHMsXG4gIFdhcm5pbmdTaWduLFxuICBSZXNldCxcbiAgQ3Jvc3NoYWlyc1xufSBmcm9tICcuLi8uLi9jb21tb24vaWNvbnMnO1xuXG5pbXBvcnQge0lubGluZUlucHV0LCBTdHlsZWRQYW5lbEhlYWRlcn0gZnJvbSAnLi4vLi4vY29tbW9uL3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7Rm9ybWF0dGVkTWVzc2FnZX0gZnJvbSAnQGtlcGxlci5nbC9sb2NhbGl6YXRpb24nO1xuaW1wb3J0IHtkYXRhVGVzdElkc30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtSR0JDb2xvcn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge0Jhc2VQcm9wc30gZnJvbSAnLi4vLi4vY29tbW9uL2ljb25zJztcblxuZXhwb3J0IHR5cGUgTGF5ZXJMYWJlbEVkaXRvclByb3BzID0ge1xuICBsYXllcklkOiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xuICBvbkVkaXQ6IENoYW5nZUV2ZW50SGFuZGxlcjtcbiAgb25Gb2N1czogQ2hhbmdlRXZlbnRIYW5kbGVyO1xuICBvbkJsdXI6IENoYW5nZUV2ZW50SGFuZGxlcjtcbn07XG5cbmV4cG9ydCB0eXBlIExheWVyVGl0bGVTZWN0aW9uUHJvcHMgPSB7XG4gIGxheWVyVHlwZT86IHN0cmluZyB8IG51bGw7XG4gIGxheWVySWQ6IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIG9uVXBkYXRlTGF5ZXJMYWJlbDogQ2hhbmdlRXZlbnRIYW5kbGVyO1xuICBvbkZvY3VzOiBDaGFuZ2VFdmVudEhhbmRsZXI7XG4gIG9uQmx1cjogQ2hhbmdlRXZlbnRIYW5kbGVyO1xufTtcblxuZXhwb3J0IHR5cGUgTGF5ZXJQYW5lbEhlYWRlclByb3BzID0ge1xuICBsYXllcklkOiBzdHJpbmc7XG4gIGlzVmlzaWJsZTogYm9vbGVhbjtcbiAgaXNWYWxpZDogYm9vbGVhbjtcbiAgb25Ub2dnbGVWaXNpYmlsaXR5OiBNb3VzZUV2ZW50SGFuZGxlcjtcbiAgb25VcGRhdGVMYXllckxhYmVsOiBDaGFuZ2VFdmVudEhhbmRsZXI7XG4gIG9uVG9nZ2xlRW5hYmxlQ29uZmlnOiBNb3VzZUV2ZW50SGFuZGxlcjtcbiAgb25SZW1vdmVMYXllcjogTW91c2VFdmVudEhhbmRsZXI7XG4gIG9uWm9vbVRvTGF5ZXI6IE1vdXNlRXZlbnRIYW5kbGVyO1xuICBvbkR1cGxpY2F0ZUxheWVyOiBNb3VzZUV2ZW50SGFuZGxlcjtcbiAgb25SZXNldElzVmFsaWQ6IE1vdXNlRXZlbnRIYW5kbGVyO1xuICBpc0NvbmZpZ0FjdGl2ZTogYm9vbGVhbjtcbiAgc2hvd1JlbW92ZUxheWVyPzogYm9vbGVhbjtcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIGxheWVyVHlwZT86IHN0cmluZyB8IG51bGw7XG4gIGFsbG93RHVwbGljYXRlPzogYm9vbGVhbjtcbiAgaXNEcmFnTkRyb3BFbmFibGVkPzogYm9vbGVhbjtcbiAgd2FybmluZz86IGJvb2xlYW47XG4gIGxhYmVsUkNHQ29sb3JWYWx1ZXM/OiBSR0JDb2xvciB8IG51bGw7XG4gIGFjdGlvbkljb25zPzoge1xuICAgIHJlbW92ZTogQ29tcG9uZW50VHlwZTxQYXJ0aWFsPEJhc2VQcm9wcz4+O1xuICAgIHZpc2libGU6IENvbXBvbmVudFR5cGU8UGFydGlhbDxCYXNlUHJvcHM+PjtcbiAgICBoaWRkZW46IENvbXBvbmVudFR5cGU8UGFydGlhbDxCYXNlUHJvcHM+PjtcbiAgICBlbmFibGVDb25maWc6IENvbXBvbmVudFR5cGU8UGFydGlhbDxCYXNlUHJvcHM+PjtcbiAgICByZXNldElzVmFsaWQ6IENvbXBvbmVudFR5cGU8UGFydGlhbDxCYXNlUHJvcHM+PjtcbiAgICBkdXBsaWNhdGU6IENvbXBvbmVudFR5cGU8UGFydGlhbDxCYXNlUHJvcHM+PjtcbiAgICBjcm9zc2hhaXJzOiBDb21wb25lbnRUeXBlPFBhcnRpYWw8QmFzZVByb3BzPj47XG4gIH07XG4gIGxpc3RlbmVycz86IFJlYWN0LkVsZW1lbnRUeXBlO1xufTtcblxudHlwZSBIZWFkZXJBY3Rpb25TZWN0aW9uUHJvcHMgPSB7XG4gIGlzRWRpdGluZ0xhYmVsOiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgTGF5ZXJQYW5lbEhlYWRlckFjdGlvblNlY3Rpb25Qcm9wcyA9IExheWVyUGFuZWxIZWFkZXJQcm9wcyAmIEhlYWRlckFjdGlvblNlY3Rpb25Qcm9wcztcblxuY29uc3QgZ2V0Qm9yZGVyQ3NzID0gc3RhdHVzID0+XG4gIGNzc2BcbiAgICBib3JkZXItdG9wOiAycHggc29saWQgJHsoe3RoZW1lfSkgPT4gdGhlbWUubm90aWZpY2F0aW9uQ29sb3JzW3N0YXR1c119O1xuICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAkeyh7dGhlbWV9KSA9PiB0aGVtZS5ub3RpZmljYXRpb25Db2xvcnNbc3RhdHVzXX07XG4gICAgYm9yZGVyLXJpZ2h0OiAycHggc29saWQgJHsoe3RoZW1lfSkgPT4gdGhlbWUubm90aWZpY2F0aW9uQ29sb3JzW3N0YXR1c119O1xuICBgO1xuXG5jb25zdCBTdHlsZWRMYXllclBhbmVsSGVhZGVyID0gc3R5bGVkKFN0eWxlZFBhbmVsSGVhZGVyKWBcbiAgaGVpZ2h0OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmxheWVyUGFuZWxIZWFkZXJIZWlnaHR9cHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG5cbiAgLmxheWVyX19yZW1vdmUtbGF5ZXIge1xuICAgIG9wYWNpdHk6IDA7XG4gIH1cblxuICAubGF5ZXJfX2RyYWctaGFuZGxlX19wbGFjZWhvbGRlciB7XG4gICAgaGVpZ2h0OiAyMHB4O1xuICAgIHBhZGRpbmc6IDEwcHg7XG4gIH1cblxuICAke3Byb3BzID0+IChwcm9wcy53YXJuaW5nID8gZ2V0Qm9yZGVyQ3NzKCd3YXJuaW5nJykgOiBwcm9wcy5pc1ZhbGlkID8gJycgOiBnZXRCb3JkZXJDc3MoJ2Vycm9yJykpfVxuXG4gICY6aG92ZXIge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnBhbmVsQmFja2dyb3VuZEhvdmVyfTtcblxuICAgIC5sYXllcl9fZHJhZy1oYW5kbGUge1xuICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG5cbiAgICAubGF5ZXJfX3JlbW92ZS1sYXllciB7XG4gICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbiAgfVxuYDtcblxuY29uc3QgSGVhZGVyTGFiZWxTZWN0aW9uID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9yfTtcbiAgZmxleC1ncm93OiAxO1xuICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbiAgLy8gbGVhdmUgc3BhY2UgZm9yIGV5ZSBhbmQgY29sbGFwc2UgaWNvblxuICBwYWRkaW5nLXJpZ2h0OiA1MHB4O1xuYDtcblxuY29uc3QgSGVhZGVyQWN0aW9uU2VjdGlvbiA9IHN0eWxlZC5kaXY8SGVhZGVyQWN0aW9uU2VjdGlvblByb3BzPmBcbiAgZGlzcGxheTogZmxleDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xuICByaWdodDogMTBweDtcbiAgcG9pbnRlci1ldmVudHM6ICR7cHJvcHMgPT4gKHByb3BzLmlzRWRpdGluZ0xhYmVsID8gJ25vbmUnIDogJ2FsbCcpfTtcbiAgJjpob3ZlciB7XG4gICAgLmxheWVyLXBhbmVsX19oZWFkZXJfX2FjdGlvbnNfX2hpZGRlbiB7XG4gICAgICBvcGFjaXR5OiAxO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEJhY2tncm91bmRIb3Zlcn07XG4gICAgfVxuICB9XG5gO1xuXG50eXBlIFN0eWxlZFBhbmVsSGVhZGVySGlkZGVuQWN0aW9uc1Byb3BzID0ge1xuICBpc0NvbmZpZ0FjdGl2ZTogTGF5ZXJQYW5lbEhlYWRlclByb3BzWydpc0NvbmZpZ0FjdGl2ZSddO1xufTtcblxuLy8gSGlkZW4gYWN0aW9ucyBvbmx5IHNob3cgdXAgb24gaG92ZXJcbmNvbnN0IFN0eWxlZFBhbmVsSGVhZGVySGlkZGVuQWN0aW9ucyA9IHN0eWxlZC5kaXYuYXR0cnMoe1xuICBjbGFzc05hbWU6ICdsYXllci1wYW5lbF9faGVhZGVyX19hY3Rpb25zX19oaWRkZW4nXG59KTxTdHlsZWRQYW5lbEhlYWRlckhpZGRlbkFjdGlvbnNQcm9wcz5gXG4gIG9wYWNpdHk6IDA7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT5cbiAgICBwcm9wcy5pc0NvbmZpZ0FjdGl2ZSA/IHByb3BzLnRoZW1lLnBhbmVsQmFja2dyb3VuZEhvdmVyIDogcHJvcHMudGhlbWUucGFuZWxCYWNrZ3JvdW5kfTtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjRzIGVhc2UsIGJhY2tncm91bmQtY29sb3IgMC40cyBlYXNlO1xuXG4gICY6aG92ZXIge1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZERyYWdIYW5kbGUgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBvcGFjaXR5OiAwO1xuICB6LWluZGV4OiAxMDAwO1xuXG4gICY6aG92ZXIge1xuICAgIGN1cnNvcjogbW92ZTtcbiAgICBvcGFjaXR5OiAxO1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvckhsfTtcbiAgfVxuYDtcblxuZXhwb3J0IGNvbnN0IERyYWdIYW5kbGU6IFJlYWN0LkZDPHtcbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICBsaXN0ZW5lcnM/OiBhbnk7XG4gIGNoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlO1xufT4gPSAoe2NsYXNzTmFtZSwgbGlzdGVuZXJzLCBjaGlsZHJlbn0pID0+IChcbiAgPFN0eWxlZERyYWdIYW5kbGUgY2xhc3NOYW1lPXtjbGFzc05hbWV9IHsuLi4obGlzdGVuZXJzID8gbGlzdGVuZXJzIDoge30pfT5cbiAgICB7Y2hpbGRyZW59XG4gIDwvU3R5bGVkRHJhZ0hhbmRsZT5cbik7XG5cbmNvbnN0IG5vT3AgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG59O1xuXG5leHBvcnQgY29uc3QgTGF5ZXJMYWJlbEVkaXRvcjogUmVhY3QuRkM8TGF5ZXJMYWJlbEVkaXRvclByb3BzPiA9ICh7XG4gIGxheWVySWQsXG4gIGxhYmVsLFxuICBvbkVkaXQsXG4gIG9uRm9jdXMsXG4gIG9uQmx1clxufSkgPT4gKFxuICA8SW5saW5lSW5wdXRcbiAgICB0eXBlPVwidGV4dFwiXG4gICAgY2xhc3NOYW1lPVwibGF5ZXJfX3RpdGxlX19lZGl0b3JcIlxuICAgIGRhdGEtdGVzdGlkPXtkYXRhVGVzdElkcy5sYXllclRpdGxlRWRpdG9yfVxuICAgIHZhbHVlPXtsYWJlbH1cbiAgICBvbkNsaWNrPXtub09wfVxuICAgIG9uQ2hhbmdlPXtvbkVkaXR9XG4gICAgb25Gb2N1cz17b25Gb2N1c31cbiAgICBvbkJsdXI9e29uQmx1cn1cbiAgICBpZD17YCR7bGF5ZXJJZH06aW5wdXQtbGF5ZXItbGFiZWxgfVxuICAvPlxuKTtcblxuZXhwb3J0IGZ1bmN0aW9uIExheWVyVGl0bGVTZWN0aW9uRmFjdG9yeSgpIHtcbiAgY29uc3QgU3R5bGVkTGF5ZXJUaXRsZVNlY3Rpb24gPSBzdHlsZWQuZGl2YFxuICAgIG1hcmdpbi1sZWZ0OiA0cHg7XG4gICAgZmxleC1ncm93OiAxO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICAubGF5ZXJfX3RpdGxlX19pbm5lciB7XG4gICAgICBmbGV4LWdyb3c6IDE7XG4gICAgfVxuXG4gICAgLmxheWVyX190aXRsZV9fdHlwZSB7XG4gICAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zdWJ0ZXh0Q29sb3J9O1xuICAgICAgZm9udC1zaXplOiAxMHB4O1xuICAgICAgbGluZS1oZWlnaHQ6IDEycHg7XG4gICAgICBsZXR0ZXItc3BhY2luZzogMC4zN3B4O1xuICAgICAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XG4gICAgfVxuICBgO1xuICBjb25zdCBMYXllclRpdGxlU2VjdGlvbjogUmVhY3QuRkM8TGF5ZXJUaXRsZVNlY3Rpb25Qcm9wcz4gPSAoe1xuICAgIGxheWVyVHlwZSxcbiAgICBsYXllcklkLFxuICAgIGxhYmVsLFxuICAgIG9uVXBkYXRlTGF5ZXJMYWJlbCxcbiAgICBvbkZvY3VzLFxuICAgIG9uQmx1clxuICB9KSA9PiAoXG4gICAgPFN0eWxlZExheWVyVGl0bGVTZWN0aW9uIGNsYXNzTmFtZT1cImxheWVyX190aXRsZVwiPlxuICAgICAgPGRpdj5cbiAgICAgICAgPExheWVyTGFiZWxFZGl0b3JcbiAgICAgICAgICBsYXllcklkPXtsYXllcklkfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICBvbkVkaXQ9e29uVXBkYXRlTGF5ZXJMYWJlbH1cbiAgICAgICAgICBvbkZvY3VzPXtvbkZvY3VzfVxuICAgICAgICAgIG9uQmx1cj17b25CbHVyfVxuICAgICAgICAvPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImxheWVyX190aXRsZV9fdHlwZVwiPlxuICAgICAgICAgIHtsYXllclR5cGUgJiYgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9e2BsYXllci50eXBlLiR7bGF5ZXJUeXBlLnRvTG93ZXJDYXNlKCl9YH0gLz59XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9TdHlsZWRMYXllclRpdGxlU2VjdGlvbj5cbiAgKTtcbiAgcmV0dXJuIExheWVyVGl0bGVTZWN0aW9uO1xufVxuXG5MYXllclBhbmVsSGVhZGVyQWN0aW9uU2VjdGlvbkZhY3RvcnkuZGVwcyA9IFtQYW5lbEhlYWRlckFjdGlvbkZhY3RvcnldO1xuXG5leHBvcnQgZnVuY3Rpb24gTGF5ZXJQYW5lbEhlYWRlckFjdGlvblNlY3Rpb25GYWN0b3J5KFxuICBQYW5lbEhlYWRlckFjdGlvbjogUmV0dXJuVHlwZTx0eXBlb2YgUGFuZWxIZWFkZXJBY3Rpb25GYWN0b3J5PlxuKSB7XG4gIGNvbnN0IExheWVyUGFuZWxIZWFkZXJBY3Rpb25TZWN0aW9uOiBSZWFjdC5GQzxMYXllclBhbmVsSGVhZGVyQWN0aW9uU2VjdGlvblByb3BzPiA9IChcbiAgICBwcm9wczogTGF5ZXJQYW5lbEhlYWRlckFjdGlvblNlY3Rpb25Qcm9wc1xuICApID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBpc0NvbmZpZ0FjdGl2ZSxcbiAgICAgIGFsbG93RHVwbGljYXRlLFxuICAgICAgaXNWaXNpYmxlLFxuICAgICAgaXNWYWxpZCxcbiAgICAgIGxheWVySWQsXG4gICAgICBvblRvZ2dsZVZpc2liaWxpdHksXG4gICAgICBvblJlc2V0SXNWYWxpZCxcbiAgICAgIG9uVG9nZ2xlRW5hYmxlQ29uZmlnLFxuICAgICAgb25EdXBsaWNhdGVMYXllcixcbiAgICAgIG9uUmVtb3ZlTGF5ZXIsXG4gICAgICBvblpvb21Ub0xheWVyLFxuICAgICAgc2hvd1JlbW92ZUxheWVyID0gdHJ1ZSxcbiAgICAgIGlzRWRpdGluZ0xhYmVsLFxuICAgICAgLy8gVE9ETzogbWF5IG5vdCBjb250YWluIGFsbCBuZWNlc3NhcnkgaWNvbnMgZm9yIGFsbCBhY3Rpb25zLCBlLmcuIGFjdGlvbkljb25zLmR1cGxpY2F0ZS4gTmVlZCB0byB0byBtZXJnZSByYXRoZXIgdGhhbiByZXBsYWNlXG4gICAgICBhY3Rpb25JY29ucyA9IGRlZmF1bHRBY3Rpb25JY29uc1xuICAgIH0gPSBwcm9wcztcbiAgICByZXR1cm4gKFxuICAgICAgPEhlYWRlckFjdGlvblNlY3Rpb24gY2xhc3NOYW1lPVwibGF5ZXItcGFuZWxfX2hlYWRlcl9fYWN0aW9uc1wiIGlzRWRpdGluZ0xhYmVsPXtpc0VkaXRpbmdMYWJlbH0+XG4gICAgICAgIDxTdHlsZWRQYW5lbEhlYWRlckhpZGRlbkFjdGlvbnMgaXNDb25maWdBY3RpdmU9e2lzQ29uZmlnQWN0aXZlfT5cbiAgICAgICAgICB7c2hvd1JlbW92ZUxheWVyID8gKFxuICAgICAgICAgICAgPFBhbmVsSGVhZGVyQWN0aW9uXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImxheWVyX19yZW1vdmUtbGF5ZXJcIlxuICAgICAgICAgICAgICB0ZXN0SWQ9XCJyZW1vdmUtbGF5ZXItYWN0aW9uXCJcbiAgICAgICAgICAgICAgaWQ9e2xheWVySWR9XG4gICAgICAgICAgICAgIHRvb2x0aXA9eyd0b29sdGlwLnJlbW92ZUxheWVyJ31cbiAgICAgICAgICAgICAgb25DbGljaz17b25SZW1vdmVMYXllcn1cbiAgICAgICAgICAgICAgdG9vbHRpcFR5cGU9XCJlcnJvclwiXG4gICAgICAgICAgICAgIEljb25Db21wb25lbnQ9e2FjdGlvbkljb25zLnJlbW92ZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgPFBhbmVsSGVhZGVyQWN0aW9uXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJsYXllcl9fZHVwbGljYXRlXCJcbiAgICAgICAgICAgIGlkPXtsYXllcklkfVxuICAgICAgICAgICAgdG9vbHRpcD17J3Rvb2x0aXAuZHVwbGljYXRlTGF5ZXInfVxuICAgICAgICAgICAgb25DbGljaz17b25EdXBsaWNhdGVMYXllcn1cbiAgICAgICAgICAgIEljb25Db21wb25lbnQ9e2FjdGlvbkljb25zLmR1cGxpY2F0ZX1cbiAgICAgICAgICAgIGRpc2FibGVkPXshYWxsb3dEdXBsaWNhdGV9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8UGFuZWxIZWFkZXJBY3Rpb25cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImxheWVyX196b29tLXRvLWxheWVyXCJcbiAgICAgICAgICAgIGlkPXtsYXllcklkfVxuICAgICAgICAgICAgdG9vbHRpcD17J3Rvb2x0aXAuem9vbVRvTGF5ZXInfVxuICAgICAgICAgICAgb25DbGljaz17b25ab29tVG9MYXllcn1cbiAgICAgICAgICAgIEljb25Db21wb25lbnQ9e2FjdGlvbkljb25zLmNyb3NzaGFpcnN9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9TdHlsZWRQYW5lbEhlYWRlckhpZGRlbkFjdGlvbnM+XG4gICAgICAgIHtpc1ZhbGlkID8gKFxuICAgICAgICAgIDxQYW5lbEhlYWRlckFjdGlvblxuICAgICAgICAgICAgY2xhc3NOYW1lPVwibGF5ZXJfX3Zpc2liaWxpdHktdG9nZ2xlXCJcbiAgICAgICAgICAgIGlkPXtsYXllcklkfVxuICAgICAgICAgICAgdG9vbHRpcD17aXNWaXNpYmxlID8gJ3Rvb2x0aXAuaGlkZUxheWVyJyA6ICd0b29sdGlwLnNob3dMYXllcid9XG4gICAgICAgICAgICBvbkNsaWNrPXtvblRvZ2dsZVZpc2liaWxpdHl9XG4gICAgICAgICAgICBJY29uQ29tcG9uZW50PXtpc1Zpc2libGUgPyBhY3Rpb25JY29ucy52aXNpYmxlIDogYWN0aW9uSWNvbnMuaGlkZGVufVxuICAgICAgICAgIC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPFBhbmVsSGVhZGVyQWN0aW9uXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJsYXllcl9faXMtdmFsaWQtcmVmcmVzaFwiXG4gICAgICAgICAgICBpZD17bGF5ZXJJZH1cbiAgICAgICAgICAgIHRvb2x0aXA9eyd0b29sdGlwLnJlc2V0QWZ0ZXJFcnJvcid9XG4gICAgICAgICAgICBvbkNsaWNrPXtvblJlc2V0SXNWYWxpZH1cbiAgICAgICAgICAgIEljb25Db21wb25lbnQ9e2FjdGlvbkljb25zLnJlc2V0SXNWYWxpZH1cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuXG4gICAgICAgIDxQYW5lbEhlYWRlckFjdGlvblxuICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NuYW1lcygnbGF5ZXJfX2VuYWJsZS1jb25maWcgJywge1xuICAgICAgICAgICAgJ2lzLW9wZW4nOiBpc0NvbmZpZ0FjdGl2ZVxuICAgICAgICAgIH0pfVxuICAgICAgICAgIGlkPXtsYXllcklkfVxuICAgICAgICAgIHRvb2x0aXA9eyd0b29sdGlwLmxheWVyU2V0dGluZ3MnfVxuICAgICAgICAgIG9uQ2xpY2s9e29uVG9nZ2xlRW5hYmxlQ29uZmlnfVxuICAgICAgICAgIEljb25Db21wb25lbnQ9e2FjdGlvbkljb25zLmVuYWJsZUNvbmZpZ31cbiAgICAgICAgLz5cbiAgICAgIDwvSGVhZGVyQWN0aW9uU2VjdGlvbj5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBMYXllclBhbmVsSGVhZGVyQWN0aW9uU2VjdGlvbjtcbn1cblxuY29uc3QgU3R5bGVkSGVhZGVyV2FyaW5nID0gc3R5bGVkLmRpdmBcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICByaWdodDogLTlweDtcbiAgdG9wOiBjYWxjKDUwJSAtIDlweCk7XG4gIGNvbG9yOiAkeyh7dGhlbWV9KSA9PiB0aGVtZS5ub3RpZmljYXRpb25Db2xvcnMud2FybmluZ307XG5gO1xuXG5leHBvcnQgY29uc3QgSGVhZGVyV2FybmluZyA9ICh7d2FybmluZywgaWR9KSA9PiAoXG4gIDxTdHlsZWRIZWFkZXJXYXJpbmc+XG4gICAgPFdhcm5pbmdTaWduIGRhdGEtdGlwIGRhdGEtZm9yPXtgbGF5ZXItJHtpZH0td2FybmluZ2B9IGhlaWdodD1cIjE2cHhcIiAvPlxuICAgIDxUb29sdGlwIGlkPXtgbGF5ZXItJHtpZH0td2FybmluZ2B9IHR5cGU9XCJ3YXJuaW5nXCIgZWZmZWN0PVwic29saWRcIiB0ZXh0Q29sb3I9XCJibGFja1wiPlxuICAgICAge3dhcm5pbmd9XG4gICAgPC9Ub29sdGlwPlxuICA8L1N0eWxlZEhlYWRlcldhcmluZz5cbik7XG5cbmNvbnN0IGRlZmF1bHRBY3Rpb25JY29ucyA9IHtcbiAgcmVtb3ZlOiBUcmFzaCxcbiAgdmlzaWJsZTogRXllU2VlbixcbiAgaGlkZGVuOiBFeWVVbnNlZW4sXG4gIGVuYWJsZUNvbmZpZzogQXJyb3dEb3duLFxuICBkdXBsaWNhdGU6IENvcHksXG4gIHJlc2V0SXNWYWxpZDogUmVzZXQsXG4gIGNyb3NzaGFpcnM6IENyb3NzaGFpcnNcbn07XG5cbkxheWVyUGFuZWxIZWFkZXJGYWN0b3J5LmRlcHMgPSBbTGF5ZXJUaXRsZVNlY3Rpb25GYWN0b3J5LCBMYXllclBhbmVsSGVhZGVyQWN0aW9uU2VjdGlvbkZhY3RvcnldO1xuXG5mdW5jdGlvbiBMYXllclBhbmVsSGVhZGVyRmFjdG9yeShcbiAgTGF5ZXJUaXRsZVNlY3Rpb246IFJldHVyblR5cGU8dHlwZW9mIExheWVyVGl0bGVTZWN0aW9uRmFjdG9yeT4sXG4gIExheWVyUGFuZWxIZWFkZXJBY3Rpb25TZWN0aW9uOiBSZXR1cm5UeXBlPHR5cGVvZiBMYXllclBhbmVsSGVhZGVyQWN0aW9uU2VjdGlvbkZhY3Rvcnk+XG4pIHtcbiAgY29uc3QgTGF5ZXJQYW5lbEhlYWRlcjogUmVhY3QuRkM8TGF5ZXJQYW5lbEhlYWRlclByb3BzPiA9IHByb3BzID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBpc0NvbmZpZ0FjdGl2ZSxcbiAgICAgIGlzRHJhZ05Ecm9wRW5hYmxlZCA9IHRydWUsXG4gICAgICBpc1ZhbGlkLFxuICAgICAgd2FybmluZyxcbiAgICAgIGxhYmVsLFxuICAgICAgbGF5ZXJJZCxcbiAgICAgIGxheWVyVHlwZSxcbiAgICAgIGxhYmVsUkNHQ29sb3JWYWx1ZXMsXG4gICAgICBvblVwZGF0ZUxheWVyTGFiZWwsXG4gICAgICBvblRvZ2dsZUVuYWJsZUNvbmZpZyxcbiAgICAgIGxpc3RlbmVyc1xuICAgIH0gPSBwcm9wcztcbiAgICBjb25zdCBbaXNFZGl0aW5nTGFiZWwsIHNldElzRWRpdGluZ0xhYmVsXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgICByZXR1cm4gKFxuICAgICAgPFN0eWxlZExheWVyUGFuZWxIZWFkZXJcbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc25hbWVzKCdsYXllci1wYW5lbF9faGVhZGVyJywge1xuICAgICAgICAgICdzb3J0LS1oYW5kbGUnOiAhaXNDb25maWdBY3RpdmVcbiAgICAgICAgfSl9XG4gICAgICAgIGlzVmFsaWQ9e2lzVmFsaWR9XG4gICAgICAgIHdhcm5pbmc9e3dhcm5pbmd9XG4gICAgICAgIGFjdGl2ZT17aXNDb25maWdBY3RpdmV9XG4gICAgICAgIGxhYmVsUkNHQ29sb3JWYWx1ZXM9e2xhYmVsUkNHQ29sb3JWYWx1ZXN9XG4gICAgICAgIG9uQ2xpY2s9e29uVG9nZ2xlRW5hYmxlQ29uZmlnfVxuICAgICAgPlxuICAgICAgICB7d2FybmluZyA/IDxIZWFkZXJXYXJuaW5nIHdhcm5pbmc9e3dhcm5pbmd9IGlkPXtsYXllcklkfSAvPiA6IG51bGx9XG4gICAgICAgIDxIZWFkZXJMYWJlbFNlY3Rpb24gY2xhc3NOYW1lPVwibGF5ZXItcGFuZWxfX2hlYWRlcl9fY29udGVudFwiPlxuICAgICAgICAgIHtpc0RyYWdORHJvcEVuYWJsZWQgPyAoXG4gICAgICAgICAgICA8RHJhZ0hhbmRsZSBjbGFzc05hbWU9XCJsYXllcl9fZHJhZy1oYW5kbGVcIiBsaXN0ZW5lcnM9e2xpc3RlbmVyc30+XG4gICAgICAgICAgICAgIDxWZXJ0RG90cyBoZWlnaHQ9XCIyMHB4XCIgLz5cbiAgICAgICAgICAgIDwvRHJhZ0hhbmRsZT5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsYXllcl9fZHJhZy1oYW5kbGVfX3BsYWNlaG9sZGVyXCIgLz5cbiAgICAgICAgICApfVxuICAgICAgICAgIDxMYXllclRpdGxlU2VjdGlvblxuICAgICAgICAgICAgbGF5ZXJJZD17bGF5ZXJJZH1cbiAgICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICAgIG9uVXBkYXRlTGF5ZXJMYWJlbD17b25VcGRhdGVMYXllckxhYmVsfVxuICAgICAgICAgICAgbGF5ZXJUeXBlPXtsYXllclR5cGV9XG4gICAgICAgICAgICBvbkZvY3VzPXsoKSA9PiB7XG4gICAgICAgICAgICAgIHNldElzRWRpdGluZ0xhYmVsKHRydWUpO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIG9uQmx1cj17KCkgPT4ge1xuICAgICAgICAgICAgICBzZXRJc0VkaXRpbmdMYWJlbChmYWxzZSk7XG4gICAgICAgICAgICB9fVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvSGVhZGVyTGFiZWxTZWN0aW9uPlxuICAgICAgICA8TGF5ZXJQYW5lbEhlYWRlckFjdGlvblNlY3Rpb24gey4uLnByb3BzfSBpc0VkaXRpbmdMYWJlbD17aXNFZGl0aW5nTGFiZWx9IC8+XG4gICAgICA8L1N0eWxlZExheWVyUGFuZWxIZWFkZXI+XG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gTGF5ZXJQYW5lbEhlYWRlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTGF5ZXJQYW5lbEhlYWRlckZhY3Rvcnk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBT0EsSUFBQUMsV0FBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsaUJBQUEsR0FBQUosdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLGtCQUFBLEdBQUFGLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSyxrQkFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sTUFBQSxHQUFBTixPQUFBO0FBYUEsSUFBQU8sYUFBQSxHQUFBUCxPQUFBO0FBQ0EsSUFBQVEsVUFBQSxH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