kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
303 lines (301 loc) • 48.5 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.SaveExportDropdownFactory = exports.PanelHeaderDropdownFactory = exports.PanelAction = exports.CloudStorageDropdownFactory = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _classnames = _interopRequireDefault(require("classnames"));
var _reselect = require("reselect");
var _styledComponents2 = require("../common/styled-components");
var _logo = _interopRequireDefault(require("../common/logo"));
var _icons = require("../common/icons");
var _toolbar = _interopRequireDefault(require("../common/toolbar"));
var _toolbarItem = _interopRequireDefault(require("../common/toolbar-item"));
var _localization = require("@kepler.gl/localization");
var _useOnClickOutside = _interopRequireDefault(require("../hooks/use-on-click-outside"));
var _excluded = ["items"],
_excluded2 = ["items"],
_excluded3 = ["appName", "appWebsite", "version", "actionItems", "visibleDropdown", "showExportDropdown", "hideExportDropdown"];
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5; // 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; }
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
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; }
var StyledPanelHeader = _styledComponents["default"].div.attrs(function (props) {
return {
className: (0, _classnames["default"])('side-side-panel__header', props.className)
};
})(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n padding: 12px 16px 0 16px;\n"])), function (props) {
return props.theme.sidePanelHeaderBg;
});
var StyledPanelHeaderTop = _styledComponents["default"].div.attrs(function (props) {
return {
className: (0, _classnames["default"])('side-panel__header__top', props.className)
};
})(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: space-between;\n margin-bottom: 16px;\n width: 100%;\n"])));
var StyledPanelTopActions = _styledComponents["default"].div.attrs({
className: 'side-panel__top__actions'
})(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n"])));
var StyledPanelAction = _styledComponents["default"].div.attrs({
className: 'side-panel__panel-header__action'
})(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n align-items: center;\n border-radius: 2px;\n color: ", ";\n display: flex;\n height: 26px;\n justify-content: space-between;\n margin-left: 4px;\n padding: 5px;\n font-weight: bold;\n p {\n display: inline-block;\n margin-right: 6px;\n }\n a {\n height: 20px;\n }\n\n &:hover {\n cursor: pointer;\n color: ", ";\n\n a {\n color: ", ";\n }\n }\n"])), function (props) {
return props.active ? props.theme.textColorHl : props.theme.subtextColor;
}, function (props) {
return props.theme.textColorHl;
}, function (props) {
return props.theme.textColorHl;
});
var StyledToolbar = (0, _styledComponents["default"])(_toolbar["default"])(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n"])));
var PanelAction = exports.PanelAction = /*#__PURE__*/_react["default"].memo(function (_ref) {
var item = _ref.item,
showExportDropdown = _ref.showExportDropdown;
var onClick = (0, _react.useCallback)(function () {
if (item.dropdownComponent) {
showExportDropdown(item.id);
} else {
item.onClick && item.onClick();
}
}, [item, showExportDropdown]);
return /*#__PURE__*/_react["default"].createElement(StyledPanelAction, {
id: "".concat(item.id, "-action"),
"data-tip": true,
"data-for": "".concat(item.id, "-action"),
onClick: onClick
}, item.label ? /*#__PURE__*/_react["default"].createElement("p", null, item.label) : null, /*#__PURE__*/_react["default"].createElement("a", {
target: item.blank ? '_blank' : '',
href: item.href,
rel: "noreferrer"
}, /*#__PURE__*/_react["default"].createElement(item.iconComponent, (0, _extends2["default"])({
height: "18px"
}, item.iconComponentProps))), item.tooltip ? /*#__PURE__*/_react["default"].createElement(_styledComponents2.Tooltip, {
id: "".concat(item.id, "-action"),
place: "bottom",
delayShow: 500,
effect: "solid"
}, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, {
id: item.tooltip
})) : null);
});
PanelAction.displayName = 'PanelAction';
var PanelHeaderDropdownFactory = exports.PanelHeaderDropdownFactory = function PanelHeaderDropdownFactory() {
var PanelHeaderDropdown = function PanelHeaderDropdown(_ref2) {
var items = _ref2.items,
show = _ref2.show,
onClose = _ref2.onClose,
id = _ref2.id;
var ref = (0, _useOnClickOutside["default"])(onClose);
return /*#__PURE__*/_react["default"].createElement(StyledToolbar, {
show: show,
className: "".concat(id, "-dropdown")
}, show ? /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledPanelDropdown, {
type: "dark",
ref: ref,
className: "panel-header-dropdown__inner"
}, items.map(function (item) {
return /*#__PURE__*/_react["default"].createElement(_toolbarItem["default"], {
id: item.key,
key: item.key,
label: item.label,
icon: item.icon,
onClick: item.onClick,
onClose: onClose
});
})) : null);
};
return PanelHeaderDropdown;
};
var getDropdownItemsSelector = function getDropdownItemsSelector() {
return (0, _reselect.createSelector)(function (props) {
return props;
}, function (props) {
return (props.items || []).map(function (t) {
return _objectSpread(_objectSpread({}, t), {}, {
onClick: t.onClick && t.onClick(props) ? t.onClick(props) : null
});
}).filter(function (l) {
return l.onClick;
});
});
};
var SaveExportDropdownFactory = exports.SaveExportDropdownFactory = function SaveExportDropdownFactory(PanelHeaderDropdown) {
var dropdownItemsSelector = getDropdownItemsSelector();
var defaultItems = [{
label: 'toolbar.exportImage',
icon: _icons.Picture,
key: 'image',
onClick: function onClick(props) {
return props.onExportImage;
}
}, {
label: 'toolbar.exportData',
icon: _icons.DataTable,
key: 'data',
onClick: function onClick(props) {
return props.onExportData;
}
}, {
label: 'toolbar.exportMap',
icon: _icons.BaseMap,
key: 'map',
onClick: function onClick(props) {
return props.onExportMap;
}
}, {
label: 'toolbar.saveMap',
icon: _icons.Save2,
key: 'save',
onClick: function onClick(props) {
return props.onSaveMap;
}
}, {
label: 'toolbar.shareMapURL',
icon: _icons.Share,
key: 'share',
onClick: function onClick(props) {
return props.onShareMap;
}
}];
var SaveExportDropdown = function SaveExportDropdown(_ref3) {
var _ref3$items = _ref3.items,
items = _ref3$items === void 0 ? defaultItems : _ref3$items,
restProps = (0, _objectWithoutProperties2["default"])(_ref3, _excluded);
var props = _objectSpread(_objectSpread({}, restProps), {}, {
items: items
});
return /*#__PURE__*/_react["default"].createElement(PanelHeaderDropdown, {
items: dropdownItemsSelector(props),
show: props.show,
onClose: props.onClose,
id: "save-export"
});
};
SaveExportDropdown.defaultItems = defaultItems;
return SaveExportDropdown;
};
SaveExportDropdownFactory.deps = [PanelHeaderDropdownFactory];
var CloudStorageDropdownFactory = exports.CloudStorageDropdownFactory = function CloudStorageDropdownFactory(PanelHeaderDropdown) {
var dropdownItemsSelector = getDropdownItemsSelector();
var defaultItems = [{
label: 'Save',
icon: _icons.Save2,
key: 'save',
onClick: function onClick(props) {
return props.onSaveToStorage;
}
}, {
label: 'Save As',
icon: _icons.Save2,
key: 'saveAs',
onClick: function onClick(props) {
return props.onSaveAsToStorage;
}
}];
var CloudStorageDropdown = function CloudStorageDropdown(_ref4) {
var _ref4$items = _ref4.items,
items = _ref4$items === void 0 ? defaultItems : _ref4$items,
restProps = (0, _objectWithoutProperties2["default"])(_ref4, _excluded2);
var props = _objectSpread(_objectSpread({}, restProps), {}, {
items: items
});
return /*#__PURE__*/_react["default"].createElement(PanelHeaderDropdown, {
items: dropdownItemsSelector(props),
show: props.show,
onClose: props.onClose,
id: "cloud-storage"
});
};
CloudStorageDropdown.defaultItems = defaultItems;
return CloudStorageDropdown;
};
CloudStorageDropdownFactory.deps = [PanelHeaderDropdownFactory];
PanelHeaderFactory.deps = [SaveExportDropdownFactory, CloudStorageDropdownFactory];
function PanelHeaderFactory(SaveExportDropdown, CloudStorageDropdown) {
var _PanelHeader;
return _PanelHeader = /*#__PURE__*/function (_Component) {
function PanelHeader() {
(0, _classCallCheck2["default"])(this, PanelHeader);
return _callSuper(this, PanelHeader, arguments);
}
(0, _inherits2["default"])(PanelHeader, _Component);
return (0, _createClass2["default"])(PanelHeader, [{
key: "render",
value: function render() {
var _this$props = this.props,
appName = _this$props.appName,
appWebsite = _this$props.appWebsite,
version = _this$props.version,
actionItems = _this$props.actionItems,
visibleDropdown = _this$props.visibleDropdown,
showExportDropdown = _this$props.showExportDropdown,
hideExportDropdown = _this$props.hideExportDropdown,
dropdownCallbacks = (0, _objectWithoutProperties2["default"])(_this$props, _excluded3);
var items = actionItems || [];
// don't render cloud storage icon if onSaveToStorage is not provided
if (typeof this.props.onSaveToStorage !== 'function') {
items = items.filter(function (ai) {
return ai.id !== 'storage';
});
}
return /*#__PURE__*/_react["default"].createElement(StyledPanelHeader, {
className: "side-panel__panel-header"
}, /*#__PURE__*/_react["default"].createElement(StyledPanelHeaderTop, {
className: "side-panel__panel-header__top"
}, this.props.logoComponent && /*#__PURE__*/_react["default"].createElement(this.props.logoComponent, {
appName: appName,
version: version,
appWebsite: appWebsite
}), /*#__PURE__*/_react["default"].createElement(StyledPanelTopActions, null, items.map(function (item) {
return /*#__PURE__*/_react["default"].createElement("div", {
className: "side-panel__panel-header__right",
key: item.id,
style: {
position: 'relative'
}
}, /*#__PURE__*/_react["default"].createElement(PanelAction, {
item: item,
showExportDropdown: showExportDropdown
}), item.dropdownComponent ? /*#__PURE__*/_react["default"].createElement(item.dropdownComponent, (0, _extends2["default"])({
onClose: hideExportDropdown,
show: visibleDropdown === item.id
}, dropdownCallbacks)) : null);
}))));
}
}]);
}(_react.Component), (0, _defineProperty2["default"])(_PanelHeader, "defaultProps", {
logoComponent: _logo["default"],
actionItems: [{
id: 'storage',
iconComponent: _icons.Db,
tooltip: 'tooltip.cloudStorage',
onClick: function onClick() {
return;
},
dropdownComponent: CloudStorageDropdown
}, {
id: 'save',
iconComponent: _icons.Save,
onClick: function onClick() {
return;
},
label: 'Share',
dropdownComponent: SaveExportDropdown
}]
}), _PanelHeader;
}
var _default = exports["default"] = PanelHeaderFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY2xhc3NuYW1lcyIsIl9yZXNlbGVjdCIsIl9zdHlsZWRDb21wb25lbnRzMiIsIl9sb2dvIiwiX2ljb25zIiwiX3Rvb2xiYXIiLCJfdG9vbGJhckl0ZW0iLCJfbG9jYWxpemF0aW9uIiwiX3VzZU9uQ2xpY2tPdXRzaWRlIiwiX2V4Y2x1ZGVkIiwiX2V4Y2x1ZGVkMiIsIl9leGNsdWRlZDMiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX3RlbXBsYXRlT2JqZWN0MyIsIl90ZW1wbGF0ZU9iamVjdDQiLCJfdGVtcGxhdGVPYmplY3Q1IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiX2NhbGxTdXBlciIsIm8iLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsImFwcGx5IiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJTdHlsZWRQYW5lbEhlYWRlciIsInN0eWxlZCIsImRpdiIsImF0dHJzIiwicHJvcHMiLCJjbGFzc05hbWUiLCJjbGFzc25hbWVzIiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJ0aGVtZSIsInNpZGVQYW5lbEhlYWRlckJnIiwiU3R5bGVkUGFuZWxIZWFkZXJUb3AiLCJTdHlsZWRQYW5lbFRvcEFjdGlvbnMiLCJTdHlsZWRQYW5lbEFjdGlvbiIsImFjdGl2ZSIsInRleHRDb2xvckhsIiwic3VidGV4dENvbG9yIiwiU3R5bGVkVG9vbGJhciIsIlRvb2xiYXIiLCJQYW5lbEFjdGlvbiIsImV4cG9ydHMiLCJSZWFjdCIsIm1lbW8iLCJfcmVmIiwiaXRlbSIsInNob3dFeHBvcnREcm9wZG93biIsIm9uQ2xpY2siLCJ1c2VDYWxsYmFjayIsImRyb3Bkb3duQ29tcG9uZW50IiwiaWQiLCJjcmVhdGVFbGVtZW50IiwiY29uY2F0IiwibGFiZWwiLCJ0YXJnZXQiLCJibGFuayIsImhyZWYiLCJyZWwiLCJpY29uQ29tcG9uZW50IiwiX2V4dGVuZHMyIiwiaGVpZ2h0IiwiaWNvbkNvbXBvbmVudFByb3BzIiwidG9vbHRpcCIsIlRvb2x0aXAiLCJwbGFjZSIsImRlbGF5U2hvdyIsImVmZmVjdCIsIkZvcm1hdHRlZE1lc3NhZ2UiLCJkaXNwbGF5TmFtZSIsIlBhbmVsSGVhZGVyRHJvcGRvd25GYWN0b3J5IiwiUGFuZWxIZWFkZXJEcm9wZG93biIsIl9yZWYyIiwiaXRlbXMiLCJzaG93Iiwib25DbG9zZSIsInJlZiIsInVzZU9uQ2xpY2tPdXRzaWRlIiwiU3R5bGVkUGFuZWxEcm9wZG93biIsInR5cGUiLCJtYXAiLCJrZXkiLCJpY29uIiwiZ2V0RHJvcGRvd25JdGVtc1NlbGVjdG9yIiwiY3JlYXRlU2VsZWN0b3IiLCJsIiwiU2F2ZUV4cG9ydERyb3Bkb3duRmFjdG9yeSIsImRyb3Bkb3duSXRlbXNTZWxlY3RvciIsImRlZmF1bHRJdGVtcyIsIlBpY3R1cmUiLCJvbkV4cG9ydEltYWdlIiwiRGF0YVRhYmxlIiwib25FeHBvcnREYXRhIiwiQmFzZU1hcCIsIm9uRXhwb3J0TWFwIiwiU2F2ZTIiLCJvblNhdmVNYXAiLCJTaGFyZSIsIm9uU2hhcmVNYXAiLCJTYXZlRXhwb3J0RHJvcGRvd24iLCJfcmVmMyIsIl9yZWYzJGl0ZW1zIiwicmVzdFByb3BzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsImRlcHMiLCJDbG91ZFN0b3JhZ2VEcm9wZG93bkZhY3RvcnkiLCJvblNhdmVUb1N0b3JhZ2UiLCJvblNhdmVBc1RvU3RvcmFnZSIsIkNsb3VkU3RvcmFnZURyb3Bkb3duIiwiX3JlZjQiLCJfcmVmNCRpdGVtcyIsIlBhbmVsSGVhZGVyRmFjdG9yeSIsIl9QYW5lbEhlYWRlciIsIl9Db21wb25lbnQiLCJQYW5lbEhlYWRlciIsIl9jbGFzc0NhbGxDaGVjazIiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsInZhbHVlIiwicmVuZGVyIiwiX3RoaXMkcHJvcHMiLCJhcHBOYW1lIiwiYXBwV2Vic2l0ZSIsInZlcnNpb24iLCJhY3Rpb25JdGVtcyIsInZpc2libGVEcm9wZG93biIsImhpZGVFeHBvcnREcm9wZG93biIsImRyb3Bkb3duQ2FsbGJhY2tzIiwiYWkiLCJsb2dvQ29tcG9uZW50Iiwic3R5bGUiLCJwb3NpdGlvbiIsIkNvbXBvbmVudCIsIktlcGxlckdsTG9nbyIsIkRiIiwiU2F2ZSIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NpZGUtcGFuZWwvcGFuZWwtaGVhZGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnQsIHVzZUNhbGxiYWNrfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHtjcmVhdGVTZWxlY3Rvcn0gZnJvbSAncmVzZWxlY3QnO1xuaW1wb3J0IHtTdHlsZWRQYW5lbERyb3Bkb3duLCBUb29sdGlwfSBmcm9tICcuLi9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IEtlcGxlckdsTG9nbyBmcm9tICcuLi9jb21tb24vbG9nbyc7XG5pbXBvcnQge1NhdmUsIERhdGFUYWJsZSwgU2F2ZTIsIFBpY3R1cmUsIERiLCBCYXNlTWFwLCBTaGFyZX0gZnJvbSAnLi4vY29tbW9uL2ljb25zJztcbmltcG9ydCBUb29sYmFyLCB7VG9vbGJhclByb3BzfSBmcm9tICcuLi9jb21tb24vdG9vbGJhcic7XG5pbXBvcnQgVG9vbGJhckl0ZW0sIHtUb29sYmFySXRlbVByb3BzfSBmcm9tICcuLi9jb21tb24vdG9vbGJhci1pdGVtJztcbmltcG9ydCB7Rm9ybWF0dGVkTWVzc2FnZX0gZnJvbSAnQGtlcGxlci5nbC9sb2NhbGl6YXRpb24nO1xuaW1wb3J0IHtVaVN0YXRlfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7QmFzZVByb3BzfSBmcm9tICcuLi9jb21tb24vaWNvbnMnO1xuaW1wb3J0IHVzZU9uQ2xpY2tPdXRzaWRlIGZyb20gJy4uL2hvb2tzL3VzZS1vbi1jbGljay1vdXRzaWRlJztcblxudHlwZSBTdHlsZWRQYW5lbEFjdGlvblByb3BzID0ge1xuICBhY3RpdmU/OiBib29sZWFuO1xufTtcblxudHlwZSBBY3Rpb25JdGVtID0ge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbD86IHN0cmluZztcbiAgYmxhbms/OiBib29sZWFuO1xuICBocmVmPzogc3RyaW5nO1xuICB0b29sdGlwPzogc3RyaW5nO1xuICBpY29uQ29tcG9uZW50OiBSZWFjdC5Db21wb25lbnRUeXBlPFBhcnRpYWw8QmFzZVByb3BzPj47XG4gIGljb25Db21wb25lbnRQcm9wcz86IEJhc2VQcm9wcztcbiAgZHJvcGRvd25Db21wb25lbnQ/OiBSZWFjdC5Db21wb25lbnRUeXBlPERyb3Bkb3duQ29tcG9uZW50UHJvcHM+O1xuICBvbkNsaWNrPzogKCkgPT4gdm9pZDtcbn07XG5cbnR5cGUgUGFuZWxBY3Rpb25Qcm9wcyA9IHtcbiAgaXRlbTogQWN0aW9uSXRlbTtcbiAgc2hvd0V4cG9ydERyb3Bkb3duOiAoc3RyaW5nKSA9PiB2b2lkO1xufTtcblxudHlwZSBQYW5lbEhlYWRlckRyb3Bkb3duUHJvcHMgPSB7XG4gIGl0ZW1zOiBUb29sYmFySXRlbVByb3BzW107XG4gIHNob3c/OiBib29sZWFuO1xuICBvbkNsb3NlOiAoKSA9PiB2b2lkO1xuICBpZDogc3RyaW5nO1xufTtcblxudHlwZSBMb2dvQ29tcG9uZW50UHJvcHMgPSB7XG4gIGFwcE5hbWU6IHN0cmluZztcbiAgYXBwV2Vic2l0ZTogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG59O1xuXG50eXBlIERyb3Bkb3duQ2FsbGJhY2tzID0ge1xuICBsb2dvQ29tcG9uZW50PzogUmVhY3QuRkM8TG9nb0NvbXBvbmVudFByb3BzPiB8IFJlYWN0LkNvbXBvbmVudFR5cGU8TG9nb0NvbXBvbmVudFByb3BzPjtcbiAgb25FeHBvcnRJbWFnZTogKCkgPT4gdm9pZDtcbiAgb25FeHBvcnREYXRhOiAoKSA9PiB2b2lkO1xuICBvbkV4cG9ydENvbmZpZz86ICgpID0+IHZvaWQ7XG4gIG9uRXhwb3J0TWFwOiAoKSA9PiB2b2lkO1xuICBvblNhdmVUb1N0b3JhZ2U6ICgoKSA9PiB2b2lkKSB8IG51bGw7XG4gIG9uU2F2ZUFzVG9TdG9yYWdlOiAoKCkgPT4gdm9pZCkgfCBudWxsO1xuICBvblNhdmVNYXA/OiAoKSA9PiB2b2lkO1xuICBvblNoYXJlTWFwOiAoKCkgPT4gdm9pZCkgfCBudWxsO1xufTtcblxudHlwZSBJdGVtID0ge1xuICBsYWJlbDogc3RyaW5nO1xuICBpY29uOiBSZWFjdC5Db21wb25lbnRUeXBlPFBhcnRpYWw8QmFzZVByb3BzPj47XG4gIGtleTogc3RyaW5nO1xuICBvbkNsaWNrOiAocDogRHJvcGRvd25Db21wb25lbnRQcm9wcykgPT4gKCgpID0+IHZvaWQpIHwgbnVsbDtcbn07XG5cbnR5cGUgRHJvcGRvd25Db21wb25lbnRQcm9wcyA9IHtcbiAgc2hvdzogYm9vbGVhbjtcbiAgb25DbG9zZTogKCkgPT4gdm9pZDtcbiAgaXRlbXM/OiBJdGVtW107XG59ICYgRHJvcGRvd25DYWxsYmFja3M7XG5cbmV4cG9ydCB0eXBlIFBhbmVsSGVhZGVyUHJvcHMgPSB7XG4gIGFwcE5hbWU6IHN0cmluZztcbiAgYXBwV2Vic2l0ZTogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIHZpc2libGVEcm9wZG93bjogVWlTdGF0ZVsndmlzaWJsZURyb3Bkb3duJ107XG4gIGFjdGlvbkl0ZW1zPzogQWN0aW9uSXRlbVtdO1xuICBzaG93RXhwb3J0RHJvcGRvd246IChpOiBzdHJpbmcpID0+IHZvaWQ7XG4gIGhpZGVFeHBvcnREcm9wZG93bjogKCkgPT4gdm9pZDtcbn0gJiBEcm9wZG93bkNhbGxiYWNrcztcblxuY29uc3QgU3R5bGVkUGFuZWxIZWFkZXIgPSBzdHlsZWQuZGl2LmF0dHJzKHByb3BzID0+ICh7XG4gIGNsYXNzTmFtZTogY2xhc3NuYW1lcygnc2lkZS1zaWRlLXBhbmVsX19oZWFkZXInLCBwcm9wcy5jbGFzc05hbWUpXG59KSlgXG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2lkZVBhbmVsSGVhZGVyQmd9O1xuICBwYWRkaW5nOiAxMnB4IDE2cHggMCAxNnB4O1xuYDtcblxuY29uc3QgU3R5bGVkUGFuZWxIZWFkZXJUb3AgPSBzdHlsZWQuZGl2LmF0dHJzKHByb3BzID0+ICh7XG4gIGNsYXNzTmFtZTogY2xhc3NuYW1lcygnc2lkZS1wYW5lbF9faGVhZGVyX190b3AnLCBwcm9wcy5jbGFzc05hbWUpXG59KSlgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgbWFyZ2luLWJvdHRvbTogMTZweDtcbiAgd2lkdGg6IDEwMCU7XG5gO1xuXG5jb25zdCBTdHlsZWRQYW5lbFRvcEFjdGlvbnMgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnc2lkZS1wYW5lbF9fdG9wX19hY3Rpb25zJ1xufSlgXG4gIGRpc3BsYXk6IGZsZXg7XG5gO1xuXG5jb25zdCBTdHlsZWRQYW5lbEFjdGlvbiA9IHN0eWxlZC5kaXYuYXR0cnMoe1xuICBjbGFzc05hbWU6ICdzaWRlLXBhbmVsX19wYW5lbC1oZWFkZXJfX2FjdGlvbidcbn0pPFN0eWxlZFBhbmVsQWN0aW9uUHJvcHM+YFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGNvbG9yOiAke3Byb3BzID0+IChwcm9wcy5hY3RpdmUgPyBwcm9wcy50aGVtZS50ZXh0Q29sb3JIbCA6IHByb3BzLnRoZW1lLnN1YnRleHRDb2xvcil9O1xuICBkaXNwbGF5OiBmbGV4O1xuICBoZWlnaHQ6IDI2cHg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgbWFyZ2luLWxlZnQ6IDRweDtcbiAgcGFkZGluZzogNXB4O1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgcCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbi1yaWdodDogNnB4O1xuICB9XG4gIGEge1xuICAgIGhlaWdodDogMjBweDtcbiAgfVxuXG4gICY6aG92ZXIge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3JIbH07XG5cbiAgICBhIHtcbiAgICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvckhsfTtcbiAgICB9XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZFRvb2xiYXIgPSBzdHlsZWQoVG9vbGJhcik8VG9vbGJhclByb3BzPmBcbiAgcG9zaXRpb246IGFic29sdXRlO1xuYDtcblxuY29uc3QgUGFuZWxBY3Rpb246IFJlYWN0LkZDPFBhbmVsQWN0aW9uUHJvcHM+ID0gUmVhY3QubWVtbygoe2l0ZW0sIHNob3dFeHBvcnREcm9wZG93bn0pID0+IHtcbiAgY29uc3Qgb25DbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoaXRlbS5kcm9wZG93bkNvbXBvbmVudCkge1xuICAgICAgc2hvd0V4cG9ydERyb3Bkb3duKGl0ZW0uaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtLm9uQ2xpY2sgJiYgaXRlbS5vbkNsaWNrKCk7XG4gICAgfVxuICB9LCBbaXRlbSwgc2hvd0V4cG9ydERyb3Bkb3duXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8U3R5bGVkUGFuZWxBY3Rpb25cbiAgICAgIGlkPXtgJHtpdGVtLmlkfS1hY3Rpb25gfVxuICAgICAgZGF0YS10aXBcbiAgICAgIGRhdGEtZm9yPXtgJHtpdGVtLmlkfS1hY3Rpb25gfVxuICAgICAgb25DbGljaz17b25DbGlja31cbiAgICA+XG4gICAgICB7aXRlbS5sYWJlbCA/IDxwPntpdGVtLmxhYmVsfTwvcD4gOiBudWxsfVxuICAgICAgPGEgdGFyZ2V0PXtpdGVtLmJsYW5rID8gJ19ibGFuaycgOiAnJ30gaHJlZj17aXRlbS5ocmVmfSByZWw9XCJub3JlZmVycmVyXCI+XG4gICAgICAgIDxpdGVtLmljb25Db21wb25lbnQgaGVpZ2h0PVwiMThweFwiIHsuLi5pdGVtLmljb25Db21wb25lbnRQcm9wc30gLz5cbiAgICAgIDwvYT5cbiAgICAgIHtpdGVtLnRvb2x0aXAgPyAoXG4gICAgICAgIDxUb29sdGlwIGlkPXtgJHtpdGVtLmlkfS1hY3Rpb25gfSBwbGFjZT1cImJvdHRvbVwiIGRlbGF5U2hvdz17NTAwfSBlZmZlY3Q9XCJzb2xpZFwiPlxuICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXtpdGVtLnRvb2x0aXB9IC8+XG4gICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICkgOiBudWxsfVxuICAgIDwvU3R5bGVkUGFuZWxBY3Rpb24+XG4gICk7XG59KTtcblBhbmVsQWN0aW9uLmRpc3BsYXlOYW1lID0gJ1BhbmVsQWN0aW9uJztcbmV4cG9ydCB7UGFuZWxBY3Rpb259O1xuXG5leHBvcnQgY29uc3QgUGFuZWxIZWFkZXJEcm9wZG93bkZhY3RvcnkgPSAoKSA9PiB7XG4gIGNvbnN0IFBhbmVsSGVhZGVyRHJvcGRvd246IFJlYWN0LkZDPFBhbmVsSGVhZGVyRHJvcGRvd25Qcm9wcz4gPSAoe2l0ZW1zLCBzaG93LCBvbkNsb3NlLCBpZH0pID0+IHtcbiAgICBjb25zdCByZWYgPSB1c2VPbkNsaWNrT3V0c2lkZTxIVE1MRGl2RWxlbWVudD4ob25DbG9zZSk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxTdHlsZWRUb29sYmFyIHNob3c9e3Nob3d9IGNsYXNzTmFtZT17YCR7aWR9LWRyb3Bkb3duYH0+XG4gICAgICAgIHtzaG93ID8gKFxuICAgICAgICAgIDxTdHlsZWRQYW5lbERyb3Bkb3duIHR5cGU9XCJkYXJrXCIgcmVmPXtyZWZ9IGNsYXNzTmFtZT1cInBhbmVsLWhlYWRlci1kcm9wZG93bl9faW5uZXJcIj5cbiAgICAgICAgICAgIHtpdGVtcy5tYXAoaXRlbSA9PiAoXG4gICAgICAgICAgICAgIDxUb29sYmFySXRlbVxuICAgICAgICAgICAgICAgIGlkPXtpdGVtLmtleX1cbiAgICAgICAgICAgICAgICBrZXk9e2l0ZW0ua2V5fVxuICAgICAgICAgICAgICAgIGxhYmVsPXtpdGVtLmxhYmVsfVxuICAgICAgICAgICAgICAgIGljb249e2l0ZW0uaWNvbn1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtpdGVtLm9uQ2xpY2t9XG4gICAgICAgICAgICAgICAgb25DbG9zZT17b25DbG9zZX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgIDwvU3R5bGVkUGFuZWxEcm9wZG93bj5cbiAgICAgICAgKSA6IG51bGx9XG4gICAgICA8L1N0eWxlZFRvb2xiYXI+XG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gUGFuZWxIZWFkZXJEcm9wZG93bjtcbn07XG5cbmNvbnN0IGdldERyb3Bkb3duSXRlbXNTZWxlY3RvciA9ICgpID0+XG4gIGNyZWF0ZVNlbGVjdG9yKFxuICAgIChwcm9wczogRHJvcGRvd25Db21wb25lbnRQcm9wcykgPT4gcHJvcHMsXG4gICAgcHJvcHMgPT5cbiAgICAgIChwcm9wcy5pdGVtcyB8fCBbXSlcbiAgICAgICAgLm1hcCh0ID0+ICh7XG4gICAgICAgICAgLi4udCxcbiAgICAgICAgICBvbkNsaWNrOiB0Lm9uQ2xpY2sgJiYgdC5vbkNsaWNrKHByb3BzKSA/IHQub25DbGljayhwcm9wcykgOiBudWxsXG4gICAgICAgIH0pKVxuICAgICAgICAuZmlsdGVyKGwgPT4gbC5vbkNsaWNrKVxuICApO1xuXG5leHBvcnQgY29uc3QgU2F2ZUV4cG9ydERyb3Bkb3duRmFjdG9yeSA9IChcbiAgUGFuZWxIZWFkZXJEcm9wZG93bjogUmV0dXJuVHlwZTx0eXBlb2YgUGFuZWxIZWFkZXJEcm9wZG93bkZhY3Rvcnk+XG4pID0+IHtcbiAgY29uc3QgZHJvcGRvd25JdGVtc1NlbGVjdG9yID0gZ2V0RHJvcGRvd25JdGVtc1NlbGVjdG9yKCk7XG5cbiAgY29uc3QgZGVmYXVsdEl0ZW1zID0gW1xuICAgIHtcbiAgICAgIGxhYmVsOiAndG9vbGJhci5leHBvcnRJbWFnZScsXG4gICAgICBpY29uOiBQaWN0dXJlLFxuICAgICAga2V5OiAnaW1hZ2UnLFxuICAgICAgb25DbGljazogcHJvcHMgPT4gcHJvcHMub25FeHBvcnRJbWFnZVxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6ICd0b29sYmFyLmV4cG9ydERhdGEnLFxuICAgICAgaWNvbjogRGF0YVRhYmxlLFxuICAgICAga2V5OiAnZGF0YScsXG4gICAgICBvbkNsaWNrOiBwcm9wcyA9PiBwcm9wcy5vbkV4cG9ydERhdGFcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAndG9vbGJhci5leHBvcnRNYXAnLFxuICAgICAgaWNvbjogQmFzZU1hcCxcbiAgICAgIGtleTogJ21hcCcsXG4gICAgICBvbkNsaWNrOiBwcm9wcyA9PiBwcm9wcy5vbkV4cG9ydE1hcFxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6ICd0b29sYmFyLnNhdmVNYXAnLFxuICAgICAgaWNvbjogU2F2ZTIsXG4gICAgICBrZXk6ICdzYXZlJyxcbiAgICAgIG9uQ2xpY2s6IHByb3BzID0+IHByb3BzLm9uU2F2ZU1hcFxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6ICd0b29sYmFyLnNoYXJlTWFwVVJMJyxcbiAgICAgIGljb246IFNoYXJlLFxuICAgICAga2V5OiAnc2hhcmUnLFxuICAgICAgb25DbGljazogcHJvcHMgPT4gcHJvcHMub25TaGFyZU1hcFxuICAgIH1cbiAgXTtcblxuICBjb25zdCBTYXZlRXhwb3J0RHJvcGRvd246IFJlYWN0LkZDPERyb3Bkb3duQ29tcG9uZW50UHJvcHM+ICYge1xuICAgIGRlZmF1bHRJdGVtczogVG9vbGJhckl0ZW1Qcm9wc1tdO1xuICB9ID0gKHtpdGVtcyA9IGRlZmF1bHRJdGVtcywgLi4ucmVzdFByb3BzfSkgPT4ge1xuICAgIGNvbnN0IHByb3BzID0gey4uLnJlc3RQcm9wcywgaXRlbXN9O1xuICAgIHJldHVybiAoXG4gICAgICA8UGFuZWxIZWFkZXJEcm9wZG93blxuICAgICAgICBpdGVtcz17ZHJvcGRvd25JdGVtc1NlbGVjdG9yKHByb3BzKX1cbiAgICAgICAgc2hvdz17cHJvcHMuc2hvd31cbiAgICAgICAgb25DbG9zZT17cHJvcHMub25DbG9zZX1cbiAgICAgICAgaWQ9XCJzYXZlLWV4cG9ydFwiXG4gICAgICAvPlxuICAgICk7XG4gIH07XG4gIFNhdmVFeHBvcnREcm9wZG93bi5kZWZhdWx0SXRlbXMgPSBkZWZhdWx0SXRlbXM7XG4gIHJldHVybiBTYXZlRXhwb3J0RHJvcGRvd247XG59O1xuU2F2ZUV4cG9ydERyb3Bkb3duRmFjdG9yeS5kZXBzID0gW1BhbmVsSGVhZGVyRHJvcGRvd25GYWN0b3J5XTtcblxuZXhwb3J0IGNvbnN0IENsb3VkU3RvcmFnZURyb3Bkb3duRmFjdG9yeSA9IChcbiAgUGFuZWxIZWFkZXJEcm9wZG93bjogUmV0dXJuVHlwZTx0eXBlb2YgUGFuZWxIZWFkZXJEcm9wZG93bkZhY3Rvcnk+XG4pID0+IHtcbiAgY29uc3QgZHJvcGRvd25JdGVtc1NlbGVjdG9yID0gZ2V0RHJvcGRvd25JdGVtc1NlbGVjdG9yKCk7XG4gIGNvbnN0IGRlZmF1bHRJdGVtcyA9IFtcbiAgICB7XG4gICAgICBsYWJlbDogJ1NhdmUnLFxuICAgICAgaWNvbjogU2F2ZTIsXG4gICAgICBrZXk6ICdzYXZlJyxcbiAgICAgIG9uQ2xpY2s6IHByb3BzID0+IHByb3BzLm9uU2F2ZVRvU3RvcmFnZVxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6ICdTYXZlIEFzJyxcbiAgICAgIGljb246IFNhdmUyLFxuICAgICAga2V5OiAnc2F2ZUFzJyxcbiAgICAgIG9uQ2xpY2s6IHByb3BzID0+IHByb3BzLm9uU2F2ZUFzVG9TdG9yYWdlXG4gICAgfVxuICBdO1xuICBjb25zdCBDbG91ZFN0b3JhZ2VEcm9wZG93bjogUmVhY3QuRkM8RHJvcGRvd25Db21wb25lbnRQcm9wcz4gJiB7XG4gICAgZGVmYXVsdEl0ZW1zOiBEcm9wZG93bkNvbXBvbmVudFByb3BzWydpdGVtcyddO1xuICB9ID0gKHtpdGVtcyA9IGRlZmF1bHRJdGVtcywgLi4ucmVzdFByb3BzfSkgPT4ge1xuICAgIGNvbnN0IHByb3BzID0gey4uLnJlc3RQcm9wcywgaXRlbXN9O1xuICAgIHJldHVybiAoXG4gICAgICA8UGFuZWxIZWFkZXJEcm9wZG93blxuICAgICAgICBpdGVtcz17ZHJvcGRvd25JdGVtc1NlbGVjdG9yKHByb3BzKX1cbiAgICAgICAgc2hvdz17cHJvcHMuc2hvd31cbiAgICAgICAgb25DbG9zZT17cHJvcHMub25DbG9zZX1cbiAgICAgICAgaWQ9XCJjbG91ZC1zdG9yYWdlXCJcbiAgICAgIC8+XG4gICAgKTtcbiAgfTtcbiAgQ2xvdWRTdG9yYWdlRHJvcGRvd24uZGVmYXVsdEl0ZW1zID0gZGVmYXVsdEl0ZW1zO1xuICByZXR1cm4gQ2xvdWRTdG9yYWdlRHJvcGRvd247XG59O1xuQ2xvdWRTdG9yYWdlRHJvcGRvd25GYWN0b3J5LmRlcHMgPSBbUGFuZWxIZWFkZXJEcm9wZG93bkZhY3RvcnldO1xuXG5QYW5lbEhlYWRlckZhY3RvcnkuZGVwcyA9IFtTYXZlRXhwb3J0RHJvcGRvd25GYWN0b3J5LCBDbG91ZFN0b3JhZ2VEcm9wZG93bkZhY3RvcnldO1xuXG5mdW5jdGlvbiBQYW5lbEhlYWRlckZhY3RvcnkoXG4gIFNhdmVFeHBvcnREcm9wZG93bjogUmV0dXJuVHlwZTx0eXBlb2YgU2F2ZUV4cG9ydERyb3Bkb3duRmFjdG9yeT4sXG4gIENsb3VkU3RvcmFnZURyb3Bkb3duOiBSZXR1cm5UeXBlPHR5cGVvZiBDbG91ZFN0b3JhZ2VEcm9wZG93bkZhY3Rvcnk+XG4pOiBSZWFjdC5Db21wb25lbnRUeXBlPFBhbmVsSGVhZGVyUHJvcHM+IHtcbiAgcmV0dXJuIGNsYXNzIFBhbmVsSGVhZGVyIGV4dGVuZHMgQ29tcG9uZW50PFBhbmVsSGVhZGVyUHJvcHM+IHtcbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgbG9nb0NvbXBvbmVudDogS2VwbGVyR2xMb2dvLFxuICAgICAgYWN0aW9uSXRlbXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnc3RvcmFnZScsXG4gICAgICAgICAgaWNvbkNvbXBvbmVudDogRGIsXG4gICAgICAgICAgdG9vbHRpcDogJ3Rvb2x0aXAuY2xvdWRTdG9yYWdlJyxcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkcm9wZG93bkNvbXBvbmVudDogQ2xvdWRTdG9yYWdlRHJvcGRvd25cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnc2F2ZScsXG4gICAgICAgICAgaWNvbkNvbXBvbmVudDogU2F2ZSxcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSxcbiAgICAgICAgICBsYWJlbDogJ1NoYXJlJyxcbiAgICAgICAgICBkcm9wZG93bkNvbXBvbmVudDogU2F2ZUV4cG9ydERyb3Bkb3duXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9O1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBhcHBOYW1lLFxuICAgICAgICBhcHBXZWJzaXRlLFxuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICBhY3Rpb25JdGVtcyxcbiAgICAgICAgdmlzaWJsZURyb3Bkb3duLFxuICAgICAgICBzaG93RXhwb3J0RHJvcGRvd24sXG4gICAgICAgIGhpZGVFeHBvcnREcm9wZG93bixcbiAgICAgICAgLi4uZHJvcGRvd25DYWxsYmFja3NcbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgbGV0IGl0ZW1zID0gYWN0aW9uSXRlbXMgfHwgW107XG5cbiAgICAgIC8vIGRvbid0IHJlbmRlciBjbG91ZCBzdG9yYWdlIGljb24gaWYgb25TYXZlVG9TdG9yYWdlIGlzIG5vdCBwcm92aWRlZFxuICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLm9uU2F2ZVRvU3RvcmFnZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihhaSA9PiBhaS5pZCAhPT0gJ3N0b3JhZ2UnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFN0eWxlZFBhbmVsSGVhZGVyIGNsYXNzTmFtZT1cInNpZGUtcGFuZWxfX3BhbmVsLWhlYWRlclwiPlxuICAgICAgICAgIDxTdHlsZWRQYW5lbEhlYWRlclRvcCBjbGFzc05hbWU9XCJzaWRlLXBhbmVsX19wYW5lbC1oZWFkZXJfX3RvcFwiPlxuICAgICAgICAgICAge3RoaXMucHJvcHMubG9nb0NvbXBvbmVudCAmJiAoXG4gICAgICAgICAgICAgIDx0aGlzLnByb3BzLmxvZ29Db21wb25lbnRcbiAgICAgICAgICAgICAgICBhcHBOYW1lPXthcHBOYW1lfVxuICAgICAgICAgICAgICAgIHZlcnNpb249e3ZlcnNpb259XG4gICAgICAgICAgICAgICAgYXBwV2Vic2l0ZT17YXBwV2Vic2l0ZX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8U3R5bGVkUGFuZWxUb3BBY3Rpb25zPlxuICAgICAgICAgICAgICB7aXRlbXMubWFwKGl0ZW0gPT4gKFxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInNpZGUtcGFuZWxfX3BhbmVsLWhlYWRlcl9fcmlnaHRcIlxuICAgICAgICAgICAgICAgICAga2V5PXtpdGVtLmlkfVxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3twb3NpdGlvbjogJ3JlbGF0aXZlJ319XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPFBhbmVsQWN0aW9uIGl0ZW09e2l0ZW19IHNob3dFeHBvcnREcm9wZG93bj17c2hvd0V4cG9ydERyb3Bkb3dufSAvPlxuICAgICAgICAgICAgICAgICAge2l0ZW0uZHJvcGRvd25Db21wb25lbnQgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxpdGVtLmRyb3Bkb3duQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgb25DbG9zZT17aGlkZUV4cG9ydERyb3Bkb3dufVxuICAgICAgICAgICAgICAgICAgICAgIHNob3c9e3Zpc2libGVEcm9wZG93biA9PT0gaXRlbS5pZH1cbiAgICAgICAgICAgICAgICAgICAgICB7Li4uZHJvcGRvd25DYWxsYmFja3N9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L1N0eWxlZFBhbmVsVG9wQWN0aW9ucz5cbiAgICAgICAgICA8L1N0eWxlZFBhbmVsSGVhZGVyVG9wPlxuICAgICAgICA8L1N0eWxlZFBhbmVsSGVhZGVyPlxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhbmVsSGVhZGVyRmFjdG9yeTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxpQkFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsV0FBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUksU0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssa0JBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLEtBQUEsR0FBQUosc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFPLE1BQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLFFBQUEsR0FBQU4sc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFTLFlBQUEsR0FBQVAsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFVLGFBQUEsR0FBQVYsT0FBQTtBQUdBLElBQUFXLGtCQUFBLEdBQUFULHNCQUFBLENBQUFGLE9BQUE7QUFBOEQsSUFBQVksU0FBQTtFQUFBQyxVQUFBO0VBQUFDLFVBQUE7QUFBQSxJQUFBQyxlQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBZjlEO0FBQ0E7QUFBQSxTQUFBQyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQXRCLHdCQUFBc0IsQ0FBQSxFQUFBRSxDQUFBLFNBQUFBLENBQUEsSUFBQUYsQ0FBQSxJQUFBQSxDQUFBLENBQUFJLFVBQUEsU0FBQUosQ0FBQSxlQUFBQSxDQUFBLGdCQUFBSyxPQUFBLENBQUFMLENBQUEsMEJBQUFBLENBQUEsc0JBQUFBLENBQUEsUUFBQUcsQ0FBQSxHQUFBSix3QkFBQSxDQUFBRyxDQUFBLE9BQUFDLENBQUEsSUFBQUEsQ0FBQSxDQUFBRyxHQUFBLENBQUFOLENBQUEsVUFBQUcsQ0FBQSxDQUFBSSxHQUFBLENBQUFQLENBQUEsT0FBQVEsQ0FBQSxLQUFBQyxTQUFBLFVBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxjQUFBLElBQUFELE1BQUEsQ0FBQUUsd0JBQUEsV0FBQUMsQ0FBQSxJQUFBZCxDQUFBLG9CQUFBYyxDQUFBLE9BQUFDLGNBQUEsQ0FBQUMsSUFBQSxDQUFBaEIsQ0FBQSxFQUFBYyxDQUFBLFNBQUFHLENBQUEsR0FBQVAsQ0FBQSxHQUFBQyxNQUFBLENBQUFFLHdCQUFBLENBQUFiLENBQUEsRUFBQWMsQ0FBQSxVQUFBRyxDQUFBLEtBQUFBLENBQUEsQ0FBQVYsR0FBQSxJQUFBVSxDQUFBLENBQUFDLEdBQUEsSUFBQVAsTUFBQSxDQUFBQyxjQUFBLENBQUFKLENBQUEsRUFBQU0sQ0FBQSxFQUFBRyxDQUFBLElBQUFULENBQUEsQ0FBQU0sQ0FBQSxJQUFBZCxDQUFBLENBQUFjLENBQUEsWUFBQU4sQ0FBQSxjQUFBUixDQUFBLEVBQUFHLENBQUEsSUFBQUEsQ0FBQSxDQUFBZSxHQUFBLENBQUFsQixDQUFBLEVBQUFRLENBQUEsR0FBQUEsQ0FBQTtBQUFBLFNBQUFXLFdBQUFoQixDQUFBLEVBQUFpQixDQUFBLEVBQUFwQixDQUFBLFdBQUFvQixDQUFBLE9BQUFDLGdCQUFBLGFBQUFELENBQUEsT0FBQUUsMkJBQUEsYUFBQW5CLENBQUEsRUFBQW9CLHlCQUFBLEtBQUFDLE9BQUEsQ0FBQUMsU0FBQSxDQUFBTCxDQUFBLEVBQUFwQixDQUFBLFlBQUFxQixnQkFBQSxhQUFBbEIsQ0FBQSxFQUFBdUIsV0FBQSxJQUFBTixDQUFBLENBQUFPLEtBQUEsQ0FBQXhCLENBQUEsRUFBQUgsQ0FBQTtBQUFBLFNBQUF1QiwwQkFBQSxjQUFBcEIsQ0FBQSxJQUFBeUIsT0FBQSxDQUFBQyxTQUFBLENBQUFDLE9BQUEsQ0FBQWQsSUFBQSxDQUFBUSxPQUFBLENBQUFDLFNBQUEsQ0FBQUcsT0FBQSxpQ0FBQXpCLENBQUEsYUFBQW9CLHlCQUFBLFlBQUFBLDBCQUFBLGFBQUFwQixDQUFBO0FBQUEsU0FBQTRCLFFBQUEvQixDQUFBLEVBQUFFLENBQUEsUUFBQUMsQ0FBQSxHQUFBUSxNQUFBLENBQUFxQixJQUFBLENBQUFoQyxDQUFBLE9BQUFXLE1BQUEsQ0FBQXNCLHFCQUFBLFFBQUFiLENBQUEsR0FBQVQsTUFBQSxDQUFBc0IscUJBQUEsQ0FBQWpDLENBQUEsR0FBQUUsQ0FBQSxLQUFBa0IsQ0FBQSxHQUFBQSxDQUFBLENBQUFjLE1BQUEsV0FBQWhDLENBQUEsV0FBQVMsTUFBQSxDQUFBRSx3QkFBQSxDQUFBYixDQUFBLEVBQUFFLENBQUEsRUFBQWlDLFVBQUEsT0FBQWhDLENBQUEsQ0FBQWlDLElBQUEsQ0FBQVQsS0FBQSxDQUFBeEIsQ0FBQSxFQUFBaUIsQ0FBQSxZQUFBakIsQ0FBQTtBQUFBLFNBQUFrQyxjQUFBckMsQ0FBQSxhQUFBRSxDQUFBLE1BQUFBLENBQUEsR0FBQW9DLFNBQUEsQ0FBQUMsTUFBQSxFQUFBckMsQ0FBQSxVQUFBQyxDQUFBLFdBQUFtQyxTQUFBLENBQUFwQyxDQUFBLElBQUFvQyxTQUFBLENBQUFwQyxDQUFBLFFBQUFBLENBQUEsT0FBQTZCLE9BQUEsQ0FBQXBCLE1BQUEsQ0FBQVIsQ0FBQSxPQUFBcUMsT0FBQSxXQUFBdEMsQ0FBQSxRQUFBdUMsZ0JBQUEsYUFBQXpDLENBQUEsRUFBQUUsQ0FBQSxFQUFBQyxDQUFBLENBQUFELENBQUEsU0FBQVMsTUFBQSxDQUFBK0IseUJBQUEsR0FBQS9CLE1BQUEsQ0FBQWdDLGdCQUFBLENBQUEzQyxDQUFBLEVBQUFXLE1BQUEsQ0FBQStCLHlCQUFBLENBQUF2QyxDQUFBLEtBQUE0QixPQUFBLENBQUFwQixNQUFBLENBQUFSLENBQUEsR0FBQXFDLE9BQUEsV0FBQXRDLENBQUEsSUFBQVMsTUFBQSxDQUFBQyxjQUFBLENBQUFaLENBQUEsRUFBQUUsQ0FBQSxFQUFBUyxNQUFBLENBQUFFLHdCQUFBLENBQUFWLENBQUEsRUFBQUQsQ0FBQSxpQkFBQUYsQ0FBQTtBQXFGQSxJQUFNNEMsaUJBQWlCLEdBQUdDLDRCQUFNLENBQUNDLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDLFVBQUFDLEtBQUs7RUFBQSxPQUFLO0lBQ25EQyxTQUFTLEVBQUUsSUFBQUMsc0JBQVUsRUFBQyx5QkFBeUIsRUFBRUYsS0FBSyxDQUFDQyxTQUFTO0VBQ2xFLENBQUM7QUFBQSxDQUFDLENBQUMsQ0FBQXZELGVBQUEsS0FBQUEsZUFBQSxPQUFBeUQsdUJBQUEsZ0ZBQ21CLFVBQUFILEtBQUs7RUFBQSxPQUFJQSxLQUFLLENBQUNJLEtBQUssQ0FBQ0MsaUJBQWlCO0FBQUEsRUFFM0Q7QUFFRCxJQUFNQyxvQkFBb0IsR0FBR1QsNEJBQU0sQ0FBQ0MsR0FBRyxDQUFDQyxLQUFLLENBQUMsVUFBQUMsS0FBSztFQUFBLE9BQUs7SUFDdERDLFNBQVMsRUFBRSxJQUFBQyxzQkFBVSxFQUFDLHlCQUF5QixFQUFFRixLQUFLLENBQUNDLFNBQVM7RUFDbEUsQ0FBQztBQUFBLENBQUMsQ0FBQyxDQUFBdEQsZ0JBQUEsS0FBQUEsZ0JBQUEsT0FBQXdELHVCQUFBLG1IQUtGO0FBRUQsSUFBTUkscUJBQXFCLEdBQUdWLDRCQUFNLENBQUNDLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDO0VBQzdDRSxTQUFTLEVBQUU7QUFDYixDQUFDLENBQUMsQ0FBQXJELGdCQUFBLEtBQUFBLGdCQUFBLE9BQUF1RCx1QkFBQSx3Q0FFRDtBQUVELElBQU1LLGlCQUFpQixHQUFHWCw0QkFBTSxDQUFDQyxHQUFHLENBQUNDLEtBQUssQ0FBQztFQUN6Q0UsU0FBUyxFQUFFO0FBQ2IsQ0FBQyxDQUFDLENBQUFwRCxnQkFBQSxLQUFBQSxnQkFBQSxPQUFBc0QsdUJBQUEseVpBR1MsVUFBQUgsS0FBSztFQUFBLE9BQUtBLEtBQUssQ0FBQ1MsTUFBTSxHQUFHVCxLQUFLLENBQUNJLEtBQUssQ0FBQ00sV0FBVyxHQUFHVixLQUFLLENBQUNJLEtBQUssQ0FBQ08sWUFBWTtBQUFBLENBQUMsRUFpQjFFLFVBQUFYLEtBQUs7RUFBQSxPQUFJQSxLQUFLLENBQUNJLEtBQUssQ0FBQ00sV0FBVztBQUFBLEdBRzlCLFVBQUFWLEtBQUs7RUFBQSxPQUFJQSxLQUFLLENBQUNJLEtBQUssQ0FBQ00sV0FBVztBQUFBLEVBRzlDO0FBRUQsSUFBTUUsYUFBYSxHQUFHLElBQUFmLDRCQUFNLEVBQUNnQixtQkFBTyxDQUFDLENBQUEvRCxnQkFBQSxLQUFBQSxnQkFBQSxPQUFBcUQsdUJBQUEsNkNBRXBDO0FBRUQsSUFBTVcsV0FBdUMsR0FBQUMsT0FBQSxDQUFBRCxXQUFBLGdCQUFHRSxpQkFBSyxDQUFDQyxJQUFJLENBQUMsVUFBQUMsSUFBQSxFQUFnQztFQUFBLElBQTlCQyxJQUFJLEdBQUFELElBQUEsQ0FBSkMsSUFBSTtJQUFFQyxrQkFBa0IsR0FBQUYsSUFBQSxDQUFsQkUsa0JBQWtCO0VBQ25GLElBQU1DLE9BQU8sR0FBRyxJQUFBQyxrQkFBVyxFQUFDLFlBQU07SUFDaEMsSUFBSUgsSUFBSSxDQUFDSSxpQkFBaUIsRUFBRTtNQUMxQkgsa0JBQWtCLENBQUNELElBQUksQ0FBQ0ssRUFBRSxDQUFDO0lBQzdCLENBQUMsTUFBTTtNQUNMTCxJQUFJLENBQUNFLE9BQU8sSUFBSUYsSUFBSSxDQUFDRSxPQUFPLENBQUMsQ0FBQztJQUNoQztFQUNGLENBQUMsRUFBRSxDQUFDRixJQUFJLEVBQUVDLGtCQUFrQixDQUFDLENBQUM7RUFFOUIsb0JBQ0UzRixNQUFBLFlBQUFnRyxhQUFBLENBQUNqQixpQkFBaUI7SUFDaEJnQixFQUFFLEtBQUFFLE1BQUEsQ0FBS1AsSUFBSSxDQUFDSyxFQUFFLFlBQVU7SUFDeEIsZ0JBQVE7SUFDUixlQUFBRSxNQUFBLENBQWFQLElBQUksQ0FBQ0ssRUFBRSxZQUFVO0lBQzlCSCxPQUFPLEVBQUVBO0VBQVEsR0FFaEJGLElBQUksQ0FBQ1EsS0FBSyxnQkFBR2xHLE1BQUEsWUFBQWdHLGFBQUEsWUFBSU4sSUFBSSxDQUFDUSxLQUFTLENBQUMsR0FBRyxJQUFJLGVBQ3hDbEcsTUFBQSxZQUFBZ0csYUFBQTtJQUFHRyxNQUFNLEVBQUVULElBQUksQ0FBQ1UsS0FBSyxHQUFHLFFBQVEsR0FBRyxFQUFHO0lBQUNDLElBQUksRUFBRVgsSUFBSSxDQUFDVyxJQUFLO0lBQUNDLEdBQUcsRUFBQztFQUFZLGdCQUN0RXRHLE1BQUEsWUFBQWdHLGFBQUEsQ0FBQ04sSUFBSSxDQUFDYSxhQUFhLE1BQUFDLFNBQUE7SUFBQ0MsTUFBTSxFQUFDO0VBQU0sR0FBS2YsSUFBSSxDQUFDZ0Isa0JBQWtCLENBQUcsQ0FDL0QsQ0FBQyxFQUNIaEIsSUFBSSxDQUFDaUIsT0FBTyxnQkFDWDNHLE1BQUEsWUFBQWdHLGFBQUEsQ0FBQ3pGLGtCQUFBLENBQUFxRyxPQUFPO0lBQUNiLEVBQUUsS0FBQUUsTUFBQSxDQUFLUCxJQUFJLENBQUNLLEVBQUUsWUFBVTtJQUFDYyxLQUFLLEVBQUMsUUFBUTtJQUFDQyxTQUFTLEVBQUUsR0FBSTtJQUFDQyxNQUFNLEVBQUM7RUFBTyxnQkFDN0UvRyxNQUFBLFlBQUFnRyxhQUFBLENBQUNwRixhQUFBLENBQUFvRyxnQkFBZ0I7SUFBQ2pCLEVBQUUsRUFBRUwsSUFBSSxDQUFDaUI7RUFBUSxDQUFFLENBQzlCLENBQUMsR0FDUixJQUNhLENBQUM7QUFFeEIsQ0FBQyxDQUFDO0FBQ0Z0QixXQUFXLENBQUM0QixXQUFXLEdBQUcsYUFBYTtBQUdoQyxJQUFNQywwQkFBMEIsR0FBQTVCLE9BQUEsQ0FBQTRCLDBCQUFBLEdBQUcsU0FBN0JBLDBCQUEwQkEsQ0FBQSxFQUFTO0VBQzlDLElBQU1DLG1CQUF1RCxHQUFHLFNBQTFEQSxtQkFBdURBLENBQUFDLEtBQUEsRUFBbUM7SUFBQSxJQUE5QkMsS0FBSyxHQUFBRCxLQUFBLENBQUxDLEtBQUs7TUFBRUMsSUFBSSxHQUFBRixLQUFBLENBQUpFLElBQUk7TUFBRUMsT0FBTyxHQUFBSCxLQUFBLENBQVBHLE9BQU87TUFBRXhCLEVBQUUsR0FBQXFCLEtBQUEsQ0FBRnJCLEVBQUU7SUFDeEYsSUFBTXlCLEdBQUcsR0FBRyxJQUFBQyw2QkFBaUIsRUFBaUJGLE9BQU8sQ0FBQztJQUN0RCxvQkFDRXZILE1BQUEsWUFBQWdHLGFBQUEsQ0FBQ2IsYUFBYTtNQUFDbUMsSUFBSSxFQUFFQSxJQUFLO01BQUM5QyxTQUFTLEtBQUF5QixNQUFBLENBQUtGLEVBQUU7SUFBWSxHQUNwRHVCLElBQUksZ0JBQ0h0SCxNQUFBLFlBQUFnRyxhQUFBLENBQUN6RixrQkFBQSxDQUFBbUgsbUJBQW1CO01BQUNDLElBQUksRUFBQyxNQUFNO01BQUNILEdBQUcsRUFBRUEsR0FBSTtNQUFDaEQsU0FBUyxFQUFDO0lBQThCLEdBQ2hGNkMsS0FBSyxDQUFDTyxHQUFHLENBQUMsVUFBQWxDLElBQUk7TUFBQSxvQkFDYjFGLE1BQUEsWUFBQWdHLGFBQUEsQ0FBQ3JGLFlBQUEsV0FBVztRQUNWb0YsRUFBRSxFQUFFTCxJQUFJLENBQUNtQyxHQUFJO1FBQ2JBLEdBQUcsRUFBRW5DLElBQUksQ0FBQ21DLEdBQUk7UUFDZDNCLEtBQUssRUFBRVIsSUFBSSxDQUFDUSxLQUFNO1FBQ2xCNEIsSUFBSSxFQUFFcEMsSUFBSSxDQUFDb0MsSUFBSztRQUNoQmxDLE9BQU8sRUFBRUYsSUFBSSxDQUFDRSxPQUFRO1FBQ3RCMkIsT0FBTyxFQUFFQTtNQUFRLENBQ2xCLENBQUM7SUFBQSxDQUNILENBQ2tCLENBQUMsR0FDcEIsSUFDUyxDQUFDO0VBRXBCLENBQUM7RUFFRCxPQUFPSixtQkFBbUI7QUFDNUIsQ0FBQztBQUVELElBQU1ZLHdCQUF3QixHQUFHLFNBQTNCQSx3QkFBd0JBLENBQUE7RUFBQSxPQUM1QixJQUFBQyx3QkFBYyxFQUNaLFVBQUN6RCxLQUE2QjtJQUFBLE9BQUtBLEtBQUs7RUFBQSxHQUN4QyxVQUFBQSxLQUFLO0lBQUEsT0FDSCxDQUFDQSxLQUFLLENBQUM4QyxLQUFLLElBQUksRUFBRSxFQUNmTyxHQUFHLENBQUMsVUFBQWxHLENBQUM7TUFBQSxPQUFBa0MsYUFBQSxDQUFBQSxhQUFBLEtBQ0RsQyxDQUFDO1FBQ0prRSxPQUFPLEVBQUVsRSxDQUFDLENBQUNrRSxPQUFPLElBQUlsRSxDQUFDLENBQUNrRSxPQUFPLENBQUNyQixLQUFLLENBQUMsR0FBRzdDLENBQUMsQ0FBQ2tFLE9BQU8sQ0FBQ3JCLEtBQUssQ0FBQyxHQUFHO01BQUk7SUFBQSxDQUNoRSxDQUFDLENBQ0ZkLE1BQU0sQ0FBQyxVQUFBd0UsQ0FBQztNQUFBLE9BQUlBLENBQUMsQ0FBQ3JDLE9BQU87SUFBQSxFQUFDO0VBQUEsQ0FDN0IsQ0FBQztBQUFBO0FBRUksSUFBTXNDLHlCQUF5QixHQUFBNUMsT0FBQSxDQUFBNEMseUJBQUEsR0FBRyxTQUE1QkEseUJBQXlCQSxDQUNwQ2YsbUJBQWtFLEVBQy9EO0VBQ0gsSUFBTWdCLHFCQUFxQixHQUFHSix3QkFBd0IsQ0FBQyxDQUFDO0VBRXhELElBQU1LLFlBQVksR0FBRyxDQUNuQjtJQUNFbEMsS0FBSyxFQUFFLHFCQUFxQjtJQUM1QjRCLElBQUksRUFBRU8sY0FBTztJQUNiUixHQUFHLEVBQUUsT0FBTztJQUNaakMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUVyQixLQUFLO01BQUEsT0FBSUEsS0FBSyxDQUFDK0QsYUFBYTtJQUFBO0VBQ3ZDLENBQUMsRUFDRDtJQUNFcEMsS0FBSyxFQUFFLG9CQUFvQjtJQUMzQjRCLElBQUksRUFBRVMsZ0JBQVM7SUFDZlYsR0FBRyxFQUFFLE1BQU07SUFDWGpDLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFFckIsS0FBSztNQUFBLE9BQUlBLEtBQUssQ0FBQ2lFLFlBQVk7SUFBQTtFQUN0QyxDQUFDLEVBQ0Q7SUFDRXRDLEtBQUssRUFBRSxtQkFBbUI7SUFDMUI0QixJQUFJLEVBQUVXLGNBQU87SUFDYlosR0FBRyxFQUFFLEtBQUs7SUFDVmpDLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFFckIsS0FBSztNQUFBLE9BQUlBLEtBQUssQ0FBQ21FLFdBQVc7SUFBQTtFQUNyQyxDQUFDLEVBQ0Q7SUFDRXhDLEtBQUssRUFBRSxpQkFBaUI7SUFDeEI0QixJQUFJLEVBQUVhLFlBQUs7SUFDWGQsR0FBRyxFQUFFLE1BQU07SUFDWGpDLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFFckIsS0FBSztNQUFBLE9BQUlBLEtBQUssQ0FBQ3FFLFNBQVM7SUFBQTtFQUNuQyxDQUFDLEVBQ0Q7SUFDRTFDLEtBQUssRUFBRSxxQkFBcUI7SUFDNUI0QixJQUFJLEVBQUVlLFlBQUs7SUFDWGhCLEdBQUcsRUFBRSxPQUFPO0lBQ1pqQyxPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBRXJCLEtBQUs7TUFBQSxPQUFJQSxLQUFLLENBQUN1RSxVQUFVO0lBQUE7RUFDcEMsQ0FBQyxDQUNGO0VBRUQsSUFBTUMsa0JBRUwsR0FBRyxTQUZFQSxrQkFFTEEsQ0FBQUMsS0FBQSxFQUE2QztJQUFBLElBQUFDLFdBQUEsR0FBQUQsS0FBQSxDQUF4QzNCLEtBQUs7TUFBTEEsS0FBSyxHQUFBNEIsV0FBQSxjQUFHYixZQUFZLEdBQUFhLFdBQUE7TUFBS0MsU0FBUyxPQUFBQyx5QkFBQSxhQUFBSCxLQUFBLEVBQUFsSSxTQUFBO0lBQ3RDLElBQU15RCxLQUFLLEdBQUFYLGFBQUEsQ0FBQUEsYUFBQSxLQUFPc0YsU0FBUztNQUFFN0IsS0FBSyxFQUFMQTtJQUFLLEVBQUM7SUFDbkMsb0JBQ0VySCxNQUFBLFlBQUFnRyxhQUFBLENBQUNtQixtQkFBbUI7TUFDbEJFLEtBQUssRUFBRWMscUJBQXFCLENBQUM1RCxLQUFLLENBQUU7TUFDcEMrQyxJQUFJLEVBQUUvQyxLQUFLLENBQUMrQyxJQUFLO01BQ2pCQyxPQUFPLEVBQUVoRCxLQUFLLENBQUNnRCxPQUFRO01BQ3ZCeEIsRUFBRSxFQUFDO0lBQWEsQ0FDakIsQ0FBQztFQUVOLENBQUM7RUFDRGdELGtCQUFrQixDQUFDWCxZQUFZLEdBQUdBLFlBQVk7RUFDOUMsT0FBT1csa0JBQWtCO0FBQzNCLENBQUM7QUFDRGIseUJBQXlCLENBQUNrQixJQUFJLEdBQUcsQ0FBQ2xDLDBCQUEwQixDQUFDO0FBRXRELElBQU1tQywyQkFBMkIsR0FBQS9ELE9BQUEsQ0FBQStELDJCQUFBLEdBQUcsU0FBOUJBLDJCQUEyQkEsQ0FDdENsQyxtQkFBa0UsRUFDL0Q7RUFDSCxJQUFNZ0IscUJBQXFCLEdBQUdKLHdCQUF3QixDQUFDLENBQUM7RUFDeEQsSUFBTUssWUFBWSxHQUFHLENBQ25CO0lBQ0VsQyxLQUFLLEVBQUUsTUFBTTtJQUNiNEIsSUFBSSxFQUFFYSxZQUFLO0lBQ1hkLEdBQUcsRUFBRSxNQUFNO0lBQ1hqQyxPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBRXJCLEtBQUs7TUFBQSxPQUFJQSxLQUFLLENBQUMrRSxlQUFlO0lBQUE7RUFDekMsQ0FBQyxFQUNEO0lBQ0VwRCxLQUFLLEVBQUUsU0FBUztJQUNoQjRCLElBQUksRUFBRWEsWUFBSztJQUNYZCxHQUFHLEVBQUUsUUFBUTtJQUNiakMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUVyQixLQUFLO01BQUEsT0FBSUEsS0FBSyxDQUFDZ0YsaUJBQWlCO0lBQUE7RUFDM0MsQ0FBQyxDQUNGO0VBQ0QsSUFBTUMsb0JBRUwsR0FBRyxTQUZFQSxvQkFFTEEsQ0FBQUMsS0FBQSxFQUE2QztJQUFBLElBQUFDLFdBQUEsR0FBQUQsS0FBQSxDQUF4Q3BDLEtBQUs7TUFBTEEsS0FBSyxHQUFBcUMsV0FBQSxjQUFHdEIsWUFBWSxHQUFBc0IsV0FBQTtNQUFLUixTQUFTLE9BQUFDLHlCQUFBLGFBQUFNLEtBQUEsRUFBQTFJLFVBQUE7SUFDdEMsSUFBTXdELEtBQUssR0FBQVgsYUFBQSxDQUFBQSxhQUFBLEtBQU9zRixTQUFTO01BQUU3QixLQUFLLEVBQUxBO0lBQUssRUFBQztJQUNuQyxvQkFDRXJILE1BQUEsWUFBQWdHLGFBQUEsQ0FBQ21CLG1CQUFtQjtNQUNsQkUsS0FBSyxFQUFFYyxxQkFBcUIsQ0FBQzVELEtBQUssQ0FBRTtNQUNwQytDLElBQUksRUFBRS9DLEtBQUssQ0FBQytDLElBQUs7TUFDakJDLE9BQU8sRUFBRWhELEtBQUssQ0FBQ2dELE9BQVE7TUFDdkJ4QixFQUFFLEVBQUM7SUFBZSxDQUNuQixDQUFDO0VBRU4sQ0FBQztFQUNEeUQsb0JBQW9CLENBQUNwQixZQUFZLEdBQUdBLFlBQVk7RUFDaEQsT0FBT29CLG9CQUFvQjtBQUM3QixDQUFDO0FBQ0RILDJCQUEyQixDQUFDRCxJQUFJLEdBQUcsQ0FBQ2xDLDBCQUEwQixDQUFDO0FBRS9EeUMsa0JBQWtCLENBQUNQLElBQUksR0FBRyxDQUFDbEIseUJBQXlCLEVBQUVtQiwyQkFBMkIsQ0FBQztBQUVsRixTQUFTTSxrQkFBa0JBLENBQ3pCWixrQkFBZ0UsRUFDaEVTLG9CQUFvRSxFQUM3QjtFQUFBLElBQUFJLFlBQUE7RUFDdkMsT0FBQUEsWUFBQSwwQkFBQUMsVUFBQTtJQUFBLFNBQUFDLFlBQUE7TUFBQSxJQUFBQyxnQkFBQSxtQkFBQUQsV0FBQTtNQUFBLE9BQUFwSCxVQUFBLE9BQUFvSCxXQUFBLEVBQUFqRyxTQUFBO0lBQUE7SUFBQSxJQUFBbUcsVUFBQSxhQUFBRixXQUFBLEVBQUFELFVBQUE7SUFBQSxXQUFBSSxhQUFBLGFBQUFILFdBQUE7TUFBQWpDLEdBQUE7TUFBQXFDLEtBQUEsRUF5QkUsU0FBQUMsTUFBTUEsQ0FBQSxFQUFHO1FBQ1AsSUFBQUMsV0FBQSxHQVNJLElBQUksQ0FBQzdGLEtBQUs7VUFSWjhGLE9BQU8sR0FBQUQsV0FBQSxDQUFQQyxPQUFPO1VBQ1BDLFVBQVUsR0FBQUYsV0FBQSxDQUFWRSxVQUFVO1VBQ1ZDLE9BQU8sR0FBQUgsV0FBQSxDQUFQRyxPQUFPO1VBQ1BDLFdBQVcsR0FBQUosV0FBQSxDQUFYSSxXQUFXO1VBQ1hDLGVBQWUsR0FBQUwsV0FBQSxDQUFmSyxlQUFlO1VBQ2Y5RSxrQkFBa0IsR0FBQXlFLFdBQUEsQ0FBbEJ6RSxrQkFBa0I7VUFDbEIrRSxrQkFBa0IsR0FBQU4sV0FBQSxDQUFsQk0sa0JBQWtCO1VBQ2ZDLGlCQUFpQixPQUFBeEIseUJBQUEsYUFBQWlCLFdBQUEsRUFBQXBKLFVBQUE7UUFFdEIsSUFBSXFHLEtBQUssR0FBR21ELFdBQVcsSUFBSSxFQUFFOztRQUU3QjtRQUNBLElBQUksT0FBTyxJQUFJLENBQUNqRyxLQUFLLENBQUMrRSxlQUFlLEtBQUssVUFBVSxFQUFFO1VBQ3BEakMsS0FBSyxHQUFHQSxLQUFLLENBQUM1RCxNQUFNLENBQUMsVUFBQW1ILEVBQUU7WUFBQSxPQUFJQSxFQUFFLENBQUM3RSxFQUFFLEtBQUssU0FBUztVQUFBLEVBQUM7UUFDakQ7UUFFQSxvQkFDRS9GLE1BQUEsWUFBQWdHLGFBQUEsQ0FBQzdCLGlCQUFpQjtVQUFDSyxTQUFTLEVBQUM7UUFBMEIsZ0JBQ3JEeEUsTUFBQSxZQUFBZ0csYUFBQSxDQUFDbkIsb0JBQW9CO1VBQUNMLFNBQVMsRUFBQztRQUErQixHQUM1RCxJQUFJLENBQUNELEtBQUssQ0FBQ3NHLGFBQWEsaUJBQ3ZCN0ssTUFBQSxZQUFBZ0csYUFBQSxNQUFNekIsS0FBSyxDQUFDc0csYUFBYTtVQUN2QlIsT0FBTyxFQUFFQSxPQUFRO1VBQ2pCRSxPQUFPLEVBQUVBLE9BQVE7VUFDakJELFVBQVUsRUFBRUE7UUFBVyxDQUN4QixDQUNGLGVBQ0R0SyxNQUFBLFlBQUFnRyxhQUFBLENBQUNsQixxQkFBcUIsUUFDbkJ1QyxLQUFLLENBQUNPLEdBQUcsQ0FBQyxVQUFBbEMsSUFBSTtVQUFBLG9CQUNiMUYsTUFBQSxZQUFBZ0csYUFBQTtZQUNFeEIsU0FBUyxFQUFDLGlDQUFpQztZQUMzQ3FELEdBQUcsRUFBRW5DLElBQUksQ0FBQ0ssRUFBRztZQUNiK0UsS0FBSyxFQUFFO2NBQUNDLFFBQVEsRUFBRTtZQUFVO1VBQUUsZ0JBRTlCL0ssTUFBQSxZQUFBZ0csYUFBQSxDQUFDWCxXQUFXO1lBQUNLLElBQUksRUFBRUEsSUFBSztZQUFDQyxrQkFBa0IsRUFBRUE7VUFBbUIsQ0FBRSxDQUFDLEVBQ2xFRCxJQUFJLENBQUNJLGlCQUFpQixnQkFDckI5RixNQUFBLFlBQUFnRyxhQUFBLENBQUNOLElBQUksQ0FBQ0ksaUJBQWlCLE1BQUFVLFNBQUE7WUFDckJlLE9BQU8sRUFBRW1ELGtCQUFtQjtZQUM1QnBELElBQUksRUFBRW1ELGVBQWUsS0FBSy9FLElBQUksQ0FBQ0s7VUFBRyxHQUM5QjRFLGlCQUFpQixDQUN0QixDQUFDLEdBQ0EsSUFDRCxDQUFDO1FBQUEsQ0FDUCxDQUNvQixDQUNILENBQ0wsQ0FBQztNQUV4QjtJQUFDO0VBQUEsRUExRThCSyxnQkFBUyxPQUFBaEgsZ0JBQUEsYUFBQTRGLFlBQUEsa0JBQ2xCO0lBQ3BCaUIsYUFBYSxFQUFFSSxnQkFBWTtJQUMzQlQsV0FBVyxFQUFFLENBQ1g7TUFDRXpFLEVBQUUsRUFBRSxTQUFTO01BQ2JRLGFBQWEsRUFBRTJFLFNBQUU7TUFDakJ2RSxPQUFPLEVBQUUsc0JBQXNCO01BQy9CZixPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBQSxFQUFRO1FBQ2I7TUFDRixDQUFDO01BQ0RFLGlCQUFpQixFQUFFMEQ7SUFDckIsQ0FBQyxFQUNEO01BQ0V6RCxFQUFFLEVBQUUsTUFBTTtNQUNWUSxhQUFhLEVBQUU0RSxXQUFJO01BQ25CdkYsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUEsRUFBUTtRQUNiO01BQ0YsQ0FBQztNQUNETSxLQUFLLEVBQUUsT0FBTztNQUNkSixpQkFBaUIsRUFBRWlEO0lBQ3JCLENBQUM7RUFFTCxDQUFDLEdBQUFhLFlBQUE7QUFxREw7QUFBQyxJQUFBd0IsUUFBQSxHQUFBOUYsT0FBQSxjQUVjcUUsa0JBQWtCIiwiaWdub3JlTGlzdCI6W119
;