UNPKG

kepler.gl

Version:

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

273 lines (272 loc) 45.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.LegendColorDisplayFactory = LegendColorDisplayFactory; exports.LegendRowEditorFactory = LegendRowEditorFactory; exports.LegendRowFactory = LegendRowFactory; exports.ResetColorLabelFactory = ResetColorLabelFactory; exports["default"] = void 0; exports.useLayerColorLegends = useLayerColorLegends; var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _styledComponents = _interopRequireWildcard(require("styled-components")); var _constants = require("@kepler.gl/constants"); var _utils = require("@kepler.gl/utils"); var _icons = require("./icons"); var _styledComponents2 = require("./styled-components"); var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6; // 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 _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(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 ROW_H = 15; var GAP = 2; var RECT_W = 20; var stopClickPropagation = function stopClickPropagation(e) { return e.stopPropagation(); }; var inputCss = (0, _styledComponents.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n input {\n pointer-events: none;\n }\n"]))); var StyledLegend = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n ", ";\n ", ";\n overflow: auto;\n margin-bottom: ", "px;\n display: grid;\n grid-row-gap: ", "px;\n padding: 2px 0;\n\n ", "\n"])), function (props) { return props.theme.sidePanelScrollBar; }, function (props) { return props.isExpanded ? '' : "max-height: 156px;"; }, GAP, GAP, function (props) { return props.disableEdit ? inputCss : ''; }); var StyledLegendRow = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n height: 20px;\n"]))); function ResetColorLabelFactory() { return (0, _styledComponents["default"])(_icons.Reset)(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n cursor: pointer;\n\n &:hover {\n color: ", ";\n }\n "])), function (props) { return props.theme.labelColorLT; }, function (props) { return props.theme.panelHeaderIconHover; }); } var StyleInlineInput = (0, _styledComponents["default"])(_styledComponents2.InlineInput)(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n font-size: 9.5px;\n line-height: ", "px;\n height: ", "px;\n color: ", ";\n width: unset;\n padding: 2px;\n flex: 1;\n margin: 0 ", "px;\n :hover {\n height: ", "px;\n }\n"])), ROW_H, ROW_H, function (props) { return props.theme.textColor; }, GAP, ROW_H); function LegendRowEditorFactory() { var LegendRowEditor = function LegendRowEditor(_ref) { var color = _ref.color, label = _ref.label, onEdit = _ref.onEdit, _ref$disabled = _ref.disabled, disabled = _ref$disabled === void 0 ? false : _ref$disabled; var onChange = (0, _react.useCallback)(function (event) { return onEdit(event.target.value); }, [onEdit]); return /*#__PURE__*/_react["default"].createElement(StyleInlineInput, { type: "text", className: "legend__label__title__editor", value: label, onClick: stopClickPropagation, onChange: onChange, disabled: disabled, id: "".concat(color, ":input-legend-label") }); }; LegendRowEditor.displayName = 'LegendRowEditor'; return LegendRowEditor; } var LegendRowStyle = { width: "".concat(RECT_W, "px"), height: "".concat(ROW_H, "px") }; function LegendColorDisplayFactory() { var LegendColorDisplay = function LegendColorDisplay(_ref2) { var color = _ref2.color; var style = (0, _react.useMemo)(function () { return _objectSpread(_objectSpread({}, LegendRowStyle), {}, { backgroundColor: color, marginRight: "".concat(GAP, "px") }); }, [color]); return /*#__PURE__*/_react["default"].createElement("div", { style: style, className: "legend-row-color" }); }; return LegendColorDisplay; } var StyledLabel = _styledComponents["default"].div(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n font-size: 10px;\n color: ", ";\n padding-left: 2px;\n"])), function (props) { return props.theme.textColor; }); LegendRowFactory.deps = [LegendColorDisplayFactory, LegendRowEditorFactory, ResetColorLabelFactory]; function LegendRowFactory(LegendColorDisplay, LegendRowEditor, ResetColorLabel) { var LegendRow = function LegendRow(_ref3) { var _ref3$label = _ref3.label, label = _ref3$label === void 0 ? '' : _ref3$label, displayLabel = _ref3.displayLabel, color = _ref3.color, onUpdateLabel = _ref3.onUpdateLabel, onResetLabel = _ref3.onResetLabel; var onEdit = (0, _react.useCallback)(function (newLabel) { return onUpdateLabel && onUpdateLabel(color, newLabel); }, [color, onUpdateLabel]); var onReset = (0, _react.useCallback)(function () { return onResetLabel && onResetLabel(color); }, [color, onResetLabel]); var value = displayLabel ? label.toString() : ''; return /*#__PURE__*/_react["default"].createElement(StyledLegendRow, null, /*#__PURE__*/_react["default"].createElement(LegendColorDisplay, { color: color }), onUpdateLabel ? /*#__PURE__*/_react["default"].createElement(LegendRowEditor, { disabled: !onUpdateLabel, label: value, color: color, onEdit: onEdit }) : /*#__PURE__*/_react["default"].createElement(StyledLabel, null, value), onResetLabel ? /*#__PURE__*/_react["default"].createElement(ResetColorLabel, { onClick: onReset, height: "16px" }) : null); }; LegendRow.displayName = 'LegendRow'; return LegendRow; } var overrideColorLegends = function overrideColorLegends(colorLegends, overrides) { var data = overrides.data, labels = overrides.labels; var newColorLegends = (0, _toConsumableArray2["default"])(colorLegends); data.forEach(function (datum, index) { var currentIndex = colorLegends.findIndex(function (d) { return d.data === datum; }); if (currentIndex !== -1) { newColorLegends[currentIndex] = { label: labels[index], data: datum, override: true }; newColorLegends[currentIndex].label = labels[index]; } else { newColorLegends.push({ data: datum, label: labels[index], override: true }); } }); return newColorLegends; }; /** * Overrides legend labels with color legends. * @param param0 Legend info and override parameters. * @returns Original or overriden lenends. */ function overrideByCustomLegend(_ref4) { var colorLegends = _ref4.colorLegends, currentLegends = _ref4.currentLegends; if (colorLegends && (0, _utils.isObject)(colorLegends)) { // override labels with color legends var data = Object.keys(colorLegends); var labels = Object.values(colorLegends); return overrideColorLegends(currentLegends, { data: data, labels: labels }); } return currentLegends; } function useLayerColorLegends(layer, scaleType, domain, range, isFixed, fieldType, labelFormat, mapState) { var scale = (0, _react.useMemo)(function () { return (0, _utils.getLayerColorScale)({ range: range, domain: domain, scaleType: scaleType, isFixed: isFixed, layer: layer }); }, [range, domain, scaleType, isFixed, layer]); var scaleByZoom = (0, _react.useMemo)(function () { return (0, _utils.getVisualChannelScaleByZoom)({ scale: scale, layer: layer, mapState: mapState }); }, [scale, layer, mapState]); var currentLegends = (0, _react.useMemo)(function () { if (scaleType === _constants.SCALE_TYPES.customOrdinal && range !== null && range !== void 0 && range.colorMap) { var colorBreaks = (0, _utils.colorMapToCategoricalColorBreaks)(range.colorMap); return colorBreaks === null || colorBreaks === void 0 ? void 0 : colorBreaks.map(function (cb) { return { data: cb.data, label: Array.isArray(cb.label) ? cb.label.length > 5 ? "".concat(cb.label.length, " selected") : cb.label : cb.label || '' }; }); } return (0, _utils.getLegendOfScale)({ scale: scaleByZoom, scaleType: scaleType, labelFormat: labelFormat, fieldType: fieldType }); }, [range, scaleByZoom, scaleType, labelFormat, fieldType]); var LegendsWithCustomLegends = (0, _react.useMemo)(function () { return overrideByCustomLegend({ colorLegends: range === null || range === void 0 ? void 0 : range.colorLegends, currentLegends: currentLegends }); }, [range === null || range === void 0 ? void 0 : range.colorLegends, currentLegends]); return LegendsWithCustomLegends || []; } ColorLegendFactory.deps = [LegendRowFactory]; function ColorLegendFactory(LegendRow) { var ColorLegend = function ColorLegend(_ref5) { var layer = _ref5.layer, isFixed = _ref5.isFixed, isExpanded = _ref5.isExpanded, domain = _ref5.domain, range = _ref5.range, labelFormat = _ref5.labelFormat, scaleType = _ref5.scaleType, fieldType = _ref5.fieldType, mapState = _ref5.mapState, onUpdateColorLegend = _ref5.onUpdateColorLegend, _ref5$displayLabel = _ref5.displayLabel, displayLabel = _ref5$displayLabel === void 0 ? true : _ref5$displayLabel, _ref5$disableEdit = _ref5.disableEdit, disableEdit = _ref5$disableEdit === void 0 ? false : _ref5$disableEdit; var _ref6 = range || {}, colorLegends = _ref6.colorLegends; var legends = useLayerColorLegends(layer, scaleType, domain, range, isFixed, fieldType, labelFormat, mapState); var onUpdateLabel = (0, _react.useCallback)(function (color, newValue) { if (onUpdateColorLegend) { onUpdateColorLegend(_objectSpread(_objectSpread({}, colorLegends), {}, (0, _defineProperty2["default"])({}, color, newValue))); } }, [onUpdateColorLegend, colorLegends]); var onResetLabel = (0, _react.useCallback)(function (color) { /* eslint-disable no-unused-vars */ // @ts-ignore var _ = colorLegends[color], rest = (0, _objectWithoutProperties2["default"])(colorLegends, [color].map(_toPropertyKey)); if (onUpdateColorLegend && rest) { onUpdateColorLegend(rest); } /* eslint-enable no-unused-vars */ }, [onUpdateColorLegend, colorLegends]); return /*#__PURE__*/_react["default"].createElement(StyledLegend, { className: "styled-color-legend", disableEdit: disableEdit, isExpanded: isExpanded }, legends.map(function (legend, i) { return /*#__PURE__*/_react["default"].createElement(LegendRow, { key: "".concat(legend.data, "-").concat(i), label: legend.label, displayLabel: displayLabel, color: legend.data, onUpdateLabel: !disableEdit ? onUpdateLabel : undefined, onResetLabel: legend.override && !disableEdit ? onResetLabel : undefined }); })); }; return /*#__PURE__*/_react["default"].memo(ColorLegend); } var _default = exports["default"] = ColorLegendFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9jb25zdGFudHMiLCJfdXRpbHMiLCJfaWNvbnMiLCJfc3R5bGVkQ29tcG9uZW50czIiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX3RlbXBsYXRlT2JqZWN0MyIsIl90ZW1wbGF0ZU9iamVjdDQiLCJfdGVtcGxhdGVPYmplY3Q1IiwiX3RlbXBsYXRlT2JqZWN0NiIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIl90b1Byb3BlcnR5S2V5IiwiX3RvUHJpbWl0aXZlIiwiU3ltYm9sIiwidG9QcmltaXRpdmUiLCJUeXBlRXJyb3IiLCJTdHJpbmciLCJOdW1iZXIiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJST1dfSCIsIkdBUCIsIlJFQ1RfVyIsInN0b3BDbGlja1Byb3BhZ2F0aW9uIiwic3RvcFByb3BhZ2F0aW9uIiwiaW5wdXRDc3MiLCJjc3MiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsIlN0eWxlZExlZ2VuZCIsInN0eWxlZCIsImRpdiIsInByb3BzIiwidGhlbWUiLCJzaWRlUGFuZWxTY3JvbGxCYXIiLCJpc0V4cGFuZGVkIiwiZGlzYWJsZUVkaXQiLCJTdHlsZWRMZWdlbmRSb3ciLCJSZXNldENvbG9yTGFiZWxGYWN0b3J5IiwiUmVzZXQiLCJsYWJlbENvbG9yTFQiLCJwYW5lbEhlYWRlckljb25Ib3ZlciIsIlN0eWxlSW5saW5lSW5wdXQiLCJJbmxpbmVJbnB1dCIsInRleHRDb2xvciIsIkxlZ2VuZFJvd0VkaXRvckZhY3RvcnkiLCJMZWdlbmRSb3dFZGl0b3IiLCJfcmVmIiwiY29sb3IiLCJsYWJlbCIsIm9uRWRpdCIsIl9yZWYkZGlzYWJsZWQiLCJkaXNhYmxlZCIsIm9uQ2hhbmdlIiwidXNlQ2FsbGJhY2siLCJldmVudCIsInRhcmdldCIsInZhbHVlIiwiY3JlYXRlRWxlbWVudCIsInR5cGUiLCJjbGFzc05hbWUiLCJvbkNsaWNrIiwiaWQiLCJjb25jYXQiLCJkaXNwbGF5TmFtZSIsIkxlZ2VuZFJvd1N0eWxlIiwid2lkdGgiLCJoZWlnaHQiLCJMZWdlbmRDb2xvckRpc3BsYXlGYWN0b3J5IiwiTGVnZW5kQ29sb3JEaXNwbGF5IiwiX3JlZjIiLCJzdHlsZSIsInVzZU1lbW8iLCJiYWNrZ3JvdW5kQ29sb3IiLCJtYXJnaW5SaWdodCIsIlN0eWxlZExhYmVsIiwiTGVnZW5kUm93RmFjdG9yeSIsImRlcHMiLCJSZXNldENvbG9yTGFiZWwiLCJMZWdlbmRSb3ciLCJfcmVmMyIsIl9yZWYzJGxhYmVsIiwiZGlzcGxheUxhYmVsIiwib25VcGRhdGVMYWJlbCIsIm9uUmVzZXRMYWJlbCIsIm5ld0xhYmVsIiwib25SZXNldCIsInRvU3RyaW5nIiwib3ZlcnJpZGVDb2xvckxlZ2VuZHMiLCJjb2xvckxlZ2VuZHMiLCJvdmVycmlkZXMiLCJkYXRhIiwibGFiZWxzIiwibmV3Q29sb3JMZWdlbmRzIiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsImRhdHVtIiwiaW5kZXgiLCJjdXJyZW50SW5kZXgiLCJmaW5kSW5kZXgiLCJkIiwib3ZlcnJpZGUiLCJvdmVycmlkZUJ5Q3VzdG9tTGVnZW5kIiwiX3JlZjQiLCJjdXJyZW50TGVnZW5kcyIsImlzT2JqZWN0IiwidmFsdWVzIiwidXNlTGF5ZXJDb2xvckxlZ2VuZHMiLCJsYXllciIsInNjYWxlVHlwZSIsImRvbWFpbiIsInJhbmdlIiwiaXNGaXhlZCIsImZpZWxkVHlwZSIsImxhYmVsRm9ybWF0IiwibWFwU3RhdGUiLCJzY2FsZSIsImdldExheWVyQ29sb3JTY2FsZSIsInNjYWxlQnlab29tIiwiZ2V0VmlzdWFsQ2hhbm5lbFNjYWxlQnlab29tIiwiU0NBTEVfVFlQRVMiLCJjdXN0b21PcmRpbmFsIiwiY29sb3JNYXAiLCJjb2xvckJyZWFrcyIsImNvbG9yTWFwVG9DYXRlZ29yaWNhbENvbG9yQnJlYWtzIiwibWFwIiwiY2IiLCJBcnJheSIsImlzQXJyYXkiLCJnZXRMZWdlbmRPZlNjYWxlIiwiTGVnZW5kc1dpdGhDdXN0b21MZWdlbmRzIiwiQ29sb3JMZWdlbmRGYWN0b3J5IiwiQ29sb3JMZWdlbmQiLCJfcmVmNSIsIm9uVXBkYXRlQ29sb3JMZWdlbmQiLCJfcmVmNSRkaXNwbGF5TGFiZWwiLCJfcmVmNSRkaXNhYmxlRWRpdCIsIl9yZWY2IiwibGVnZW5kcyIsIm5ld1ZhbHVlIiwiXyIsInJlc3QiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyIiwibGVnZW5kIiwia2V5IiwidW5kZWZpbmVkIiwiUmVhY3QiLCJtZW1vIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1vbi9jb2xvci1sZWdlbmQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkLCB7Y3NzfSBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCB7U0NBTEVfVFlQRVN9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7TGF5ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcbmltcG9ydCB7Q29sb3JSYW5nZSwgSGV4Q29sb3IsIE1hcFN0YXRlfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7XG4gIGdldExheWVyQ29sb3JTY2FsZSxcbiAgZ2V0TGVnZW5kT2ZTY2FsZSxcbiAgZ2V0VmlzdWFsQ2hhbm5lbFNjYWxlQnlab29tLFxuICBjb2xvck1hcFRvQ2F0ZWdvcmljYWxDb2xvckJyZWFrcyxcbiAgaXNPYmplY3Rcbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmltcG9ydCB7UmVzZXR9IGZyb20gJy4vaWNvbnMnO1xuaW1wb3J0IHtJbmxpbmVJbnB1dH0gZnJvbSAnLi9zdHlsZWQtY29tcG9uZW50cyc7XG5cbmNvbnN0IFJPV19IID0gMTU7XG5jb25zdCBHQVAgPSAyO1xuY29uc3QgUkVDVF9XID0gMjA7XG5cbmNvbnN0IHN0b3BDbGlja1Byb3BhZ2F0aW9uID0gZSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG5jb25zdCBpbnB1dENzcyA9IGNzc2BcbiAgaW5wdXQge1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB9XG5gO1xuY29uc3QgU3R5bGVkTGVnZW5kID0gc3R5bGVkLmRpdjx7ZGlzYWJsZUVkaXQ6IGJvb2xlYW47IGlzRXhwYW5kZWQ/OiBib29sZWFufT5gXG4gICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2lkZVBhbmVsU2Nyb2xsQmFyfTtcbiAgJHtwcm9wcyA9PiAocHJvcHMuaXNFeHBhbmRlZCA/ICcnIDogYG1heC1oZWlnaHQ6IDE1NnB4O2ApfTtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gIG1hcmdpbi1ib3R0b206ICR7R0FQfXB4O1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXJvdy1nYXA6ICR7R0FQfXB4O1xuICBwYWRkaW5nOiAycHggMDtcblxuICAke3Byb3BzID0+IChwcm9wcy5kaXNhYmxlRWRpdCA/IGlucHV0Q3NzIDogJycpfVxuYDtcblxuY29uc3QgU3R5bGVkTGVnZW5kUm93ID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgaGVpZ2h0OiAyMHB4O1xuYDtcblxuZXhwb3J0IGZ1bmN0aW9uIFJlc2V0Q29sb3JMYWJlbEZhY3RvcnkoKSB7XG4gIHJldHVybiBzdHlsZWQoUmVzZXQpYFxuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmxhYmVsQ29sb3JMVH07XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuXG4gICAgJjpob3ZlciB7XG4gICAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEhlYWRlckljb25Ib3Zlcn07XG4gICAgfVxuICBgO1xufVxuXG5jb25zdCBTdHlsZUlubGluZUlucHV0ID0gc3R5bGVkKElubGluZUlucHV0KWBcbiAgZm9udC1zaXplOiA5LjVweDtcbiAgbGluZS1oZWlnaHQ6ICR7Uk9XX0h9cHg7XG4gIGhlaWdodDogJHtST1dfSH1weDtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9yfTtcbiAgd2lkdGg6IHVuc2V0O1xuICBwYWRkaW5nOiAycHg7XG4gIGZsZXg6IDE7XG4gIG1hcmdpbjogMCAke0dBUH1weDtcbiAgOmhvdmVyIHtcbiAgICBoZWlnaHQ6ICR7Uk9XX0h9cHg7XG4gIH1cbmA7XG5cbmV4cG9ydCB0eXBlIExlZ2VuZFJvd0VkaXRvclByb3BzID0ge1xuICBjb2xvcjogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBjdXN0b21MYWJlbD86IHN0cmluZztcbiAgb25FZGl0OiAobmV3VmFsdWU6IHN0cmluZykgPT4gdm9pZDtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBMZWdlbmRSb3dFZGl0b3JGYWN0b3J5KCkge1xuICBjb25zdCBMZWdlbmRSb3dFZGl0b3I6IFJlYWN0LkZDPExlZ2VuZFJvd0VkaXRvclByb3BzPiA9ICh7XG4gICAgY29sb3IsXG4gICAgbGFiZWwsXG4gICAgb25FZGl0LFxuICAgIGRpc2FibGVkID0gZmFsc2VcbiAgfSkgPT4ge1xuICAgIGNvbnN0IG9uQ2hhbmdlID0gdXNlQ2FsbGJhY2soZXZlbnQgPT4gb25FZGl0KGV2ZW50LnRhcmdldC52YWx1ZSksIFtvbkVkaXRdKTtcbiAgICByZXR1cm4gKFxuICAgICAgPFN0eWxlSW5saW5lSW5wdXRcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBjbGFzc05hbWU9XCJsZWdlbmRfX2xhYmVsX190aXRsZV9fZWRpdG9yXCJcbiAgICAgICAgdmFsdWU9e2xhYmVsfVxuICAgICAgICBvbkNsaWNrPXtzdG9wQ2xpY2tQcm9wYWdhdGlvbn1cbiAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgIGlkPXtgJHtjb2xvcn06aW5wdXQtbGVnZW5kLWxhYmVsYH1cbiAgICAgIC8+XG4gICAgKTtcbiAgfTtcblxuICBMZWdlbmRSb3dFZGl0b3IuZGlzcGxheU5hbWUgPSAnTGVnZW5kUm93RWRpdG9yJztcbiAgcmV0dXJuIExlZ2VuZFJvd0VkaXRvcjtcbn1cblxuY29uc3QgTGVnZW5kUm93U3R5bGUgPSB7XG4gIHdpZHRoOiBgJHtSRUNUX1d9cHhgLFxuICBoZWlnaHQ6IGAke1JPV19IfXB4YFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIExlZ2VuZENvbG9yRGlzcGxheUZhY3RvcnkoKSB7XG4gIGNvbnN0IExlZ2VuZENvbG9yRGlzcGxheSA9ICh7Y29sb3J9KSA9PiB7XG4gICAgY29uc3Qgc3R5bGUgPSB1c2VNZW1vKFxuICAgICAgKCkgPT4gKHsuLi5MZWdlbmRSb3dTdHlsZSwgYmFja2dyb3VuZENvbG9yOiBjb2xvciwgbWFyZ2luUmlnaHQ6IGAke0dBUH1weGB9KSxcbiAgICAgIFtjb2xvcl1cbiAgICApO1xuICAgIHJldHVybiA8ZGl2IHN0eWxlPXtzdHlsZX0gY2xhc3NOYW1lPVwibGVnZW5kLXJvdy1jb2xvclwiIC8+O1xuICB9O1xuXG4gIHJldHVybiBMZWdlbmRDb2xvckRpc3BsYXk7XG59XG5cbmNvbnN0IFN0eWxlZExhYmVsID0gc3R5bGVkLmRpdmBcbiAgZm9udC1zaXplOiAxMHB4O1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3J9O1xuICBwYWRkaW5nLWxlZnQ6IDJweDtcbmA7XG5cbmV4cG9ydCB0eXBlIExlZ2VuZFJvd1Byb3BzID0ge1xuICBsYWJlbDogc3RyaW5nO1xuICBjdXN0b21MYWJlbD86IHN0cmluZztcbiAgZGlzcGxheUxhYmVsPzogYm9vbGVhbjtcbiAgY29sb3I6IHN0cmluZztcbiAgb25VcGRhdGVMYWJlbD86IChzZWxlY3RlZENvbG9yOiBzdHJpbmcsIG5ld0xhYmVsOiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uUmVzZXRMYWJlbD86IChjb2xvcjogc3RyaW5nKSA9PiB2b2lkO1xuICBkaXNhYmxlRWRpdD86IGJvb2xlYW47XG59O1xuXG5MZWdlbmRSb3dGYWN0b3J5LmRlcHMgPSBbTGVnZW5kQ29sb3JEaXNwbGF5RmFjdG9yeSwgTGVnZW5kUm93RWRpdG9yRmFjdG9yeSwgUmVzZXRDb2xvckxhYmVsRmFjdG9yeV07XG5leHBvcnQgZnVuY3Rpb24gTGVnZW5kUm93RmFjdG9yeShcbiAgTGVnZW5kQ29sb3JEaXNwbGF5OiBSZXR1cm5UeXBlPHR5cGVvZiBMZWdlbmRDb2xvckRpc3BsYXlGYWN0b3J5PixcbiAgTGVnZW5kUm93RWRpdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBMZWdlbmRSb3dFZGl0b3JGYWN0b3J5PixcbiAgUmVzZXRDb2xvckxhYmVsOiBSZXR1cm5UeXBlPHR5cGVvZiBSZXNldENvbG9yTGFiZWxGYWN0b3J5PlxuKSB7XG4gIGNvbnN0IExlZ2VuZFJvdzogUmVhY3QuRkM8TGVnZW5kUm93UHJvcHM+ID0gKHtcbiAgICBsYWJlbCA9ICcnLFxuICAgIGRpc3BsYXlMYWJlbCxcbiAgICBjb2xvcixcbiAgICBvblVwZGF0ZUxhYmVsLFxuICAgIG9uUmVzZXRMYWJlbFxuICB9KSA9PiB7XG4gICAgY29uc3Qgb25FZGl0ID0gdXNlQ2FsbGJhY2soXG4gICAgICBuZXdMYWJlbCA9PiBvblVwZGF0ZUxhYmVsICYmIG9uVXBkYXRlTGFiZWwoY29sb3IsIG5ld0xhYmVsKSxcbiAgICAgIFtjb2xvciwgb25VcGRhdGVMYWJlbF1cbiAgICApO1xuICAgIGNvbnN0IG9uUmVzZXQgPSB1c2VDYWxsYmFjaygoKSA9PiBvblJlc2V0TGFiZWwgJiYgb25SZXNldExhYmVsKGNvbG9yKSwgW2NvbG9yLCBvblJlc2V0TGFiZWxdKTtcbiAgICBjb25zdCB2YWx1ZSA9IGRpc3BsYXlMYWJlbCA/IGxhYmVsLnRvU3RyaW5nKCkgOiAnJztcbiAgICByZXR1cm4gKFxuICAgICAgPFN0eWxlZExlZ2VuZFJvdz5cbiAgICAgICAgPExlZ2VuZENvbG9yRGlzcGxheSBjb2xvcj17Y29sb3J9IC8+XG4gICAgICAgIHtvblVwZGF0ZUxhYmVsID8gKFxuICAgICAgICAgIDxMZWdlbmRSb3dFZGl0b3IgZGlzYWJsZWQ9eyFvblVwZGF0ZUxhYmVsfSBsYWJlbD17dmFsdWV9IGNvbG9yPXtjb2xvcn0gb25FZGl0PXtvbkVkaXR9IC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPFN0eWxlZExhYmVsPnt2YWx1ZX08L1N0eWxlZExhYmVsPlxuICAgICAgICApfVxuICAgICAgICB7b25SZXNldExhYmVsID8gPFJlc2V0Q29sb3JMYWJlbCBvbkNsaWNrPXtvblJlc2V0fSBoZWlnaHQ9XCIxNnB4XCIgLz4gOiBudWxsfVxuICAgICAgPC9TdHlsZWRMZWdlbmRSb3c+XG4gICAgKTtcbiAgfTtcbiAgTGVnZW5kUm93LmRpc3BsYXlOYW1lID0gJ0xlZ2VuZFJvdyc7XG4gIHJldHVybiBMZWdlbmRSb3c7XG59XG5cbmNvbnN0IG92ZXJyaWRlQ29sb3JMZWdlbmRzID0gKGNvbG9yTGVnZW5kcywgb3ZlcnJpZGVzKSA9PiB7XG4gIGNvbnN0IHtkYXRhLCBsYWJlbHN9ID0gb3ZlcnJpZGVzO1xuXG4gIGNvbnN0IG5ld0NvbG9yTGVnZW5kcyA9IFsuLi5jb2xvckxlZ2VuZHNdO1xuXG4gIGRhdGEuZm9yRWFjaCgoZGF0dW0sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gY29sb3JMZWdlbmRzLmZpbmRJbmRleChkID0+IGQuZGF0YSA9PT0gZGF0dW0pO1xuICAgIGlmIChjdXJyZW50SW5kZXggIT09IC0xKSB7XG4gICAgICBuZXdDb2xvckxlZ2VuZHNbY3VycmVudEluZGV4XSA9IHtcbiAgICAgICAgbGFiZWw6IGxhYmVsc1tpbmRleF0sXG4gICAgICAgIGRhdGE6IGRhdHVtLFxuICAgICAgICBvdmVycmlkZTogdHJ1ZVxuICAgICAgfTtcbiAgICAgIG5ld0NvbG9yTGVnZW5kc1tjdXJyZW50SW5kZXhdLmxhYmVsID0gbGFiZWxzW2luZGV4XTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3Q29sb3JMZWdlbmRzLnB1c2goe1xuICAgICAgICBkYXRhOiBkYXR1bSxcbiAgICAgICAgbGFiZWw6IGxhYmVsc1tpbmRleF0sXG4gICAgICAgIG92ZXJyaWRlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBuZXdDb2xvckxlZ2VuZHM7XG59O1xuXG50eXBlIE92ZXJyaWRlQnlDdXN0b21MZWdlbmRPcHRpb25zID0ge1xuICAvKipcbiAgICogTGVnZW5kIHBhcmFtZXRlcnMgdG8gb3ZlcnJpZGVcbiAgICovXG4gIGNvbG9yTGVnZW5kcz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKlxuICAgKiBPcmlnaW5hbCBMZWdlbmRzXG4gICAqL1xuICBjdXJyZW50TGVnZW5kcz86IFJldHVyblR5cGU8dHlwZW9mIGdldExlZ2VuZE9mU2NhbGU+O1xufTtcblxuLyoqXG4gKiBPdmVycmlkZXMgbGVnZW5kIGxhYmVscyB3aXRoIGNvbG9yIGxlZ2VuZHMuXG4gKiBAcGFyYW0gcGFyYW0wIExlZ2VuZCBpbmZvIGFuZCBvdmVycmlkZSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgT3JpZ2luYWwgb3Igb3ZlcnJpZGVuIGxlbmVuZHMuXG4gKi9cbmZ1bmN0aW9uIG92ZXJyaWRlQnlDdXN0b21MZWdlbmQoe2NvbG9yTGVnZW5kcywgY3VycmVudExlZ2VuZHN9OiBPdmVycmlkZUJ5Q3VzdG9tTGVnZW5kT3B0aW9ucykge1xuICBpZiAoY29sb3JMZWdlbmRzICYmIGlzT2JqZWN0KGNvbG9yTGVnZW5kcykpIHtcbiAgICAvLyBvdmVycmlkZSBsYWJlbHMgd2l0aCBjb2xvciBsZWdlbmRzXG4gICAgY29uc3QgZGF0YSA9IE9iamVjdC5rZXlzKGNvbG9yTGVnZW5kcyk7XG4gICAgY29uc3QgbGFiZWxzID0gT2JqZWN0LnZhbHVlcyhjb2xvckxlZ2VuZHMpO1xuXG4gICAgcmV0dXJuIG92ZXJyaWRlQ29sb3JMZWdlbmRzKGN1cnJlbnRMZWdlbmRzLCB7ZGF0YSwgbGFiZWxzfSk7XG4gIH1cblxuICByZXR1cm4gY3VycmVudExlZ2VuZHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VMYXllckNvbG9yTGVnZW5kcyhcbiAgbGF5ZXI6IENvbG9yTGVnZW5kUHJvcHNbJ2xheWVyJ10sXG4gIHNjYWxlVHlwZTogQ29sb3JMZWdlbmRQcm9wc1snc2NhbGVUeXBlJ10sXG4gIGRvbWFpbjogQ29sb3JMZWdlbmRQcm9wc1snZG9tYWluJ10sXG4gIHJhbmdlOiBDb2xvckxlZ2VuZFByb3BzWydyYW5nZSddLFxuICBpc0ZpeGVkOiBDb2xvckxlZ2VuZFByb3BzWydpc0ZpeGVkJ10sXG4gIGZpZWxkVHlwZTogQ29sb3JMZWdlbmRQcm9wc1snZmllbGRUeXBlJ10sXG4gIGxhYmVsRm9ybWF0OiBDb2xvckxlZ2VuZFByb3BzWydsYWJlbEZvcm1hdCddLFxuICBtYXBTdGF0ZTogQ29sb3JMZWdlbmRQcm9wc1snbWFwU3RhdGUnXVxuKTogTGVnZW5kW10ge1xuICBjb25zdCBzY2FsZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gZ2V0TGF5ZXJDb2xvclNjYWxlKHtyYW5nZSwgZG9tYWluLCBzY2FsZVR5cGUsIGlzRml4ZWQsIGxheWVyfSksXG4gICAgW3JhbmdlLCBkb21haW4sIHNjYWxlVHlwZSwgaXNGaXhlZCwgbGF5ZXJdXG4gICk7XG5cbiAgY29uc3Qgc2NhbGVCeVpvb20gPSB1c2VNZW1vKFxuICAgICgpID0+IGdldFZpc3VhbENoYW5uZWxTY2FsZUJ5Wm9vbSh7c2NhbGUsIGxheWVyLCBtYXBTdGF0ZX0pLFxuICAgIFtzY2FsZSwgbGF5ZXIsIG1hcFN0YXRlXVxuICApO1xuXG4gIGNvbnN0IGN1cnJlbnRMZWdlbmRzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKHNjYWxlVHlwZSA9PT0gU0NBTEVfVFlQRVMuY3VzdG9tT3JkaW5hbCAmJiByYW5nZT8uY29sb3JNYXApIHtcbiAgICAgIGNvbnN0IGNvbG9yQnJlYWtzID0gY29sb3JNYXBUb0NhdGVnb3JpY2FsQ29sb3JCcmVha3MocmFuZ2UuY29sb3JNYXApO1xuICAgICAgcmV0dXJuIGNvbG9yQnJlYWtzPy5tYXAoY2IgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IGNiLmRhdGEsXG4gICAgICAgICAgbGFiZWw6IEFycmF5LmlzQXJyYXkoY2IubGFiZWwpXG4gICAgICAgICAgICA/IGNiLmxhYmVsLmxlbmd0aCA+IDVcbiAgICAgICAgICAgICAgPyBgJHtjYi5sYWJlbC5sZW5ndGh9IHNlbGVjdGVkYFxuICAgICAgICAgICAgICA6IGNiLmxhYmVsXG4gICAgICAgICAgICA6IGNiLmxhYmVsIHx8ICcnXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGdldExlZ2VuZE9mU2NhbGUoe3NjYWxlOiBzY2FsZUJ5Wm9vbSwgc2NhbGVUeXBlLCBsYWJlbEZvcm1hdCwgZmllbGRUeXBlfSk7XG4gIH0sIFtyYW5nZSwgc2NhbGVCeVpvb20sIHNjYWxlVHlwZSwgbGFiZWxGb3JtYXQsIGZpZWxkVHlwZV0pO1xuXG4gIGNvbnN0IExlZ2VuZHNXaXRoQ3VzdG9tTGVnZW5kcyA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIG92ZXJyaWRlQnlDdXN0b21MZWdlbmQoe1xuICAgICAgICBjb2xvckxlZ2VuZHM6IHJhbmdlPy5jb2xvckxlZ2VuZHMsXG4gICAgICAgIGN1cnJlbnRMZWdlbmRzXG4gICAgICB9KSxcbiAgICBbcmFuZ2U/LmNvbG9yTGVnZW5kcywgY3VycmVudExlZ2VuZHNdXG4gICk7XG5cbiAgcmV0dXJuIExlZ2VuZHNXaXRoQ3VzdG9tTGVnZW5kcyB8fCBbXTtcbn1cblxuZXhwb3J0IHR5cGUgQ29sb3JMZWdlbmRQcm9wcyA9IHtcbiAgbGF5ZXI6IExheWVyO1xuICBzY2FsZVR5cGU6IHN0cmluZztcbiAgZG9tYWluOiBudW1iZXJbXSB8IHN0cmluZ1tdO1xuICBmaWVsZFR5cGU/OiBzdHJpbmcgfCBudWxsO1xuICByYW5nZT86IENvbG9yUmFuZ2UgfCBudWxsO1xuICBsYWJlbEZvcm1hdD86IChuOiBhbnkpID0+IHN0cmluZztcbiAgZGlzcGxheUxhYmVsPzogYm9vbGVhbjtcbiAgZGlzYWJsZUVkaXQ/OiBib29sZWFuO1xuICBtYXBTdGF0ZT86IE1hcFN0YXRlO1xuICBpc0ZpeGVkPzogYm9vbGVhbjtcbiAgaXNFeHBhbmRlZD86IGJvb2xlYW47XG4gIG9uVXBkYXRlQ29sb3JMZWdlbmQ/OiAoY29sb3JMZWdlbmRzOiB7W2tleTogSGV4Q29sb3JdOiBzdHJpbmd9KSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IHR5cGUgTGVnZW5kID0ge1xuICBkYXRhOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIG92ZXJyaWRlPzogYm9vbGVhbjtcbn07XG5cbkNvbG9yTGVnZW5kRmFjdG9yeS5kZXBzID0gW0xlZ2VuZFJvd0ZhY3RvcnldO1xuZnVuY3Rpb24gQ29sb3JMZWdlbmRGYWN0b3J5KExlZ2VuZFJvdzogUmV0dXJuVHlwZTx0eXBlb2YgTGVnZW5kUm93RmFjdG9yeT4pIHtcbiAgY29uc3QgQ29sb3JMZWdlbmQ6IFJlYWN0LkZDPENvbG9yTGVnZW5kUHJvcHM+ID0gKHtcbiAgICBsYXllcixcbiAgICBpc0ZpeGVkLFxuICAgIGlzRXhwYW5kZWQsXG4gICAgZG9tYWluLFxuICAgIHJhbmdlLFxuICAgIGxhYmVsRm9ybWF0LFxuICAgIHNjYWxlVHlwZSxcbiAgICBmaWVsZFR5cGUsXG4gICAgbWFwU3RhdGUsXG4gICAgb25VcGRhdGVDb2xvckxlZ2VuZCxcbiAgICBkaXNwbGF5TGFiZWwgPSB0cnVlLFxuICAgIGRpc2FibGVFZGl0ID0gZmFsc2VcbiAgfSkgPT4ge1xuICAgIGNvbnN0IHtjb2xvckxlZ2VuZHN9ID0gcmFuZ2UgfHwge307XG5cbiAgICBjb25zdCBsZWdlbmRzID0gdXNlTGF5ZXJDb2xvckxlZ2VuZHMoXG4gICAgICBsYXllcixcbiAgICAgIHNjYWxlVHlwZSxcbiAgICAgIGRvbWFpbixcbiAgICAgIHJhbmdlLFxuICAgICAgaXNGaXhlZCxcbiAgICAgIGZpZWxkVHlwZSxcbiAgICAgIGxhYmVsRm9ybWF0LFxuICAgICAgbWFwU3RhdGVcbiAgICApO1xuXG4gICAgY29uc3Qgb25VcGRhdGVMYWJlbCA9IHVzZUNhbGxiYWNrKFxuICAgICAgKGNvbG9yLCBuZXdWYWx1ZSkgPT4ge1xuICAgICAgICBpZiAob25VcGRhdGVDb2xvckxlZ2VuZCkge1xuICAgICAgICAgIG9uVXBkYXRlQ29sb3JMZWdlbmQoe1xuICAgICAgICAgICAgLi4uY29sb3JMZWdlbmRzLFxuICAgICAgICAgICAgW2NvbG9yXTogbmV3VmFsdWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtvblVwZGF0ZUNvbG9yTGVnZW5kLCBjb2xvckxlZ2VuZHNdXG4gICAgKTtcblxuICAgIGNvbnN0IG9uUmVzZXRMYWJlbCA9IHVzZUNhbGxiYWNrKFxuICAgICAgY29sb3IgPT4ge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IHtbY29sb3JdOiBfLCAuLi5yZXN0fSA9IGNvbG9yTGVnZW5kcztcbiAgICAgICAgaWYgKG9uVXBkYXRlQ29sb3JMZWdlbmQgJiYgcmVzdCkge1xuICAgICAgICAgIG9uVXBkYXRlQ29sb3JMZWdlbmQocmVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICAgICAgfSxcbiAgICAgIFtvblVwZGF0ZUNvbG9yTGVnZW5kLCBjb2xvckxlZ2VuZHNdXG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8U3R5bGVkTGVnZW5kXG4gICAgICAgIGNsYXNzTmFtZT1cInN0eWxlZC1jb2xvci1sZWdlbmRcIlxuICAgICAgICBkaXNhYmxlRWRpdD17ZGlzYWJsZUVkaXR9XG4gICAgICAgIGlzRXhwYW5kZWQ9e2lzRXhwYW5kZWR9XG4gICAgICA+XG4gICAgICAgIHtsZWdlbmRzLm1hcCgobGVnZW5kLCBpKSA9PiAoXG4gICAgICAgICAgPExlZ2VuZFJvd1xuICAgICAgICAgICAga2V5PXtgJHtsZWdlbmQuZGF0YX0tJHtpfWB9XG4gICAgICAgICAgICBsYWJlbD17bGVnZW5kLmxhYmVsfVxuICAgICAgICAgICAgZGlzcGxheUxhYmVsPXtkaXNwbGF5TGFiZWx9XG4gICAgICAgICAgICBjb2xvcj17bGVnZW5kLmRhdGF9XG4gICAgICAgICAgICBvblVwZGF0ZUxhYmVsPXshZGlzYWJsZUVkaXQgPyBvblVwZGF0ZUxhYmVsIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgb25SZXNldExhYmVsPXtsZWdlbmQub3ZlcnJpZGUgJiYgIWRpc2FibGVFZGl0ID8gb25SZXNldExhYmVsIDogdW5kZWZpbmVkfVxuICAgICAgICAgIC8+XG4gICAgICAgICkpfVxuICAgICAgPC9TdHlsZWRMZWdlbmQ+XG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gUmVhY3QubWVtbyhDb2xvckxlZ2VuZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbG9yTGVnZW5kRmFjdG9yeTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxpQkFBQSxHQUFBRix1QkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUUsVUFBQSxHQUFBRixPQUFBO0FBR0EsSUFBQUcsTUFBQSxHQUFBSCxPQUFBO0FBUUEsSUFBQUksTUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssa0JBQUEsR0FBQUwsT0FBQTtBQUFnRCxJQUFBTSxlQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBbEJoRDtBQUNBO0FBQUEsU0FBQUMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFkLHdCQUFBYyxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JBQUFLLE9BQUEsQ0FBQUwsQ0FBQSwwQkFBQUEsQ0FBQSxzQkFBQUEsQ0FBQSxRQUFBRyxDQUFBLEdBQUFKLHdCQUFBLENBQUFHLENBQUEsT0FBQUMsQ0FBQSxJQUFBQSxDQUFBLENBQUFHLEdBQUEsQ0FBQU4sQ0FBQSxVQUFBRyxDQUFBLENBQUFJLEdBQUEsQ0FBQVAsQ0FBQSxPQUFBUSxDQUFBLEtBQUFDLFNBQUEsVUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLGNBQUEsSUFBQUQsTUFBQSxDQUFBRSx3QkFBQSxXQUFBQyxDQUFBLElBQUFkLENBQUEsb0JBQUFjLENBQUEsT0FBQUMsY0FBQSxDQUFBQyxJQUFBLENBQUFoQixDQUFBLEVBQUFjLENBQUEsU0FBQUcsQ0FBQSxHQUFBUCxDQUFBLEdBQUFDLE1BQUEsQ0FBQUUsd0JBQUEsQ0FBQWIsQ0FBQSxFQUFBYyxDQUFBLFVBQUFHLENBQUEsS0FBQUEsQ0FBQSxDQUFBVixHQUFBLElBQUFVLENBQUEsQ0FBQUMsR0FBQSxJQUFBUCxNQUFBLENBQUFDLGNBQUEsQ0FBQUosQ0FBQSxFQUFBTSxDQUFBLEVBQUFHLENBQUEsSUFBQVQsQ0FBQSxDQUFBTSxDQUFBLElBQUFkLENBQUEsQ0FBQWMsQ0FBQSxZQUFBTixDQUFBLGNBQUFSLENBQUEsRUFBQUcsQ0FBQSxJQUFBQSxDQUFBLENBQUFlLEdBQUEsQ0FBQWxCLENBQUEsRUFBQVEsQ0FBQSxHQUFBQSxDQUFBO0FBQUEsU0FBQVcsZUFBQWhCLENBQUEsUUFBQWMsQ0FBQSxHQUFBRyxZQUFBLENBQUFqQixDQUFBLGdDQUFBRSxPQUFBLENBQUFZLENBQUEsSUFBQUEsQ0FBQSxHQUFBQSxDQUFBO0FBQUEsU0FBQUcsYUFBQWpCLENBQUEsRUFBQUQsQ0FBQSxvQkFBQUcsT0FBQSxDQUFBRixDQUFBLE1BQUFBLENBQUEsU0FBQUEsQ0FBQSxNQUFBSCxDQUFBLEdBQUFHLENBQUEsQ0FBQWtCLE1BQUEsQ0FBQUMsV0FBQSxrQkFBQXRCLENBQUEsUUFBQWlCLENBQUEsR0FBQWpCLENBQUEsQ0FBQWdCLElBQUEsQ0FBQWIsQ0FBQSxFQUFBRCxDQUFBLGdDQUFBRyxPQUFBLENBQUFZLENBQUEsVUFBQUEsQ0FBQSxZQUFBTSxTQUFBLHlFQUFBckIsQ0FBQSxHQUFBc0IsTUFBQSxHQUFBQyxNQUFBLEVBQUF0QixDQUFBO0FBQUEsU0FBQXVCLFFBQUExQixDQUFBLEVBQUFFLENBQUEsUUFBQUMsQ0FBQSxHQUFBUSxNQUFBLENBQUFnQixJQUFBLENBQUEzQixDQUFBLE9BQUFXLE1BQUEsQ0FBQWlCLHFCQUFBLFFBQUFDLENBQUEsR0FBQWxCLE1BQUEsQ0FBQWlCLHFCQUFBLENBQUE1QixDQUFBLEdBQUFFLENBQUEsS0FBQTJCLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUE1QixDQUFBLFdBQUFTLE1BQUEsQ0FBQUUsd0JBQUEsQ0FBQWIsQ0FBQSxFQUFBRSxDQUFBLEVBQUE2QixVQUFBLE9BQUE1QixDQUFBLENBQUE2QixJQUFBLENBQUFDLEtBQUEsQ0FBQTlCLENBQUEsRUFBQTBCLENBQUEsWUFBQTFCLENBQUE7QUFBQSxTQUFBK0IsY0FBQWxDLENBQUEsYUFBQUUsQ0FBQSxNQUFBQSxDQUFBLEdBQUFpQyxTQUFBLENBQUFDLE1BQUEsRUFBQWxDLENBQUEsVUFBQUMsQ0FBQSxXQUFBZ0MsU0FBQSxDQUFBakMsQ0FBQSxJQUFBaUMsU0FBQSxDQUFBakMsQ0FBQSxRQUFBQSxDQUFBLE9BQUF3QixPQUFBLENBQUFmLE1BQUEsQ0FBQVIsQ0FBQSxPQUFBa0MsT0FBQSxXQUFBbkMsQ0FBQSxRQUFBb0MsZ0JBQUEsYUFBQXRDLENBQUEsRUFBQUUsQ0FBQSxFQUFBQyxDQUFBLENBQUFELENBQUEsU0FBQVMsTUFBQSxDQUFBNEIseUJBQUEsR0FBQTVCLE1BQUEsQ0FBQTZCLGdCQUFBLENBQUF4QyxDQUFBLEVBQUFXLE1BQUEsQ0FBQTRCLHlCQUFBLENBQUFwQyxDQUFBLEtBQUF1QixPQUFBLENBQUFmLE1BQUEsQ0FBQVIsQ0FBQSxHQUFBa0MsT0FBQSxXQUFBbkMsQ0FBQSxJQUFBUyxNQUFBLENBQUFDLGNBQUEsQ0FBQVosQ0FBQSxFQUFBRSxDQUFBLEVBQUFTLE1BQUEsQ0FBQUUsd0JBQUEsQ0FBQVYsQ0FBQSxFQUFBRCxDQUFBLGlCQUFBRixDQUFBO0FBbUJBLElBQU15QyxLQUFLLEdBQUcsRUFBRTtBQUNoQixJQUFNQyxHQUFHLEdBQUcsQ0FBQztBQUNiLElBQU1DLE1BQU0sR0FBRyxFQUFFO0FBRWpCLElBQU1DLG9CQUFvQixHQUFHLFNBQXZCQSxvQkFBb0JBLENBQUc1QyxDQUFDO0VBQUEsT0FBSUEsQ0FBQyxDQUFDNkMsZUFBZSxDQUFDLENBQUM7QUFBQTtBQUVyRCxJQUFNQyxRQUFRLE9BQUdDLHFCQUFHLEVBQUF0RCxlQUFBLEtBQUFBLGVBQUEsT0FBQXVELHVCQUFBLGlFQUluQjtBQUNELElBQU1DLFlBQVksR0FBR0MsNEJBQU0sQ0FBQ0MsR0FBRyxDQUFBekQsZ0JBQUEsS0FBQUEsZ0JBQUEsT0FBQXNELHVCQUFBLDhKQUMzQixVQUFBSSxLQUFLO0VBQUEsT0FBSUEsS0FBSyxDQUFDQyxLQUFLLENBQUNDLGtCQUFrQjtBQUFBLEdBQ3ZDLFVBQUFGLEtBQUs7RUFBQSxPQUFLQSxLQUFLLENBQUNHLFVBQVUsR0FBRyxFQUFFLHVCQUF1QjtBQUFBLENBQUMsRUFFeENiLEdBQUcsRUFFSkEsR0FBRyxFQUdqQixVQUFBVSxLQUFLO0VBQUEsT0FBS0EsS0FBSyxDQUFDSSxXQUFXLEdBQUdWLFFBQVEsR0FBRyxFQUFFO0FBQUEsQ0FBQyxDQUMvQztBQUVELElBQU1XLGVBQWUsR0FBR1AsNEJBQU0sQ0FBQ0MsR0FBRyxDQUFBeEQsZ0JBQUEsS0FBQUEsZ0JBQUEsT0FBQXFELHVCQUFBLGlGQUlqQztBQUVNLFNBQVNVLHNCQUFzQkEsQ0FBQSxFQUFHO0VBQ3ZDLE9BQU8sSUFBQVIsNEJBQU0sRUFBQ1MsWUFBSyxDQUFDLENBQUEvRCxnQkFBQSxLQUFBQSxnQkFBQSxPQUFBb0QsdUJBQUEsNkdBQ1QsVUFBQUksS0FBSztJQUFBLE9BQUlBLEtBQUssQ0FBQ0MsS0FBSyxDQUFDTyxZQUFZO0VBQUEsR0FJL0IsVUFBQVIsS0FBSztJQUFBLE9BQUlBLEtBQUssQ0FBQ0MsS0FBSyxDQUFDUSxvQkFBb0I7RUFBQTtBQUd4RDtBQUVBLElBQU1DLGdCQUFnQixHQUFHLElBQUFaLDRCQUFNLEVBQUNhLDhCQUFXLENBQUMsQ0FBQWxFLGdCQUFBLEtBQUFBLGdCQUFBLE9BQUFtRCx1QkFBQSxnTkFFM0JQLEtBQUssRUFDVkEsS0FBSyxFQUNOLFVBQUFXLEtBQUs7RUFBQSxPQUFJQSxLQUFLLENBQUNDLEtBQUssQ0FBQ1csU0FBUztBQUFBLEdBSTNCdEIsR0FBRyxFQUVIRCxLQUFLLENBRWxCO0FBU00sU0FBU3dCLHNCQUFzQkEsQ0FBQSxFQUFHO0VBQ3ZDLElBQU1DLGVBQStDLEdBQUcsU0FBbERBLGVBQStDQSxDQUFBQyxJQUFBLEVBSy9DO0lBQUEsSUFKSkMsS0FBSyxHQUFBRCxJQUFBLENBQUxDLEtBQUs7TUFDTEMsS0FBSyxHQUFBRixJQUFBLENBQUxFLEtBQUs7TUFDTEMsTUFBTSxHQUFBSCxJQUFBLENBQU5HLE1BQU07TUFBQUMsYUFBQSxHQUFBSixJQUFBLENBQ05LLFFBQVE7TUFBUkEsUUFBUSxHQUFBRCxhQUFBLGNBQUcsS0FBSyxHQUFBQSxhQUFBO0lBRWhCLElBQU1FLFFBQVEsR0FBRyxJQUFBQyxrQkFBVyxFQUFDLFVBQUFDLEtBQUs7TUFBQSxPQUFJTCxNQUFNLENBQUNLLEtBQUssQ0FBQ0MsTUFBTSxDQUFDQyxLQUFLLENBQUM7SUFBQSxHQUFFLENBQUNQLE1BQU0sQ0FBQyxDQUFDO0lBQzNFLG9CQUNFckYsTUFBQSxZQUFBNkYsYUFBQSxDQUFDaEIsZ0JBQWdCO01BQ2ZpQixJQUFJLEVBQUMsTUFBTTtNQUNYQyxTQUFTLEVBQUMsOEJBQThCO01BQ3hDSCxLQUFLLEVBQUVSLEtBQU07TUFDYlksT0FBTyxFQUFFckMsb0JBQXFCO01BQzlCNkIsUUFBUSxFQUFFQSxRQUFTO01BQ25CRCxRQUFRLEVBQUVBLFFBQVM7TUFDbkJVLEVBQUUsS0FBQUMsTUFBQSxDQUFLZixLQUFLO0lBQXNCLENBQ25DLENBQUM7RUFFTixDQUFDO0VBRURGLGVBQWUsQ0FBQ2tCLFdBQVcsR0FBRyxpQkFBaUI7RUFDL0MsT0FBT2xCLGVBQWU7QUFDeEI7QUFFQSxJQUFNbUIsY0FBYyxHQUFHO0VBQ3JCQyxLQUFLLEtBQUFILE1BQUEsQ0FBS3hDLE1BQU0sT0FBSTtFQUNwQjRDLE1BQU0sS0FBQUosTUFBQSxDQUFLMUMsS0FBSztBQUNsQixDQUFDO0FBRU0sU0FBUytDLHlCQUF5QkEsQ0FBQSxFQUFHO0VBQzFDLElBQU1DLGtCQUFrQixHQUFHLFNBQXJCQSxrQkFBa0JBLENBQUFDLEtBQUEsRUFBZ0I7SUFBQSxJQUFYdEIsS0FBSyxHQUFBc0IsS0FBQSxDQUFMdEIsS0FBSztJQUNoQyxJQUFNdUIsS0FBSyxHQUFHLElBQUFDLGNBQU8sRUFDbkI7TUFBQSxPQUFBMUQsYUFBQSxDQUFBQSxhQUFBLEtBQVdtRCxjQUFjO1FBQUVRLGVBQWUsRUFBRXpCLEtBQUs7UUFBRTBCLFdBQVcsS0FBQVgsTUFBQSxDQUFLekMsR0FBRztNQUFJO0lBQUEsQ0FBRSxFQUM1RSxDQUFDMEIsS0FBSyxDQUNSLENBQUM7SUFDRCxvQkFBT25GLE1BQUEsWUFBQTZGLGFBQUE7TUFBS2EsS0FBSyxFQUFFQSxLQUFNO01BQUNYLFNBQVMsRUFBQztJQUFrQixDQUFFLENBQUM7RUFDM0QsQ0FBQztFQUVELE9BQU9TLGtCQUFrQjtBQUMzQjtBQUVBLElBQU1NLFdBQVcsR0FBRzdDLDRCQUFNLENBQUNDLEdBQUcsQ0FBQXJELGdCQUFBLEtBQUFBLGdCQUFBLE9BQUFrRCx1QkFBQSxpRkFFbkIsVUFBQUksS0FBSztFQUFBLE9BQUlBLEtBQUssQ0FBQ0MsS0FBSyxDQUFDVyxTQUFTO0FBQUEsRUFFeEM7QUFZRGdDLGdCQUFnQixDQUFDQyxJQUFJLEdBQUcsQ0FBQ1QseUJBQXlCLEVBQUV2QixzQkFBc0IsRUFBRVAsc0JBQXNCLENBQUM7QUFDNUYsU0FBU3NDLGdCQUFnQkEsQ0FDOUJQLGtCQUFnRSxFQUNoRXZCLGVBQTBELEVBQzFEZ0MsZUFBMEQsRUFDMUQ7RUFDQSxJQUFNQyxTQUFtQyxHQUFHLFNBQXRDQSxTQUFtQ0EsQ0FBQUMsS0FBQSxFQU1uQztJQUFBLElBQUFDLFdBQUEsR0FBQUQsS0FBQSxDQUxKL0IsS0FBSztNQUFMQSxLQUFLLEdBQUFnQyxXQUFBLGNBQUcsRUFBRSxHQUFBQSxXQUFBO01BQ1ZDLFlBQVksR0FBQUYsS0FBQSxDQUFaRSxZQUFZO01BQ1psQyxLQUFLLEdBQUFnQyxLQUFBLENBQUxoQyxLQUFLO01BQ0xtQyxhQUFhLEdBQUFILEtBQUEsQ0FBYkcsYUFBYTtNQUNiQyxZQUFZLEdBQUFKLEtBQUEsQ0FBWkksWUFBWTtJQUVaLElBQU1sQyxNQUFNLEdBQUcsSUFBQUksa0JBQVcsRUFDeEIsVUFBQStCLFFBQVE7TUFBQSxPQUFJRixhQUFhLElBQUlBLGFBQWEsQ0FBQ25DLEtBQUssRUFBRXFDLFFBQVEsQ0FBQztJQUFBLEdBQzNELENBQUNyQyxLQUFLLEVBQUVtQyxhQUFhLENBQ3ZCLENBQUM7SUFDRCxJQUFNRyxPQUFPLEdBQUcsSUFBQWhDLGtCQUFXLEVBQUM7TUFBQSxPQUFNOEIsWUFBWSxJQUFJQSxZQUFZLENBQUNwQyxLQUFLLENBQUM7SUFBQSxHQUFFLENBQUNBLEtBQUssRUFBRW9DLFlBQVksQ0FBQyxDQUFDO0lBQzdGLElBQU0zQixLQUFLLEdBQUd5QixZQUFZLEdBQUdqQyxLQUFLLENBQUNzQyxRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUU7SUFDbEQsb0JBQ0UxSCxNQUFBLFlBQUE2RixhQUFBLENBQUNyQixlQUFlLHFCQUNkeEUsTUFBQSxZQUFBNkYsYUFBQSxDQUFDVyxrQkFBa0I7TUFBQ3JCLEtBQUssRUFBRUE7SUFBTSxDQUFFLENBQUMsRUFDbkNtQyxhQUFhLGdCQUNadEgsTUFBQSxZQUFBNkYsYUFBQSxDQUFDWixlQUFlO01BQUNNLFFBQVEsRUFBRSxDQUFDK0IsYUFBYztNQUFDbEMsS0FBSyxFQUFFUSxLQUFNO01BQUNULEtBQUssRUFBRUEsS0FBTTtNQUFDRSxNQUFNLEVBQUVBO0lBQU8sQ0FBRSxDQUFDLGdCQUV6RnJGLE1BQUEsWUFBQTZGLGFBQUEsQ0FBQ2lCLFdBQVcsUUFBRWxCLEtBQW1CLENBQ2xDLEVBQ0EyQixZQUFZLGdCQUFHdkgsTUFBQSxZQUFBNkYsYUFBQSxDQUFDb0IsZUFBZTtNQUFDakIsT0FBTyxFQUFFeUIsT0FBUTtNQUFDbkIsTUFBTSxFQUFDO0lBQU0sQ0FBRSxDQUFDLEdBQUcsSUFDdkQsQ0FBQztFQUV0QixDQUFDO0VBQ0RZLFNBQVMsQ0FBQ2YsV0FBVyxHQUFHLFdBQVc7RUFDbkMsT0FBT2UsU0FBUztBQUNsQjtBQUVBLElBQU1TLG9CQUFvQixHQUFHLFNBQXZCQSxvQkFBb0JBLENBQUlDLFlBQVksRUFBRUMsU0FBUyxFQUFLO0VBQ3hELElBQU9DLElBQUksR0FBWUQsU0FBUyxDQUF6QkMsSUFBSTtJQUFFQyxNQUFNLEdBQUlGLFNBQVMsQ0FBbkJFLE1BQU07RUFFbkIsSUFBTUMsZUFBZSxPQUFBQyxtQkFBQSxhQUFPTCxZQUFZLENBQUM7RUFFekNFLElBQUksQ0FBQzFFLE9BQU8sQ0FBQyxVQUFDOEUsS0FBSyxFQUFFQyxLQUFLLEVBQUs7SUFDN0IsSUFBTUMsWUFBWSxHQUFHUixZQUFZLENBQUNTLFNBQVMsQ0FBQyxVQUFBQyxDQUFDO01BQUEsT0FBSUEsQ0FBQyxDQUFDUixJQUFJLEtBQUtJLEtBQUs7SUFBQSxFQUFDO0lBQ2xFLElBQUlFLFlBQVksS0FBSyxDQUFDLENBQUMsRUFBRTtNQUN2QkosZUFBZSxDQUFDSSxZQUFZLENBQUMsR0FBRztRQUM5QmhELEtBQUssRUFBRTJDLE1BQU0sQ0FBQ0ksS0FBSyxDQUFDO1FBQ3BCTCxJQUFJLEVBQUVJLEtBQUs7UUFDWEssUUFBUSxFQUFFO01BQ1osQ0FBQztNQUNEUCxlQUFlLENBQUNJLFlBQVksQ0FBQyxDQUFDaEQsS0FBSyxHQUFHMkMsTUFBTSxDQUFDSSxLQUFLLENBQUM7SUFDckQsQ0FBQyxNQUFNO01BQ0xILGVBQWUsQ0FBQ2pGLElBQUksQ0FBQztRQUNuQitFLElBQUksRUFBRUksS0FBSztRQUNYOUMsS0FBSyxFQUFFMkMsTUFBTSxDQUFDSSxLQUFLLENBQUM7UUFDcEJJLFFBQVEsRUFBRTtNQUNaLENBQUMsQ0FBQztJQUNKO0VBQ0YsQ0FBQyxDQUFDO0VBRUYsT0FBT1AsZUFBZTtBQUN4QixDQUFDO0FBYUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNRLHNCQUFzQkEsQ0FBQUMsS0FBQSxFQUFnRTtFQUFBLElBQTlEYixZQUFZLEdBQUFhLEtBQUEsQ0FBWmIsWUFBWTtJQUFFYyxjQUFjLEdBQUFELEtBQUEsQ0FBZEMsY0FBYztFQUMzRCxJQUFJZCxZQUFZLElBQUksSUFBQWUsZUFBUSxFQUFDZixZQUFZLENBQUMsRUFBRTtJQUMxQztJQUNBLElBQU1FLElBQUksR0FBR3BHLE1BQU0sQ0FBQ2dCLElBQUksQ0FBQ2tGLFlBQVksQ0FBQztJQUN0QyxJQUFNRyxNQUFNLEdBQUdyRyxNQUFNLENBQUNrSCxNQUFNLENBQUNoQixZQUFZLENBQUM7SUFFMUMsT0FBT0Qsb0JBQW9CLENBQUNlLGNBQWMsRUFBRTtNQUFDWixJQUFJLEVBQUpBLElBQUk7TUFBRUMsTUFBTSxFQUFOQTtJQUFNLENBQUMsQ0FBQztFQUM3RDtFQUVBLE9BQU9XLGNBQWM7QUFDdkI7QUFFTyxTQUFTRyxvQkFBb0JBLENBQ2xDQyxLQUFnQyxFQUNoQ0MsU0FBd0MsRUFDeENDLE1BQWtDLEVBQ2xDQyxLQUFnQyxFQUNoQ0MsT0FBb0MsRUFDcENDLFNBQXdDLEVBQ3hDQyxXQUE0QyxFQUM1Q0MsUUFBc0MsRUFDNUI7RUFDVixJQUFNQyxLQUFLLEdBQUcsSUFBQTNDLGNBQU8sRUFDbkI7SUFBQSxPQUFNLElBQUE0Qyx5QkFBa0IsRUFBQztNQUFDTixLQUFLLEVBQUxBLEtBQUs7TUFBRUQsTUFBTSxFQUFOQSxNQUFNO01BQUVELFNBQVMsRUFBVEEsU0FBUztNQUFFRyxPQUFPLEVBQVBBLE9BQU87TUFBRUosS0FBSyxFQUFMQTtJQUFLLENBQUMsQ0FBQztFQUFBLEdBQ3BFLENBQUNHLEtBQUssRUFBRUQsTUFBTSxFQUFFRCxTQUFTLEVBQUVHLE9BQU8sRUFBRUosS0FBSyxDQUMzQyxDQUFDO0VBRUQsSUFBTVUsV0FBVyxHQUFHLElBQUE3QyxjQUFPLEVBQ3pCO0lBQUEsT0FBTSxJQUFBOEMsa0NBQTJCLEVBQUM7TUFBQ0gsS0FBSyxFQUFMQSxLQUFLO01BQUVSLEtBQUssRUFBTEEsS0FBSztNQUFFTyxRQUFRLEVBQVJBO0lBQVEsQ0FBQyxDQUFDO0VBQUEsR0FDM0QsQ0FBQ0MsS0FBSyxFQUFFUixLQUFLLEVBQUVPLFFBQVEsQ0FDekIsQ0FBQztFQUVELElBQU1YLGNBQWMsR0FBRyxJQUFBL0IsY0FBTyxFQUFDLFlBQU07SUFDbkMsSUFBSW9DLFNBQVMsS0FBS1csc0JBQVcsQ0FBQ0MsYUFBYSxJQUFJVixLQUFLLGFBQUxBLEtBQUssZUFBTEEsS0FBSyxDQUFFVyxRQUFRLEVBQUU7TUFDOUQsSUFBTUMsV0FBVyxHQUFHLElBQUFDLHVDQUFnQyxFQUFDYixLQUFLLENBQUNXLFFBQVEsQ0FBQztNQUNwRSxPQUFPQyxXQUFXLGFBQVhBLFdBQVcsdUJBQVhBLFdBQVcsQ0FBRUUsR0FBRyxDQUFDLFVBQUFDLEVBQUUsRUFBSTtRQUM1QixPQUFPO1VBQ0xsQyxJQUFJLEVBQUVrQyxFQUFFLENBQUNsQyxJQUFJO1VBQ2IxQyxLQUFLLEVBQUU2RSxLQUFLLENBQUNDLE9BQU8sQ0FBQ0YsRUFBRSxDQUFDNUUsS0FBSyxDQUFDLEdBQzFCNEUsRUFBRSxDQUFDNUUsS0FBSyxDQUFDakMsTUFBTSxHQUFHLENBQUMsTUFBQStDLE1BQUEsQ0FDZDhELEVBQUUsQ0FBQzVFLEtBQUssQ0FBQ2pDLE1BQU0saUJBQ2xCNkcsRUFBRSxDQUFDNUUsS0FBSyxHQUNWNEUsRUFBRSxDQUFDNUUsS0FBSyxJQUFJO1FBQ2xCLENBQUM7TUFDSCxDQUFDLENBQUM7SUFDSjtJQUNBLE9BQU8sSUFBQStFLHVCQUFnQixFQUFDO01BQUNiLEtBQUssRUFBRUUsV0FBVztNQUFFVCxTQUFTLEVBQVRBLFNBQVM7TUFBRUssV0FBVyxFQUFYQSxXQUFXO01BQUVELFNBQVMsRUFBVEE7SUFBUyxDQUFDLENBQUM7RUFDbEYsQ0FBQyxFQUFFLENBQUNGLEtBQUssRUFBRU8sV0FBVyxFQUFFVCxTQUFTLEVBQUVLLFdBQVcsRUFBRUQsU0FBUyxDQUFDLENBQUM7RUFFM0QsSUFBTWlCLHdCQUF3QixHQUFHLElBQUF6RCxjQUFPLEVBQ3RDO0lBQUEsT0FDRTZCLHNCQUFzQixDQUFDO01BQ3JCWixZQUFZLEVBQUVxQixLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRXJCLFlBQVk7TUFDakNjLGNBQWMsRUFBZEE7SUFDRixDQUFDLENBQUM7RUFBQSxHQUNKLENBQUNPLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFckIsWUFBWSxFQUFFYyxjQUFjLENBQ3RDLENBQUM7RUFFRCxPQUFPMEIsd0JBQXdCLElBQUksRUFBRTtBQUN2QztBQXVCQUMsa0JBQWtCLENBQUNyRCxJQUFJLEdBQUcsQ0FBQ0QsZ0JBQWdCLENBQUM7QUFDNUMsU0FBU3NELGtCQUFrQkEsQ0FBQ25ELFNBQThDLEVBQUU7RUFDMUUsSUFBTW9ELFdBQXVDLEdBQUcsU0FBMUNBLFdBQXVDQSxDQUFBQyxLQUFBLEVBYXZDO0lBQUEsSUFaSnpCLEtBQUssR0FBQXlCLEtBQUEsQ0FBTHpCLEtBQUs7TUFDTEksT0FBTyxHQUFBcUIsS0FBQSxDQUFQckIsT0FBTztNQUNQNUUsVUFBVSxHQUFBaUcsS0FBQSxDQUFWakcsVUFBVTtNQUNWMEUsTUFBTSxHQUFBdUIsS0FBQSxDQUFOdkIsTUFBTTtNQUNOQyxLQUFLLEdBQUFzQixLQUFBLENBQUx0QixLQUFLO01BQ0xHLFdBQVcsR0FBQW1CLEtBQUEsQ0FBWG5CLFdBQVc7TUFDWEwsU0FBUyxHQUFBd0IsS0FBQSxDQUFUeEIsU0FBUztNQUNUSSxTQUFTLEdBQUFvQixLQUFBLENBQVRwQixTQUFTO01BQ1RFLFFBQVEsR0FBQWtCLEtBQUEsQ0FBUmxCLFFBQVE7TUFDUm1CLG1CQUFtQixHQUFBRCxLQUFBLENBQW5CQyxtQkFBbUI7TUFBQUMsa0JBQUEsR0FBQUYsS0FBQSxDQUNuQmxELFlBQVk7TUFBWkEsWUFBWSxHQUFBb0Qsa0JBQUEsY0FBRyxJQUFJLEdBQUFBLGtCQUFBO01BQUFDLGlCQUFBLEdBQUFILEtBQUEsQ0FDbkJoRyxXQUFXO01BQVhBLFdBQVcsR0FBQW1HLGlCQUFBLGNBQUcsS0FBSyxHQUFBQSxpQkFBQTtJQUVuQixJQUFBQyxLQUFBLEdBQXVCMUIsS0FBSyxJQUFJLENBQUMsQ0FBQztNQUEzQnJCLFlBQVksR0FBQStDLEtBQUEsQ0FBWi9DLFlBQVk7SUFFbkIsSUFBTWdELE9BQU8sR0FBRy9CLG9CQUFvQixDQUNsQ0MsS0FBSyxFQUNMQyxTQUFTLEVBQ1RDLE1BQU0sRUFDTkMsS0FBSyxFQUNMQyxPQUFPLEVBQ1BDLFNBQVMsRUFDVEMsV0FBVyxFQUNYQyxRQUNGLENBQUM7SUFFRCxJQUFNL0IsYUFBYSxHQUFHLElBQUE3QixrQkFBVyxFQUMvQixVQUFDTixLQUFLLEVBQUUwRixRQUFRLEVBQUs7TUFDbkIsSUFBSUwsbUJBQW1CLEVBQUU7UUFDdkJBLG1CQUFtQixDQUFBdkgsYUFBQSxDQUFBQSxhQUFBLEtBQ2QyRSxZQUFZLFdBQUF2RSxnQkFBQSxpQkFDZDhCLEtBQUssRUFBRzBGLFFBQVEsRUFDbEIsQ0FBQztNQUNKO0lBQ0YsQ0FBQyxFQUNELENBQUNMLG1CQUFtQixFQUFFNUMsWUFBWSxDQUNwQyxDQUFDO0lBRUQsSUFBTUwsWUFBWSxHQUFHLElBQUE5QixrQkFBVyxFQUM5QixVQUFBTixLQUFLLEVBQUk7TUFDUDtNQUNBO01BQ0EsSUFBZ0IyRixDQUFDLEdBQWFsRCxZQUFZLENBQWxDekMsS0FBSztRQUFTNEYsSUFBSSxPQUFBQyx5QkFBQSxhQUFJcEQsWUFBWSxHQUFsQ3pDLEtBQUssRUFBQTRFLEdBQUEsQ0FBQTdILGNBQUE7TUFDYixJQUFJc0ksbUJBQW1CLElBQUlPLElBQUksRUFBRTtRQUMvQlAsbUJBQW1CLENBQUNPLElBQUksQ0FBQztNQUMzQjtNQUNBO0lBQ0YsQ0FBQyxFQUNELENBQUNQLG1CQUFtQixFQUFFNUMsWUFBWSxDQUNwQyxDQUFDO0lBRUQsb0JBQ0U1SCxNQUFBLFlBQUE2RixhQUFBLENBQUM3QixZQUFZO01BQ1grQixTQUFTLEVBQUMscUJBQXFCO01BQy9CeEIsV0FBVyxFQUFFQSxXQUFZO01BQ3pCRCxVQUFVLEVBQUVBO0lBQVcsR0FFdEJzRyxPQUFPLENBQUNiLEdBQUcsQ0FBQyxVQUFDa0IsTUFBTSxFQUFFakosQ0FBQztNQUFBLG9CQUNyQmhDLE1BQUEsWUFBQTZGLGFBQUEsQ0FBQ3FCLFNBQVM7UUFDUmdFLEdBQUcsS0FBQWhGLE1BQUEsQ0FBSytFLE1BQU0sQ0FBQ25ELElBQUksT0FBQTVCLE1BQUEsQ0FBSWxFLENBQUMsQ0FBRztRQUMzQm9ELEtBQUssRUFBRTZGLE1BQU0sQ0FBQzdGLEtBQU07UUFDcEJpQyxZQUFZLEVBQUVBLFlBQWE7UUFDM0JsQyxLQUFLLEVBQUU4RixNQUFNLENBQUNuRCxJQUFLO1FBQ25CUixhQUFhLEVBQUUsQ0FBQy9DLFdBQVcsR0FBRytDLGFBQWEsR0FBRzZELFNBQVU7UUFDeEQ1RCxZQUFZLEVBQUUwRCxNQUFNLENBQUMxQyxRQUFRLElBQUksQ0FBQ2hFLFdBQVcsR0FBR2dELFlBQVksR0FBRzREO01BQVUsQ0FDMUUsQ0FBQztJQUFBLENBQ0gsQ0FDVyxDQUFDO0VBRW5CLENBQUM7RUFFRCxvQkFBT0MsaUJBQUssQ0FBQ0MsSUFBSSxDQUFDZixXQUFXLENBQUM7QUFDaEM7QUFBQyxJQUFBZ0IsUUFBQSxHQUFBQyxPQUFBLGNBRWNsQixrQkFBa0IiLCJpZ25vcmVMaXN0IjpbXX0=