UNPKG

kepler.gl

Version:

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

309 lines (307 loc) 50.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = RangeSliderFactory; 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 _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _reactLifecyclesCompat = require("react-lifecycles-compat"); var _reselect = require("reselect"); var _styledComponents = _interopRequireDefault(require("styled-components")); var _rangePlot = _interopRequireDefault(require("./range-plot")); var _slider = _interopRequireDefault(require("./slider/slider")); var _styledComponents2 = require("./styled-components"); var _rangeSliderTimelinePanel = _interopRequireDefault(require("../common/range-slider-timeline-panel")); var _utils = require("@kepler.gl/utils"); var _templateObject, _templateObject2, _templateObject3; // 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 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; } 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; })(); } var noop = function noop() { return; }; var SliderInput = (0, _styledComponents["default"])(_styledComponents2.Input)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n width: ", "px;\n margin-left: ", "px;\n font-size: ", "; // 10px // 12px;\n padding: ", "; // 4px 6px; // 6px 12px;\n"])), function (props) { return props.theme.sliderInputWidth; }, function (props) { return props.flush ? 0 : props.inputSize === 'tiny' ? 12 : 18; }, function (props) { return props.theme.sliderInputFontSize; }, function (props) { return props.theme.sliderInputPadding; }); var SliderWrapper = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n position: relative;\n align-items: ", ";\n"])), function (props) { return !props.isRanged && props.showInput ? 'center' : 'flex-start'; }); var RangeInputWrapper = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n margin-top: 12px;\n display: flex;\n justify-content: space-between;\n"]))); var RANGE_SLIDER_TIMELINE_PANEL_STYLE = { marginLeft: '-32px' }; RangeSliderFactory.deps = [_rangePlot["default"], _rangeSliderTimelinePanel["default"]]; function RangeSliderFactory(RangePlot, RangeSliderSubAnimationPanel) { var RangeSlider = /*#__PURE__*/function (_Component) { function RangeSlider() { var _this; (0, _classCallCheck2["default"])(this, RangeSlider); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _callSuper(this, RangeSlider, [].concat(args)); (0, _defineProperty2["default"])(_this, "state", { value0: 0, value1: 1, prevValue0: 0, prevValue1: 1, width: 288 }); (0, _defineProperty2["default"])(_this, "sliderContainer", null); (0, _defineProperty2["default"])(_this, "setSliderContainer", function (element) { _this.sliderContainer = element; _this._resize(); }); (0, _defineProperty2["default"])(_this, "inputValue0", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2["default"])(_this, "inputValue1", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2["default"])(_this, "value0Selector", function (props) { return props.value0; }); (0, _defineProperty2["default"])(_this, "value1Selector", function (props) { return props.value1; }); (0, _defineProperty2["default"])(_this, "filterValueSelector", (0, _reselect.createSelector)(_this.value0Selector, _this.value1Selector, function (value0, value1) { return [value0, value1]; })); (0, _defineProperty2["default"])(_this, "_roundValToStep", function (val) { var _this$props = _this.props, range = _this$props.range, step = _this$props.step; if (!range || !step) return; return (0, _utils.roundValToStep)(range[0], step, val); }); (0, _defineProperty2["default"])(_this, "_setRangeVal1", function (val) { var _this$props2 = _this.props, value0 = _this$props2.value0, range = _this$props2.range, _this$props2$onChange = _this$props2.onChange, onChange = _this$props2$onChange === void 0 ? noop : _this$props2$onChange; if (!range) return; var val1 = Number(val); onChange([value0, (0, _utils.clamp)([value0, range[1]], _this._roundValToStep(val1))]); return true; }); (0, _defineProperty2["default"])(_this, "_setRangeVal0", function (val) { var _this$props3 = _this.props, value1 = _this$props3.value1, range = _this$props3.range, _this$props3$onChange = _this$props3.onChange, onChange = _this$props3$onChange === void 0 ? noop : _this$props3$onChange; if (!range) return; var val0 = Number(val); onChange([(0, _utils.clamp)([range[0], value1], _this._roundValToStep(val0)), value1]); return true; }); (0, _defineProperty2["default"])(_this, "_resize", function () { if (_this.sliderContainer) { var width = _this.sliderContainer.offsetWidth; if (width !== _this.state.width) { _this.setState({ width: width }); } } }); (0, _defineProperty2["default"])(_this, "_onChangeInput", function (key, e) { _this.setState((0, _defineProperty2["default"])({}, key, e.target.value)); }); return _this; } (0, _inherits2["default"])(RangeSlider, _Component); return (0, _createClass2["default"])(RangeSlider, [{ key: "componentDidMount", value: function componentDidMount() { if (this.sliderContainer instanceof Element) { (0, _utils.observeDimensions)(this.sliderContainer, this._resize, 100); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { if (this.sliderContainer instanceof Element) { (0, _utils.unobserveDimensions)(this.sliderContainer); } } }, { key: "_renderInput", value: function _renderInput(key) { var _this2 = this; var setRange = key === 'value0' ? this._setRangeVal0 : this._setRangeVal1; var ref = key === 'value0' ? this.inputValue0 : this.inputValue1; var update = function update(e) { if (!setRange(e.target.value)) { _this2.setState((0, _defineProperty2["default"])({}, key, _this2.state[key])); } }; var onChange = this._onChangeInput.bind(this, key); return /*#__PURE__*/_react["default"].createElement(SliderInput, { className: "kg-range-slider__input", type: "number", ref: ref, id: "slider-input-".concat(key), key: key, value: this.state[key], onChange: onChange, onKeyPress: function onKeyPress(e) { if (e.key === 'Enter') { update(e); ref.current.blur(); } }, onBlur: update, flush: key === 'value0', inputSize: this.props.inputSize, secondary: this.props.inputTheme === 'secondary' }); } // eslint-disable-next-line complexity }, { key: "render", value: function render() { var _this$props4 = this.props, isRanged = _this$props4.isRanged, showInput = _this$props4.showInput, bins = _this$props4.bins, lineChart = _this$props4.lineChart, plotType = _this$props4.plotType, invertTrendColor = _this$props4.invertTrendColor, range = _this$props4.range, _this$props4$onChange = _this$props4.onChange, onChange = _this$props4$onChange === void 0 ? noop : _this$props4$onChange, sliderHandleWidth = _this$props4.sliderHandleWidth, step = _this$props4.step, timezone = _this$props4.timezone, timeFormat = _this$props4.timeFormat, playbackControlWidth = _this$props4.playbackControlWidth, setFilterPlot = _this$props4.setFilterPlot, animationWindow = _this$props4.animationWindow, subAnimations = _this$props4.subAnimations, filter = _this$props4.filter, datasets = _this$props4.datasets; var width = this.state.width; var plotWidth = Math.max(width - Number(sliderHandleWidth), 0); var hasPlot = plotType === null || plotType === void 0 ? void 0 : plotType.type; var value = this.props.plotValue || this.filterValueSelector(this.props); var scaledValue = subAnimations !== null && subAnimations !== void 0 && subAnimations.length && range ? (0, _utils.scaleSourceDomainToDestination)(value, range) : [0, 0]; var commonPadding = "".concat(Number(sliderHandleWidth) / 2, "px"); return /*#__PURE__*/_react["default"].createElement("div", { className: "kg-range-slider", style: { width: '100%', padding: "0 ".concat(commonPadding) }, ref: this.setSliderContainer }, Array.isArray(range) && range.every(Number.isFinite) && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, hasPlot ? /*#__PURE__*/_react["default"].createElement(RangePlot, { bins: bins, lineChart: lineChart, plotType: plotType, invertTrendColor: invertTrendColor, isEnlarged: this.props.isEnlarged, onBrush: function onBrush(val0, val1) { return onChange([val0, val1]); }, marks: this.props.marks, animationWindow: animationWindow, filter: filter, datasets: datasets, range: range, value: value, width: plotWidth, isRanged: isRanged, step: step, timezone: timezone, timeFormat: timeFormat, playbackControlWidth: playbackControlWidth, setFilterPlot: setFilterPlot, style: { paddingLeft: commonPadding } }) : null, subAnimations !== null && subAnimations !== void 0 && subAnimations.length ? /*#__PURE__*/_react["default"].createElement(RangeSliderSubAnimationPanel, { subAnimations: subAnimations, scaledValue: scaledValue, style: RANGE_SLIDER_TIMELINE_PANEL_STYLE }) : null, /*#__PURE__*/_react["default"].createElement(SliderWrapper, { className: "kg-range-slider__slider", isRanged: isRanged, showInput: showInput }, this.props.xAxis ? /*#__PURE__*/_react["default"].createElement("div", { style: { height: '30px' } }, /*#__PURE__*/_react["default"].createElement(this.props.xAxis, { width: plotWidth, timezone: timezone, domain: range, isEnlarged: this.props.isEnlarged })) : null, /*#__PURE__*/_react["default"].createElement(_slider["default"], { marks: this.props.marks, isRanged: isRanged, minValue: range[0], maxValue: range[1], value0: this.props.value0, value1: this.props.value1, step: step, sliderHandleWidth: sliderHandleWidth, onSlider0Change: this._setRangeVal0, onSlider1Change: this._setRangeVal1, onSliderBarChange: function onSliderBarChange(val0, val1) { onChange([val0, val1]); }, enableBarDrag: true }), !isRanged && showInput ? this._renderInput('value1') : null), isRanged && showInput ? /*#__PURE__*/_react["default"].createElement(RangeInputWrapper, { className: "range-slider__input-group" }, this._renderInput('value0'), this._renderInput('value1')) : null)); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(props, state) { var update = null; var value0 = props.value0, value1 = props.value1; if (props.value0 !== state.prevValue0 && !isNaN(value0)) { update = _objectSpread(_objectSpread({}, update || {}), {}, { value0: value0, prevValue0: value0 }); } if (props.value1 !== state.prevValue1 && !isNaN(value1)) { update = _objectSpread(_objectSpread({}, update || {}), {}, { value1: value1, prevValue1: value1 }); } return update; } }]); }(_react.Component); (0, _defineProperty2["default"])(RangeSlider, "defaultProps", { isEnlarged: false, isRanged: true, showInput: true, sliderHandleWidth: 12, inputTheme: '', inputSize: 'small', onChange: noop }); (0, _reactLifecyclesCompat.polyfill)(RangeSlider); return RangeSlider; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RMaWZlY3ljbGVzQ29tcGF0IiwiX3Jlc2VsZWN0IiwiX3N0eWxlZENvbXBvbmVudHMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX3JhbmdlUGxvdCIsIl9zbGlkZXIiLCJfc3R5bGVkQ29tcG9uZW50czIiLCJfcmFuZ2VTbGlkZXJUaW1lbGluZVBhbmVsIiwiX3V0aWxzIiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl90ZW1wbGF0ZU9iamVjdDMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfY2FsbFN1cGVyIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsIm5vb3AiLCJTbGlkZXJJbnB1dCIsInN0eWxlZCIsIklucHV0IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJwcm9wcyIsInRoZW1lIiwic2xpZGVySW5wdXRXaWR0aCIsImZsdXNoIiwiaW5wdXRTaXplIiwic2xpZGVySW5wdXRGb250U2l6ZSIsInNsaWRlcklucHV0UGFkZGluZyIsIlNsaWRlcldyYXBwZXIiLCJkaXYiLCJpc1JhbmdlZCIsInNob3dJbnB1dCIsIlJhbmdlSW5wdXRXcmFwcGVyIiwiUkFOR0VfU0xJREVSX1RJTUVMSU5FX1BBTkVMX1NUWUxFIiwibWFyZ2luTGVmdCIsIlJhbmdlU2xpZGVyRmFjdG9yeSIsImRlcHMiLCJSYW5nZVBsb3RGYWN0b3J5IiwiUmFuZ2VTbGlkZXJTdWJBbmltYXRpb25QYW5lbEZhY3RvcnkiLCJSYW5nZVBsb3QiLCJSYW5nZVNsaWRlclN1YkFuaW1hdGlvblBhbmVsIiwiUmFuZ2VTbGlkZXIiLCJfQ29tcG9uZW50IiwiX3RoaXMiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJjb25jYXQiLCJ2YWx1ZTAiLCJ2YWx1ZTEiLCJwcmV2VmFsdWUwIiwicHJldlZhbHVlMSIsIndpZHRoIiwiZWxlbWVudCIsInNsaWRlckNvbnRhaW5lciIsIl9yZXNpemUiLCJjcmVhdGVSZWYiLCJjcmVhdGVTZWxlY3RvciIsInZhbHVlMFNlbGVjdG9yIiwidmFsdWUxU2VsZWN0b3IiLCJ2YWwiLCJfdGhpcyRwcm9wcyIsInJhbmdlIiwic3RlcCIsInJvdW5kVmFsVG9TdGVwIiwiX3RoaXMkcHJvcHMyIiwiX3RoaXMkcHJvcHMyJG9uQ2hhbmdlIiwib25DaGFuZ2UiLCJ2YWwxIiwiTnVtYmVyIiwiY2xhbXAiLCJfcm91bmRWYWxUb1N0ZXAiLCJfdGhpcyRwcm9wczMiLCJfdGhpcyRwcm9wczMkb25DaGFuZ2UiLCJ2YWwwIiwib2Zmc2V0V2lkdGgiLCJzdGF0ZSIsInNldFN0YXRlIiwia2V5IiwidGFyZ2V0IiwidmFsdWUiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsImNvbXBvbmVudERpZE1vdW50IiwiRWxlbWVudCIsIm9ic2VydmVEaW1lbnNpb25zIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJ1bm9ic2VydmVEaW1lbnNpb25zIiwiX3JlbmRlcklucHV0IiwiX3RoaXMyIiwic2V0UmFuZ2UiLCJfc2V0UmFuZ2VWYWwwIiwiX3NldFJhbmdlVmFsMSIsInJlZiIsImlucHV0VmFsdWUwIiwiaW5wdXRWYWx1ZTEiLCJ1cGRhdGUiLCJfb25DaGFuZ2VJbnB1dCIsImJpbmQiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwidHlwZSIsImlkIiwib25LZXlQcmVzcyIsImN1cnJlbnQiLCJibHVyIiwib25CbHVyIiwic2Vjb25kYXJ5IiwiaW5wdXRUaGVtZSIsInJlbmRlciIsIl90aGlzJHByb3BzNCIsImJpbnMiLCJsaW5lQ2hhcnQiLCJwbG90VHlwZSIsImludmVydFRyZW5kQ29sb3IiLCJfdGhpcyRwcm9wczQkb25DaGFuZ2UiLCJzbGlkZXJIYW5kbGVXaWR0aCIsInRpbWV6b25lIiwidGltZUZvcm1hdCIsInBsYXliYWNrQ29udHJvbFdpZHRoIiwic2V0RmlsdGVyUGxvdCIsImFuaW1hdGlvbldpbmRvdyIsInN1YkFuaW1hdGlvbnMiLCJkYXRhc2V0cyIsInBsb3RXaWR0aCIsIk1hdGgiLCJtYXgiLCJoYXNQbG90IiwicGxvdFZhbHVlIiwiZmlsdGVyVmFsdWVTZWxlY3RvciIsInNjYWxlZFZhbHVlIiwic2NhbGVTb3VyY2VEb21haW5Ub0Rlc3RpbmF0aW9uIiwiY29tbW9uUGFkZGluZyIsInN0eWxlIiwicGFkZGluZyIsInNldFNsaWRlckNvbnRhaW5lciIsImlzQXJyYXkiLCJldmVyeSIsImlzRmluaXRlIiwiRnJhZ21lbnQiLCJpc0VubGFyZ2VkIiwib25CcnVzaCIsIm1hcmtzIiwicGFkZGluZ0xlZnQiLCJ4QXhpcyIsImhlaWdodCIsImRvbWFpbiIsIm1pblZhbHVlIiwibWF4VmFsdWUiLCJvblNsaWRlcjBDaGFuZ2UiLCJvblNsaWRlcjFDaGFuZ2UiLCJvblNsaWRlckJhckNoYW5nZSIsImVuYWJsZUJhckRyYWciLCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMiLCJpc05hTiIsIkNvbXBvbmVudCIsInBvbHlmaWxsIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1vbi9yYW5nZS1zbGlkZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudCwgQ29tcG9uZW50VHlwZSwgY3JlYXRlUmVmLCBFbGVtZW50VHlwZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtwb2x5ZmlsbH0gZnJvbSAncmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQnO1xuaW1wb3J0IHtjcmVhdGVTZWxlY3Rvcn0gZnJvbSAncmVzZWxlY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgUmFuZ2VQbG90RmFjdG9yeSBmcm9tICcuL3JhbmdlLXBsb3QnO1xuaW1wb3J0IFNsaWRlciBmcm9tICcuL3NsaWRlci9zbGlkZXInO1xuaW1wb3J0IHtJbnB1dH0gZnJvbSAnLi9zdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgUmFuZ2VTbGlkZXJTdWJBbmltYXRpb25QYW5lbEZhY3RvcnkgZnJvbSAnLi4vY29tbW9uL3JhbmdlLXNsaWRlci10aW1lbGluZS1wYW5lbCc7XG5pbXBvcnQge1xuICBvYnNlcnZlRGltZW5zaW9ucyxcbiAgdW5vYnNlcnZlRGltZW5zaW9ucyxcbiAgcm91bmRWYWxUb1N0ZXAsXG4gIGNsYW1wLFxuICBzY2FsZVNvdXJjZURvbWFpblRvRGVzdGluYXRpb25cbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge0xpbmVDaGFydCwgRmlsdGVyLCBCaW5zfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7RGF0YXNldHN9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuaW1wb3J0IHtBY3Rpb25IYW5kbGVyLCBzZXRGaWx0ZXJQbG90fSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuXG5pbnRlcmZhY2UgU2xpZGVySW5wdXRQcm9wcyB7XG4gIGZsdXNoPzogYm9vbGVhbjtcbiAgaW5wdXRTaXplPzogc3RyaW5nO1xufVxuY29uc3Qgbm9vcCA9ICgpID0+IHtcbiAgcmV0dXJuO1xufTtcbmNvbnN0IFNsaWRlcklucHV0ID0gc3R5bGVkKElucHV0KTxTbGlkZXJJbnB1dFByb3BzPmBcbiAgd2lkdGg6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2xpZGVySW5wdXRXaWR0aH1weDtcbiAgbWFyZ2luLWxlZnQ6ICR7cHJvcHMgPT4gKHByb3BzLmZsdXNoID8gMCA6IHByb3BzLmlucHV0U2l6ZSA9PT0gJ3RpbnknID8gMTIgOiAxOCl9cHg7XG4gIGZvbnQtc2l6ZTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zbGlkZXJJbnB1dEZvbnRTaXplfTsgLy8gMTBweCAvLyAxMnB4O1xuICBwYWRkaW5nOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnNsaWRlcklucHV0UGFkZGluZ307IC8vIDRweCA2cHg7IC8vIDZweCAxMnB4O1xuYDtcblxuaW50ZXJmYWNlIFNsaWRlcldyYXBwZXJQcm9wcyB7XG4gIGlzUmFuZ2VkPzogYm9vbGVhbjtcbiAgc2hvd0lucHV0PzogYm9vbGVhbjtcbn1cblxuY29uc3QgU2xpZGVyV3JhcHBlciA9IHN0eWxlZC5kaXY8U2xpZGVyV3JhcHBlclByb3BzPmBcbiAgZGlzcGxheTogZmxleDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBhbGlnbi1pdGVtczogJHtwcm9wcyA9PiAoIXByb3BzLmlzUmFuZ2VkICYmIHByb3BzLnNob3dJbnB1dCA/ICdjZW50ZXInIDogJ2ZsZXgtc3RhcnQnKX07XG5gO1xuXG5jb25zdCBSYW5nZUlucHV0V3JhcHBlciA9IHN0eWxlZC5kaXZgXG4gIG1hcmdpbi10b3A6IDEycHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbmA7XG5cbmludGVyZmFjZSBSYW5nZVNsaWRlclByb3BzIHtcbiAgcmFuZ2U/OiBudW1iZXJbXTtcbiAgdmFsdWUwOiBudW1iZXI7XG4gIHZhbHVlMTogbnVtYmVyO1xuICBvbkNoYW5nZT86ICh2YWw6IG51bWJlcltdLCBlPzogRXZlbnQgfCBudWxsKSA9PiB2b2lkOyAvLyBUT0RPXG4gIHNldEZpbHRlclBsb3Q/OiBBY3Rpb25IYW5kbGVyPHR5cGVvZiBzZXRGaWx0ZXJQbG90PjtcbiAgYmlucz86IEJpbnM7XG4gIGlzUmFuZ2VkPzogYm9vbGVhbjtcbiAgaXNFbmxhcmdlZD86IGJvb2xlYW47XG4gIHNob3dJbnB1dD86IGJvb2xlYW47XG4gIGlucHV0VGhlbWU/OiBzdHJpbmc7XG4gIGlucHV0U2l6ZT86IHN0cmluZztcbiAgc3RlcD86IG51bWJlcjtcbiAgc2xpZGVySGFuZGxlV2lkdGg/OiBudW1iZXI7XG4gIHhBeGlzPzogRWxlbWVudFR5cGU7XG4gIHN1YkFuaW1hdGlvbnM/OiBhbnlbXTtcbiAgdGltZWxpbmVMYWJlbD86IHN0cmluZztcblxuICB0aW1lem9uZT86IHN0cmluZyB8IG51bGw7XG4gIHRpbWVGb3JtYXQ/OiBzdHJpbmc7XG4gIHBsYXliYWNrQ29udHJvbFdpZHRoPzogbnVtYmVyO1xuICBsaW5lQ2hhcnQ/OiBMaW5lQ2hhcnQ7XG4gIG1hcmtzPzogbnVtYmVyW107XG4gIHBsb3RUeXBlPzoge1xuICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgfTtcbiAgcGxvdFZhbHVlPzogbnVtYmVyW107XG5cbiAgYW5pbWF0aW9uV2luZG93Pzogc3RyaW5nO1xuICBmaWx0ZXI/OiBGaWx0ZXI7XG4gIGRhdGFzZXRzPzogRGF0YXNldHM7XG5cbiAgaW52ZXJ0VHJlbmRDb2xvcj86IGJvb2xlYW47XG59XG5cbmNvbnN0IFJBTkdFX1NMSURFUl9USU1FTElORV9QQU5FTF9TVFlMRSA9IHttYXJnaW5MZWZ0OiAnLTMycHgnfTtcblxuUmFuZ2VTbGlkZXJGYWN0b3J5LmRlcHMgPSBbUmFuZ2VQbG90RmFjdG9yeSwgUmFuZ2VTbGlkZXJTdWJBbmltYXRpb25QYW5lbEZhY3RvcnldO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBSYW5nZVNsaWRlckZhY3RvcnkoXG4gIFJhbmdlUGxvdDogUmV0dXJuVHlwZTx0eXBlb2YgUmFuZ2VQbG90RmFjdG9yeT4sXG4gIFJhbmdlU2xpZGVyU3ViQW5pbWF0aW9uUGFuZWw6IFJldHVyblR5cGU8dHlwZW9mIFJhbmdlU2xpZGVyU3ViQW5pbWF0aW9uUGFuZWxGYWN0b3J5PlxuKTogQ29tcG9uZW50VHlwZTxSYW5nZVNsaWRlclByb3BzPiB7XG4gIGNsYXNzIFJhbmdlU2xpZGVyIGV4dGVuZHMgQ29tcG9uZW50PFJhbmdlU2xpZGVyUHJvcHM+IHtcbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgaXNFbmxhcmdlZDogZmFsc2UsXG4gICAgICBpc1JhbmdlZDogdHJ1ZSxcbiAgICAgIHNob3dJbnB1dDogdHJ1ZSxcbiAgICAgIHNsaWRlckhhbmRsZVdpZHRoOiAxMixcbiAgICAgIGlucHV0VGhlbWU6ICcnLFxuICAgICAgaW5wdXRTaXplOiAnc21hbGwnLFxuICAgICAgb25DaGFuZ2U6IG5vb3BcbiAgICB9O1xuXG4gICAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgc3RhdGUpIHtcbiAgICAgIGxldCB1cGRhdGU6IHt2YWx1ZTE/OiBhbnk7IHByZXZWYWx1ZTE/OiBhbnk7IHZhbHVlMD86IGFueTsgcHJldlZhbHVlMD86IGFueX0gfCBudWxsID0gbnVsbDtcbiAgICAgIGNvbnN0IHt2YWx1ZTAsIHZhbHVlMX0gPSBwcm9wcztcbiAgICAgIGlmIChwcm9wcy52YWx1ZTAgIT09IHN0YXRlLnByZXZWYWx1ZTAgJiYgIWlzTmFOKHZhbHVlMCkpIHtcbiAgICAgICAgdXBkYXRlID0gey4uLih1cGRhdGUgfHwge30pLCB2YWx1ZTAsIHByZXZWYWx1ZTA6IHZhbHVlMH07XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMudmFsdWUxICE9PSBzdGF0ZS5wcmV2VmFsdWUxICYmICFpc05hTih2YWx1ZTEpKSB7XG4gICAgICAgIHVwZGF0ZSA9IHsuLi4odXBkYXRlIHx8IHt9KSwgdmFsdWUxLCBwcmV2VmFsdWUxOiB2YWx1ZTF9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVwZGF0ZTtcbiAgICB9XG5cbiAgICBzdGF0ZSA9IHtcbiAgICAgIHZhbHVlMDogMCxcbiAgICAgIHZhbHVlMTogMSxcbiAgICAgIHByZXZWYWx1ZTA6IDAsXG4gICAgICBwcmV2VmFsdWUxOiAxLFxuICAgICAgd2lkdGg6IDI4OFxuICAgIH07XG5cbiAgICBzbGlkZXJDb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIGlmICh0aGlzLnNsaWRlckNvbnRhaW5lciBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgb2JzZXJ2ZURpbWVuc2lvbnModGhpcy5zbGlkZXJDb250YWluZXIsIHRoaXMuX3Jlc2l6ZSwgMTAwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIGlmICh0aGlzLnNsaWRlckNvbnRhaW5lciBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgdW5vYnNlcnZlRGltZW5zaW9ucyh0aGlzLnNsaWRlckNvbnRhaW5lcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0U2xpZGVyQ29udGFpbmVyOiBSZWFjdC5MZWdhY3lSZWY8SFRNTERpdkVsZW1lbnQ+ID0gZWxlbWVudCA9PiB7XG4gICAgICB0aGlzLnNsaWRlckNvbnRhaW5lciA9IGVsZW1lbnQ7XG4gICAgICB0aGlzLl9yZXNpemUoKTtcbiAgICB9O1xuICAgIGlucHV0VmFsdWUwID0gY3JlYXRlUmVmPEhUTUxJbnB1dEVsZW1lbnQ+KCk7XG4gICAgaW5wdXRWYWx1ZTEgPSBjcmVhdGVSZWY8SFRNTElucHV0RWxlbWVudD4oKTtcbiAgICB2YWx1ZTBTZWxlY3RvciA9IHByb3BzID0+IHByb3BzLnZhbHVlMDtcbiAgICB2YWx1ZTFTZWxlY3RvciA9IHByb3BzID0+IHByb3BzLnZhbHVlMTtcbiAgICBmaWx0ZXJWYWx1ZVNlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgICB0aGlzLnZhbHVlMFNlbGVjdG9yLFxuICAgICAgdGhpcy52YWx1ZTFTZWxlY3RvcixcbiAgICAgICh2YWx1ZTAsIHZhbHVlMSkgPT4gW3ZhbHVlMCwgdmFsdWUxXVxuICAgICk7XG5cbiAgICBfcm91bmRWYWxUb1N0ZXAgPSB2YWwgPT4ge1xuICAgICAgY29uc3Qge3JhbmdlLCBzdGVwfSA9IHRoaXMucHJvcHM7XG4gICAgICBpZiAoIXJhbmdlIHx8ICFzdGVwKSByZXR1cm47XG4gICAgICByZXR1cm4gcm91bmRWYWxUb1N0ZXAocmFuZ2VbMF0sIHN0ZXAsIHZhbCk7XG4gICAgfTtcblxuICAgIF9zZXRSYW5nZVZhbDEgPSB2YWwgPT4ge1xuICAgICAgY29uc3Qge3ZhbHVlMCwgcmFuZ2UsIG9uQ2hhbmdlID0gbm9vcH0gPSB0aGlzLnByb3BzO1xuICAgICAgaWYgKCFyYW5nZSkgcmV0dXJuO1xuICAgICAgY29uc3QgdmFsMSA9IE51bWJlcih2YWwpO1xuICAgICAgb25DaGFuZ2UoW3ZhbHVlMCwgY2xhbXAoW3ZhbHVlMCwgcmFuZ2VbMV1dLCB0aGlzLl9yb3VuZFZhbFRvU3RlcCh2YWwxKSldKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBfc2V0UmFuZ2VWYWwwID0gdmFsID0+IHtcbiAgICAgIGNvbnN0IHt2YWx1ZTEsIHJhbmdlLCBvbkNoYW5nZSA9IG5vb3B9ID0gdGhpcy5wcm9wcztcbiAgICAgIGlmICghcmFuZ2UpIHJldHVybjtcbiAgICAgIGNvbnN0IHZhbDAgPSBOdW1iZXIodmFsKTtcbiAgICAgIG9uQ2hhbmdlKFtjbGFtcChbcmFuZ2VbMF0sIHZhbHVlMV0sIHRoaXMuX3JvdW5kVmFsVG9TdGVwKHZhbDApKSwgdmFsdWUxXSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgX3Jlc2l6ZSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNsaWRlckNvbnRhaW5lcikge1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuc2xpZGVyQ29udGFpbmVyLm9mZnNldFdpZHRoO1xuICAgICAgICBpZiAod2lkdGggIT09IHRoaXMuc3RhdGUud2lkdGgpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHt3aWR0aH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9vbkNoYW5nZUlucHV0ID0gKGtleSwgZSkgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7W2tleV06IGUudGFyZ2V0LnZhbHVlfSk7XG4gICAgfTtcblxuICAgIF9yZW5kZXJJbnB1dChrZXkpIHtcbiAgICAgIGNvbnN0IHNldFJhbmdlID0ga2V5ID09PSAndmFsdWUwJyA/IHRoaXMuX3NldFJhbmdlVmFsMCA6IHRoaXMuX3NldFJhbmdlVmFsMTtcbiAgICAgIGNvbnN0IHJlZiA9IGtleSA9PT0gJ3ZhbHVlMCcgPyB0aGlzLmlucHV0VmFsdWUwIDogdGhpcy5pbnB1dFZhbHVlMTtcbiAgICAgIGNvbnN0IHVwZGF0ZSA9IGUgPT4ge1xuICAgICAgICBpZiAoIXNldFJhbmdlKGUudGFyZ2V0LnZhbHVlKSkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1trZXldOiB0aGlzLnN0YXRlW2tleV19KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25DaGFuZ2UgPSB0aGlzLl9vbkNoYW5nZUlucHV0LmJpbmQodGhpcywga2V5KTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFNsaWRlcklucHV0XG4gICAgICAgICAgY2xhc3NOYW1lPVwia2ctcmFuZ2Utc2xpZGVyX19pbnB1dFwiXG4gICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgcmVmPXtyZWZ9XG4gICAgICAgICAgaWQ9e2BzbGlkZXItaW5wdXQtJHtrZXl9YH1cbiAgICAgICAgICBrZXk9e2tleX1cbiAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZVtrZXldfVxuICAgICAgICAgIG9uQ2hhbmdlPXtvbkNoYW5nZX1cbiAgICAgICAgICBvbktleVByZXNzPXtlID0+IHtcbiAgICAgICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICAgICAgICB1cGRhdGUoZSk7XG4gICAgICAgICAgICAgIChyZWYuY3VycmVudCBhcyBhbnkpLmJsdXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uQmx1cj17dXBkYXRlfVxuICAgICAgICAgIGZsdXNoPXtrZXkgPT09ICd2YWx1ZTAnfVxuICAgICAgICAgIGlucHV0U2l6ZT17dGhpcy5wcm9wcy5pbnB1dFNpemV9XG4gICAgICAgICAgc2Vjb25kYXJ5PXt0aGlzLnByb3BzLmlucHV0VGhlbWUgPT09ICdzZWNvbmRhcnknfVxuICAgICAgICAvPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgaXNSYW5nZWQsXG4gICAgICAgIHNob3dJbnB1dCxcbiAgICAgICAgYmlucyxcbiAgICAgICAgbGluZUNoYXJ0LFxuICAgICAgICBwbG90VHlwZSxcbiAgICAgICAgaW52ZXJ0VHJlbmRDb2xvcixcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIG9uQ2hhbmdlID0gbm9vcCxcbiAgICAgICAgc2xpZGVySGFuZGxlV2lkdGgsXG4gICAgICAgIHN0ZXAsXG4gICAgICAgIHRpbWV6b25lLFxuICAgICAgICB0aW1lRm9ybWF0LFxuICAgICAgICBwbGF5YmFja0NvbnRyb2xXaWR0aCxcbiAgICAgICAgc2V0RmlsdGVyUGxvdCxcbiAgICAgICAgYW5pbWF0aW9uV2luZG93LFxuICAgICAgICBzdWJBbmltYXRpb25zOiBzdWJBbmltYXRpb25zLFxuICAgICAgICBmaWx0ZXIsXG4gICAgICAgIGRhdGFzZXRzXG4gICAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgICAgY29uc3Qge3dpZHRofSA9IHRoaXMuc3RhdGU7XG4gICAgICBjb25zdCBwbG90V2lkdGggPSBNYXRoLm1heCh3aWR0aCAtIE51bWJlcihzbGlkZXJIYW5kbGVXaWR0aCksIDApO1xuICAgICAgY29uc3QgaGFzUGxvdCA9IHBsb3RUeXBlPy50eXBlO1xuXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucHJvcHMucGxvdFZhbHVlIHx8IHRoaXMuZmlsdGVyVmFsdWVTZWxlY3Rvcih0aGlzLnByb3BzKTtcbiAgICAgIGNvbnN0IHNjYWxlZFZhbHVlID1cbiAgICAgICAgc3ViQW5pbWF0aW9ucz8ubGVuZ3RoICYmIHJhbmdlXG4gICAgICAgICAgPyBzY2FsZVNvdXJjZURvbWFpblRvRGVzdGluYXRpb24odmFsdWUgYXMgW251bWJlciwgbnVtYmVyXSwgcmFuZ2UgYXMgW251bWJlciwgbnVtYmVyXSlcbiAgICAgICAgICA6IFswLCAwXTtcbiAgICAgIGNvbnN0IGNvbW1vblBhZGRpbmcgPSBgJHtOdW1iZXIoc2xpZGVySGFuZGxlV2lkdGgpIC8gMn1weGA7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPVwia2ctcmFuZ2Utc2xpZGVyXCJcbiAgICAgICAgICBzdHlsZT17e3dpZHRoOiAnMTAwJScsIHBhZGRpbmc6IGAwICR7Y29tbW9uUGFkZGluZ31gfX1cbiAgICAgICAgICByZWY9e3RoaXMuc2V0U2xpZGVyQ29udGFpbmVyfVxuICAgICAgICA+XG4gICAgICAgICAge0FycmF5LmlzQXJyYXkocmFuZ2UpICYmIHJhbmdlLmV2ZXJ5KE51bWJlci5pc0Zpbml0ZSkgJiYgKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAge2hhc1Bsb3QgPyAoXG4gICAgICAgICAgICAgICAgPFJhbmdlUGxvdFxuICAgICAgICAgICAgICAgICAgYmlucz17Ymluc31cbiAgICAgICAgICAgICAgICAgIGxpbmVDaGFydD17bGluZUNoYXJ0fVxuICAgICAgICAgICAgICAgICAgcGxvdFR5cGU9e3Bsb3RUeXBlfVxuICAgICAgICAgICAgICAgICAgaW52ZXJ0VHJlbmRDb2xvcj17aW52ZXJ0VHJlbmRDb2xvcn1cbiAgICAgICAgICAgICAgICAgIGlzRW5sYXJnZWQ9e3RoaXMucHJvcHMuaXNFbmxhcmdlZH1cbiAgICAgICAgICAgICAgICAgIG9uQnJ1c2g9eyh2YWwwLCB2YWwxKSA9PiBvbkNoYW5nZShbdmFsMCwgdmFsMV0pfVxuICAgICAgICAgICAgICAgICAgbWFya3M9e3RoaXMucHJvcHMubWFya3N9XG4gICAgICAgICAgICAgICAgICBhbmltYXRpb25XaW5kb3c9e2FuaW1hdGlvbldpbmRvd31cbiAgICAgICAgICAgICAgICAgIGZpbHRlcj17ZmlsdGVyfVxuICAgICAgICAgICAgICAgICAgZGF0YXNldHM9e2RhdGFzZXRzfVxuICAgICAgICAgICAgICAgICAgcmFuZ2U9e3JhbmdlfVxuICAgICAgICAgICAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICAgICAgICAgICAgd2lkdGg9e3Bsb3RXaWR0aH1cbiAgICAgICAgICAgICAgICAgIGlzUmFuZ2VkPXtpc1JhbmdlZH1cbiAgICAgICAgICAgICAgICAgIHN0ZXA9e3N0ZXB9XG4gICAgICAgICAgICAgICAgICB0aW1lem9uZT17dGltZXpvbmV9XG4gICAgICAgICAgICAgICAgICB0aW1lRm9ybWF0PXt0aW1lRm9ybWF0fVxuICAgICAgICAgICAgICAgICAgcGxheWJhY2tDb250cm9sV2lkdGg9e3BsYXliYWNrQ29udHJvbFdpZHRofVxuICAgICAgICAgICAgICAgICAgc2V0RmlsdGVyUGxvdD17c2V0RmlsdGVyUGxvdH1cbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7cGFkZGluZ0xlZnQ6IGNvbW1vblBhZGRpbmd9fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICB7c3ViQW5pbWF0aW9ucz8ubGVuZ3RoID8gKFxuICAgICAgICAgICAgICAgIDxSYW5nZVNsaWRlclN1YkFuaW1hdGlvblBhbmVsXG4gICAgICAgICAgICAgICAgICBzdWJBbmltYXRpb25zPXtzdWJBbmltYXRpb25zfVxuICAgICAgICAgICAgICAgICAgc2NhbGVkVmFsdWU9e3NjYWxlZFZhbHVlfVxuICAgICAgICAgICAgICAgICAgc3R5bGU9e1JBTkdFX1NMSURFUl9USU1FTElORV9QQU5FTF9TVFlMRX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgPFNsaWRlcldyYXBwZXJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJrZy1yYW5nZS1zbGlkZXJfX3NsaWRlclwiXG4gICAgICAgICAgICAgICAgaXNSYW5nZWQ9e2lzUmFuZ2VkfVxuICAgICAgICAgICAgICAgIHNob3dJbnB1dD17c2hvd0lucHV0fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3RoaXMucHJvcHMueEF4aXMgPyAoXG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7aGVpZ2h0OiAnMzBweCd9fT5cbiAgICAgICAgICAgICAgICAgICAgPHRoaXMucHJvcHMueEF4aXNcbiAgICAgICAgICAgICAgICAgICAgICB3aWR0aD17cGxvdFdpZHRofVxuICAgICAgICAgICAgICAgICAgICAgIHRpbWV6b25lPXt0aW1lem9uZX1cbiAgICAgICAgICAgICAgICAgICAgICBkb21haW49e3JhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgIGlzRW5sYXJnZWQ9e3RoaXMucHJvcHMuaXNFbmxhcmdlZH1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgIDxTbGlkZXJcbiAgICAgICAgICAgICAgICAgIG1hcmtzPXt0aGlzLnByb3BzLm1hcmtzfVxuICAgICAgICAgICAgICAgICAgaXNSYW5nZWQ9e2lzUmFuZ2VkfVxuICAgICAgICAgICAgICAgICAgbWluVmFsdWU9e3JhbmdlWzBdfVxuICAgICAgICAgICAgICAgICAgbWF4VmFsdWU9e3JhbmdlWzFdfVxuICAgICAgICAgICAgICAgICAgdmFsdWUwPXt0aGlzLnByb3BzLnZhbHVlMH1cbiAgICAgICAgICAgICAgICAgIHZhbHVlMT17dGhpcy5wcm9wcy52YWx1ZTF9XG4gICAgICAgICAgICAgICAgICBzdGVwPXtzdGVwfVxuICAgICAgICAgICAgICAgICAgc2xpZGVySGFuZGxlV2lkdGg9e3NsaWRlckhhbmRsZVdpZHRofVxuICAgICAgICAgICAgICAgICAgb25TbGlkZXIwQ2hhbmdlPXt0aGlzLl9zZXRSYW5nZVZhbDB9XG4gICAgICAgICAgICAgICAgICBvblNsaWRlcjFDaGFuZ2U9e3RoaXMuX3NldFJhbmdlVmFsMX1cbiAgICAgICAgICAgICAgICAgIG9uU2xpZGVyQmFyQ2hhbmdlPXsodmFsMCwgdmFsMSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZShbdmFsMCwgdmFsMV0pO1xuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIGVuYWJsZUJhckRyYWdcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIHshaXNSYW5nZWQgJiYgc2hvd0lucHV0ID8gdGhpcy5fcmVuZGVySW5wdXQoJ3ZhbHVlMScpIDogbnVsbH1cbiAgICAgICAgICAgICAgPC9TbGlkZXJXcmFwcGVyPlxuICAgICAgICAgICAgICB7aXNSYW5nZWQgJiYgc2hvd0lucHV0ID8gKFxuICAgICAgICAgICAgICAgIDxSYW5nZUlucHV0V3JhcHBlciBjbGFzc05hbWU9XCJyYW5nZS1zbGlkZXJfX2lucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICB7dGhpcy5fcmVuZGVySW5wdXQoJ3ZhbHVlMCcpfVxuICAgICAgICAgICAgICAgICAge3RoaXMuX3JlbmRlcklucHV0KCd2YWx1ZTEnKX1cbiAgICAgICAgICAgICAgICA8L1JhbmdlSW5wdXRXcmFwcGVyPlxuICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIDwvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwb2x5ZmlsbChSYW5nZVNsaWRlcik7XG5cbiAgcmV0dXJuIFJhbmdlU2xpZGVyO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxzQkFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsU0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFLLFVBQUEsR0FBQUQsc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFNLE9BQUEsR0FBQUYsc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFPLGtCQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSx5QkFBQSxHQUFBSixzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQVMsTUFBQSxHQUFBVCxPQUFBO0FBTTBCLElBQUFVLGVBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFqQjFCO0FBQ0E7QUFBQSxTQUFBQyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQWYsd0JBQUFlLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSxnQkFBQUss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