kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
319 lines (259 loc) • 37.8 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _classnames = _interopRequireDefault(require("classnames"));
var _lodash = _interopRequireDefault(require("lodash.uniq"));
var _reactOnclickoutside = _interopRequireDefault(require("react-onclickoutside"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _accessor = _interopRequireDefault(require("./accessor"));
var _chickletedInput = _interopRequireDefault(require("./chickleted-input"));
var _typeahead = _interopRequireDefault(require("./typeahead"));
var _icons = require("../icons");
var _dropdownList = _interopRequireWildcard(require("./dropdown-list"));
var _templateObject, _templateObject2, _templateObject3, _templateObject4;
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
/**
* Converts non-arrays to arrays. Leaves arrays alone. Converts
* undefined values to empty arrays ([] instead of [undefined]).
* Otherwise, just returns [item] for non-array items.
*
* @param {*} item
* @returns {array} boom! much array. very indexed. so useful.
*/
function _toArray(item) {
if (Array.isArray(item)) {
return item;
}
if (typeof item === 'undefined' || item === null) {
return [];
}
return [item];
}
var StyledDropdownSelect = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n ", ";\n\n .list__item__anchor {\n ", ";\n }\n"])), function (props) {
return props.inputTheme === 'secondary' ? props.theme.secondaryInput : props.theme.input;
}, function (props) {
return props.theme.dropdownListAnchor;
});
var DropdownSelectValue = _styledComponents["default"].span(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n overflow: hidden;\n"])), function (props) {
return props.placeholder ? props.theme.selectColorPlaceHolder : props.theme.selectColor;
});
var DropdownSelectErase = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n margin-left: 6px;\n display: flex;\n"])));
var DropdownWrapper = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n background: ", ";\n border: 0;\n width: 100%;\n left: 0;\n z-index: 100;\n position: absolute;\n bottom: ", ";\n margin-top: ", ";\n margin-bottom: ", ";\n"])), function (props) {
return props.theme.dropdownBgd;
}, function (props) {
return props.placement === 'top' ? props.theme.inputBoxHeight : 'auto';
}, function (props) {
return props.placement === 'bottom' ? '4px' : 'auto';
}, function (props) {
return props.placement === 'top' ? '4px' : 'auto';
});
var ItemSelector = /*#__PURE__*/function (_Component) {
(0, _inherits2["default"])(ItemSelector, _Component);
var _super = _createSuper(ItemSelector);
function ItemSelector() {
var _this;
(0, _classCallCheck2["default"])(this, ItemSelector);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _super.call.apply(_super, [this].concat(args));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", {
showTypeahead: false
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleClickOutside", function () {
_this._hideTypeahead();
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onBlur", function () {
// note: chickleted input is not a real form element so we call onBlur()
// when we feel the events are appropriate
if (_this.props.onBlur) {
_this.props.onBlur();
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_removeItem", function (item, e) {
// only used when multiSelect = true
e.preventDefault();
e.stopPropagation();
var selectedItems = _this.props.selectedItems;
var index = selectedItems.findIndex(function (t) {
return t === item;
});
if (index < 0) {
return;
}
var items = [].concat((0, _toConsumableArray2["default"])(selectedItems.slice(0, index)), (0, _toConsumableArray2["default"])(selectedItems.slice(index + 1, selectedItems.length)));
_this.props.onChange(items);
if (_this.props.closeOnSelect) {
_this.setState({
showTypeahead: false
});
_this._onBlur();
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_selectItem", function (item) {
var getValue = _accessor["default"].generateOptionToStringFor(_this.props.getOptionValue || _this.props.displayOption);
var previousSelected = _toArray(_this.props.selectedItems);
if (_this.props.multiSelect) {
var items = (0, _lodash["default"])(previousSelected.concat(_toArray(item).map(getValue)));
_this.props.onChange(items);
} else {
_this.props.onChange(getValue(item));
}
if (_this.props.closeOnSelect) {
_this.setState({
showTypeahead: false
});
_this._onBlur();
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onErase", function (e) {
e.stopPropagation();
_this.props.onChange(null);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_showTypeahead", function () {
if (!_this.props.disabled) {
_this.setState({
showTypeahead: true
});
}
});
return _this;
}
(0, _createClass2["default"])(ItemSelector, [{
key: "_hideTypeahead",
value: function _hideTypeahead() {
this.setState({
showTypeahead: false
});
this._onBlur();
}
}, {
key: "_renderDropdown",
value: function _renderDropdown() {
return (/*#__PURE__*/_react["default"].createElement(DropdownWrapper, {
placement: this.props.placement
}, /*#__PURE__*/_react["default"].createElement(_typeahead["default"], {
customClasses: {
results: 'list-selector',
input: 'typeahead__input',
listItem: 'list__item',
listAnchor: 'list__item__anchor'
},
options: this.props.options,
filterOption: this.props.filterOption,
fixedOptions: this.props.fixedOptions,
placeholder: "Search",
onOptionSelected: this._selectItem,
customListComponent: this.props.DropDownRenderComponent,
customListHeaderComponent: this.props.DropdownHeaderComponent,
customListItemComponent: this.props.DropDownLineItemRenderComponent,
displayOption: _accessor["default"].generateOptionToStringFor(this.props.displayOption),
searchable: this.props.searchable,
showOptionsWhenEmpty: true,
selectedItems: _toArray(this.props.selectedItems)
}))
);
}
}, {
key: "render",
value: function render() {
var selected = _toArray(this.props.selectedItems);
var hasValue = selected.length;
var displayOption = _accessor["default"].generateOptionToStringFor(this.props.displayOption);
var dropdownSelectProps = {
className: (0, _classnames["default"])("item-selector__dropdown", {
active: this.state.showTypeahead
}),
disabled: this.props.disabled,
onClick: this._showTypeahead,
onFocus: this._showPopover,
error: this.props.isError,
inputTheme: this.props.inputTheme
};
return (/*#__PURE__*/_react["default"].createElement("div", {
className: "item-selector"
}, /*#__PURE__*/_react["default"].createElement("div", {
style: {
position: 'relative'
}
}, this.props.multiSelect ? /*#__PURE__*/_react["default"].createElement(_chickletedInput["default"], (0, _extends2["default"])({}, dropdownSelectProps, {
selectedItems: _toArray(this.props.selectedItems),
placeholder: this.props.placeholder,
displayOption: displayOption,
removeItem: this._removeItem
})) : /*#__PURE__*/_react["default"].createElement(StyledDropdownSelect, dropdownSelectProps, /*#__PURE__*/_react["default"].createElement(DropdownSelectValue, {
placeholder: !hasValue
}, hasValue ? /*#__PURE__*/_react["default"].createElement(this.props.DropDownLineItemRenderComponent, {
displayOption: displayOption,
value: selected[0]
}) : this.props.placeholder), this.props.erasable && hasValue ? /*#__PURE__*/_react["default"].createElement(DropdownSelectErase, null, /*#__PURE__*/_react["default"].createElement(_icons.Delete, {
height: "12px",
onClick: this._onErase
})) : null), this.state.showTypeahead && this._renderDropdown()))
);
}
}]);
return ItemSelector;
}(_react.Component);
(0, _defineProperty2["default"])(ItemSelector, "propTypes", {
// required properties
selectedItems: _propTypes["default"].oneOfType([_propTypes["default"].array, _propTypes["default"].string, _propTypes["default"].number, _propTypes["default"].bool, _propTypes["default"].object]),
onChange: _propTypes["default"].func.isRequired,
options: _propTypes["default"].arrayOf(_propTypes["default"].any).isRequired,
// optional properties
fixedOptions: _propTypes["default"].arrayOf(_propTypes["default"].any),
erasable: _propTypes["default"].bool,
displayOption: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].func]),
getOptionValue: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].func]),
filterOption: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].func]),
placement: _propTypes["default"].string,
disabled: _propTypes["default"].bool,
isError: _propTypes["default"].bool,
multiSelect: _propTypes["default"].bool,
inputTheme: _propTypes["default"].string,
onBlur: _propTypes["default"].func,
placeholder: _propTypes["default"].string,
closeOnSelect: _propTypes["default"].bool,
DropdownHeaderComponent: _propTypes["default"].func,
DropDownRenderComponent: _propTypes["default"].func,
DropDownLineItemRenderComponent: _propTypes["default"].func
});
(0, _defineProperty2["default"])(ItemSelector, "defaultProps", {
erasable: false,
placement: 'bottom',
selectedItems: [],
displayOption: null,
getOptionValue: null,
filterOption: null,
fixedOptions: null,
inputTheme: 'primary',
multiSelect: true,
placeholder: 'Enter a value',
closeOnSelect: true,
searchable: true,
dropdownHeader: null,
DropdownHeaderComponent: null,
DropDownRenderComponent: _dropdownList["default"],
DropDownLineItemRenderComponent: _dropdownList.ListItem
});
var _default = exports["default"] = (0, _reactOnclickoutside["default"])(ItemSelector);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9pdGVtLXNlbGVjdG9yL3dpZGdldC1pdGVtLXNlbGVjdG9yLmpzIl0sIm5hbWVzIjpbIl90b0FycmF5IiwiaXRlbSIsIkFycmF5IiwiaXNBcnJheSIsIlN0eWxlZERyb3Bkb3duU2VsZWN0Iiwic3R5bGVkIiwiZGl2IiwicHJvcHMiLCJpbnB1dFRoZW1lIiwidGhlbWUiLCJzZWNvbmRhcnlJbnB1dCIsImlucHV0IiwiZHJvcGRvd25MaXN0QW5jaG9yIiwiRHJvcGRvd25TZWxlY3RWYWx1ZSIsInNwYW4iLCJwbGFjZWhvbGRlciIsInNlbGVjdENvbG9yUGxhY2VIb2xkZXIiLCJzZWxlY3RDb2xvciIsIkRyb3Bkb3duU2VsZWN0RXJhc2UiLCJEcm9wZG93bldyYXBwZXIiLCJkcm9wZG93bkJnZCIsInBsYWNlbWVudCIsImlucHV0Qm94SGVpZ2h0IiwiSXRlbVNlbGVjdG9yIiwic2hvd1R5cGVhaGVhZCIsIl9oaWRlVHlwZWFoZWFkIiwib25CbHVyIiwiZSIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwic2VsZWN0ZWRJdGVtcyIsImluZGV4IiwiZmluZEluZGV4IiwidCIsIml0ZW1zIiwic2xpY2UiLCJsZW5ndGgiLCJvbkNoYW5nZSIsImNsb3NlT25TZWxlY3QiLCJzZXRTdGF0ZSIsIl9vbkJsdXIiLCJnZXRWYWx1ZSIsIkFjY2Vzc29yIiwiZ2VuZXJhdGVPcHRpb25Ub1N0cmluZ0ZvciIsImdldE9wdGlvblZhbHVlIiwiZGlzcGxheU9wdGlvbiIsInByZXZpb3VzU2VsZWN0ZWQiLCJtdWx0aVNlbGVjdCIsImNvbmNhdCIsIm1hcCIsImRpc2FibGVkIiwicmVzdWx0cyIsImxpc3RJdGVtIiwibGlzdEFuY2hvciIsIm9wdGlvbnMiLCJmaWx0ZXJPcHRpb24iLCJmaXhlZE9wdGlvbnMiLCJfc2VsZWN0SXRlbSIsIkRyb3BEb3duUmVuZGVyQ29tcG9uZW50IiwiRHJvcGRvd25IZWFkZXJDb21wb25lbnQiLCJEcm9wRG93bkxpbmVJdGVtUmVuZGVyQ29tcG9uZW50Iiwic2VhcmNoYWJsZSIsInNlbGVjdGVkIiwiaGFzVmFsdWUiLCJkcm9wZG93blNlbGVjdFByb3BzIiwiY2xhc3NOYW1lIiwiYWN0aXZlIiwic3RhdGUiLCJvbkNsaWNrIiwiX3Nob3dUeXBlYWhlYWQiLCJvbkZvY3VzIiwiX3Nob3dQb3BvdmVyIiwiZXJyb3IiLCJpc0Vycm9yIiwicG9zaXRpb24iLCJfcmVtb3ZlSXRlbSIsImVyYXNhYmxlIiwiX29uRXJhc2UiLCJfcmVuZGVyRHJvcGRvd24iLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJvbmVPZlR5cGUiLCJhcnJheSIsInN0cmluZyIsIm51bWJlciIsImJvb2wiLCJvYmplY3QiLCJmdW5jIiwiaXNSZXF1aXJlZCIsImFycmF5T2YiLCJhbnkiLCJkcm9wZG93bkhlYWRlciIsIkRyb3Bkb3duTGlzdCIsIkxpc3RJdGVtIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7QUFFQTs7Ozs7Ozs7QUFRQSxTQUFTQSxRQUFULENBQWtCQyxJQUFsQixFQUF3QjtBQUN0QixNQUFJQyxLQUFLLENBQUNDLE9BQU4sQ0FBY0YsSUFBZCxDQUFKLEVBQXlCO0FBQ3ZCLFdBQU9BLElBQVA7QUFDRDs7QUFFRCxNQUFJLE9BQU9BLElBQVAsS0FBZ0IsV0FBaEIsSUFBK0JBLElBQUksS0FBSyxJQUE1QyxFQUFrRDtBQUNoRCxXQUFPLEVBQVA7QUFDRDs7QUFFRCxTQUFPLENBQUNBLElBQUQsQ0FBUDtBQUNEOztBQUVELElBQU1HLG9CQUFvQixHQUFHQyw2QkFBT0MsR0FBViw2SUFDdEIsVUFBQUMsS0FBSztBQUFBLFNBQ0xBLEtBQUssQ0FBQ0MsVUFBTixLQUFxQixXQUFyQixHQUNJRCxLQUFLLENBQUNFLEtBQU4sQ0FB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LElBckJOO0FBc0JqQjdFLEVBQUFBLFVBQVUsRUFBRXdFLHNCQUFVRyxNQXRCTDtBQXVCakJ6RCxFQUFBQSxNQUFNLEVBQUVzRCxzQkFBVU8sSUF2QkQ7QUF3QmpCeEUsRUFBQUEsV0FBVyxFQUFFaUUsc0JBQVVHLE1BeEJOO0FBeUJqQjdDLEVBQUFBLGFBQWEsRUFBRTBDLHNCQUFVSyxJQXpCUjtBQTBCakIxQixFQUFBQSx1QkFBdUIsRUFBRXFCLHNCQUFVTyxJQTFCbEI7QUEyQmpCN0IsRUFBQUEsdUJBQXVCLEVBQUVzQixzQkFBVU8sSUEzQmxCO0FBNEJqQjNCLEVBQUFBLCtCQUErQixFQUFFb0Isc0JBQVVPO0FBNUIxQixDO2lDQURmaEUsWSxrQkFnQ2tCO0FBQ3BCcUQsRUFBQUEsUUFBUSxFQUFFLEtBRFU7QUFFcEJ2RCxFQUFBQSxTQUFTLEVBQUUsUUFGUztBQUdwQlMsRUFBQUEsYUFBYSxFQUFFLEVBSEs7QUFJcEJlLEVBQUFBLGFBQWEsRUFBRSxJQUpLO0FBS3BCRCxFQUFBQSxjQUFjLEVBQUUsSUFMSTtBQU1wQlcsRUFBQUEsWUFBWSxFQUFFLElBTk07QUFPcEJDLEVBQUFBLFlBQVksRUFBRSxJQVBNO0FBUXBCaEQsRUFBQUEsVUFBVSxFQUFFLFNBUlE7QUFTcEJ1QyxFQUFBQSxXQUFXLEVBQUUsSUFUTztBQVVwQmhDLEVBQUFBLFdBQVcsRUFBRSxlQVZPO0FBV3BCdUIsRUFBQUEsYUFBYSxFQUFFLElBWEs7QUFZcEJ1QixFQUFBQSxVQUFVLEVBQUUsSUFaUTtBQWFwQjhCLEVBQUFBLGNBQWMsRUFBRSxJQWJJO0FBY3BCaEMsRUFBQUEsdUJBQXVCLEVBQUUsSUFkTDtBQWVwQkQsRUFBQUEsdUJBQXVCLEVBQUVrQyx3QkFmTDtBQWdCcEJoQyxFQUFBQSwrQkFBK0IsRUFBRWlDO0FBaEJiLEM7O29DQXVMVCxxQ0FBc0J0RSxZQUF0QixDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgdW5pcSBmcm9tICdsb2Rhc2gudW5pcSc7XG5pbXBvcnQgbGlzdGVuc1RvQ2xpY2tPdXRzaWRlIGZyb20gJ3JlYWN0LW9uY2xpY2tvdXRzaWRlJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuXG5pbXBvcnQgQWNjZXNzb3IgZnJvbSAnLi9hY2Nlc3Nvcic7XG5pbXBvcnQgQ2hpY2tsZXRlZElucHV0IGZyb20gJy4vY2hpY2tsZXRlZC1pbnB1dCc7XG5pbXBvcnQgVHlwZWFoZWFkIGZyb20gJy4vdHlwZWFoZWFkJztcbmltcG9ydCB7RGVsZXRlfSBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9pY29ucyc7XG5pbXBvcnQgRHJvcGRvd25MaXN0LCB7TGlzdEl0ZW19IGZyb20gJy4vZHJvcGRvd24tbGlzdCc7XG5cbi8qKlxuICogQ29udmVydHMgbm9uLWFycmF5cyB0byBhcnJheXMuICBMZWF2ZXMgYXJyYXlzIGFsb25lLiAgQ29udmVydHNcbiAqIHVuZGVmaW5lZCB2YWx1ZXMgdG8gZW1wdHkgYXJyYXlzIChbXSBpbnN0ZWFkIG9mIFt1bmRlZmluZWRdKS5cbiAqIE90aGVyd2lzZSwganVzdCByZXR1cm5zIFtpdGVtXSBmb3Igbm9uLWFycmF5IGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7Kn0gaXRlbVxuICogQHJldHVybnMge2FycmF5fSBib29tISBtdWNoIGFycmF5LiB2ZXJ5IGluZGV4ZWQuIHNvIHVzZWZ1bC5cbiAqL1xuZnVuY3Rpb24gX3RvQXJyYXkoaXRlbSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgIHJldHVybiBpdGVtO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpdGVtID09PSAndW5kZWZpbmVkJyB8fCBpdGVtID09PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIFtpdGVtXTtcbn1cblxuY29uc3QgU3R5bGVkRHJvcGRvd25TZWxlY3QgPSBzdHlsZWQuZGl2YFxuICAke3Byb3BzID0+XG4gICAgcHJvcHMuaW5wdXRUaGVtZSA9PT0gJ3NlY29uZGFyeSdcbiAgICAgID8gcHJvcHMudGhlbWUuc2Vjb25kYXJ5SW5wdXRcbiAgICAgIDogcHJvcHMudGhlbWUuaW5wdXR9O1xuXG4gIC5saXN0X19pdGVtX19hbmNob3Ige1xuICAgICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZHJvcGRvd25MaXN0QW5jaG9yfTtcbiAgfVxuYDtcblxuY29uc3QgRHJvcGRvd25TZWxlY3RWYWx1ZSA9IHN0eWxlZC5zcGFuYFxuICBjb2xvcjogJHtwcm9wcyA9PlxuICAgIHByb3BzLnBsYWNlaG9sZGVyXG4gICAgICA/IHByb3BzLnRoZW1lLnNlbGVjdENvbG9yUGxhY2VIb2xkZXJcbiAgICAgIDogcHJvcHMudGhlbWUuc2VsZWN0Q29sb3J9O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuYDtcblxuY29uc3QgRHJvcGRvd25TZWxlY3RFcmFzZSA9IHN0eWxlZC5kaXZgXG4gIG1hcmdpbi1sZWZ0OiA2cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG5gO1xuXG5jb25zdCBEcm9wZG93bldyYXBwZXIgPSBzdHlsZWQuZGl2YFxuICBiYWNrZ3JvdW5kOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmRyb3Bkb3duQmdkfTtcbiAgYm9yZGVyOiAwO1xuICB3aWR0aDogMTAwJTtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogMTAwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGJvdHRvbTogJHtwcm9wcyA9PlxuICAgIHByb3BzLnBsYWNlbWVudCA9PT0gJ3RvcCcgPyBwcm9wcy50aGVtZS5pbnB1dEJveEhlaWdodCA6ICdhdXRvJ307XG4gIG1hcmdpbi10b3A6ICR7cHJvcHMgPT4gKHByb3BzLnBsYWNlbWVudCA9PT0gJ2JvdHRvbScgPyAnNHB4JyA6ICdhdXRvJyl9O1xuICBtYXJnaW4tYm90dG9tOiAke3Byb3BzID0+IChwcm9wcy5wbGFjZW1lbnQgPT09ICd0b3AnID8gJzRweCcgOiAnYXV0bycpfTtcbmA7XG5cbmNsYXNzIEl0ZW1TZWxlY3RvciBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgLy8gcmVxdWlyZWQgcHJvcGVydGllc1xuICAgIHNlbGVjdGVkSXRlbXM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgICAgUHJvcFR5cGVzLmFycmF5LFxuICAgICAgUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgIFByb3BUeXBlcy5udW1iZXIsXG4gICAgICBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIFByb3BUeXBlcy5vYmplY3RcbiAgICBdKSxcbiAgICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBvcHRpb25zOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuYW55KS5pc1JlcXVpcmVkLFxuXG4gICAgLy8gb3B0aW9uYWwgcHJvcGVydGllc1xuICAgIGZpeGVkT3B0aW9uczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFueSksXG4gICAgZXJhc2FibGU6IFByb3BUeXBlcy5ib29sLFxuICAgIGRpc3BsYXlPcHRpb246IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgZ2V0T3B0aW9uVmFsdWU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgZmlsdGVyT3B0aW9uOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIHBsYWNlbWVudDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG4gICAgaXNFcnJvcjogUHJvcFR5cGVzLmJvb2wsXG4gICAgbXVsdGlTZWxlY3Q6IFByb3BUeXBlcy5ib29sLFxuICAgIGlucHV0VGhlbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgb25CbHVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBwbGFjZWhvbGRlcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjbG9zZU9uU2VsZWN0OiBQcm9wVHlwZXMuYm9vbCxcbiAgICBEcm9wZG93bkhlYWRlckNvbXBvbmVudDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgRHJvcERvd25SZW5kZXJDb21wb25lbnQ6IFByb3BUeXBlcy5mdW5jLFxuICAgIERyb3BEb3duTGluZUl0ZW1SZW5kZXJDb21wb25lbnQ6IFByb3BUeXBlcy5mdW5jXG4gIH07XG5cbiAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICBlcmFzYWJsZTogZmFsc2UsXG4gICAgcGxhY2VtZW50OiAnYm90dG9tJyxcbiAgICBzZWxlY3RlZEl0ZW1zOiBbXSxcbiAgICBkaXNwbGF5T3B0aW9uOiBudWxsLFxuICAgIGdldE9wdGlvblZhbHVlOiBudWxsLFxuICAgIGZpbHRlck9wdGlvbjogbnVsbCxcbiAgICBmaXhlZE9wdGlvbnM6IG51bGwsXG4gICAgaW5wdXRUaGVtZTogJ3ByaW1hcnknLFxuICAgIG11bHRpU2VsZWN0OiB0cnVlLFxuICAgIHBsYWNlaG9sZGVyOiAnRW50ZXIgYSB2YWx1ZScsXG4gICAgY2xvc2VPblNlbGVjdDogdHJ1ZSxcbiAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgIGRyb3Bkb3duSGVhZGVyOiBudWxsLFxuICAgIERyb3Bkb3duSGVhZGVyQ29tcG9uZW50OiBudWxsLFxuICAgIERyb3BEb3duUmVuZGVyQ29tcG9uZW50OiBEcm9wZG93bkxpc3QsXG4gICAgRHJvcERvd25MaW5lSXRlbVJlbmRlckNvbXBvbmVudDogTGlzdEl0ZW1cbiAgfTtcblxuICBzdGF0ZSA9IHtcbiAgICBzaG93VHlwZWFoZWFkOiBmYWxzZVxuICB9O1xuXG4gIGhhbmRsZUNsaWNrT3V0c2lkZSA9ICgpID0+IHtcbiAgICB0aGlzLl9oaWRlVHlwZWFoZWFkKCk7XG4gIH07XG5cbiAgX2hpZGVUeXBlYWhlYWQoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7c2hvd1R5cGVhaGVhZDogZmFsc2V9KTtcbiAgICB0aGlzLl9vbkJsdXIoKTtcbiAgfVxuXG4gIF9vbkJsdXIgPSAoKSA9PiB7XG4gICAgLy8gbm90ZTogY2hpY2tsZXRlZCBpbnB1dCBpcyBub3QgYSByZWFsIGZvcm0gZWxlbWVudCBzbyB3ZSBjYWxsIG9uQmx1cigpXG4gICAgLy8gd2hlbiB3ZSBmZWVsIHRoZSBldmVudHMgYXJlIGFwcHJvcHJpYXRlXG4gICAgaWYgKHRoaXMucHJvcHMub25CbHVyKSB7XG4gICAgICB0aGlzLnByb3BzLm9uQmx1cigpO1xuICAgIH1cbiAgfTtcblxuICBfcmVtb3ZlSXRlbSA9IChpdGVtLCBlKSA9PiB7XG4gICAgLy8gb25seSB1c2VkIHdoZW4gbXVsdGlTZWxlY3QgPSB0cnVlXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3Qge3NlbGVjdGVkSXRlbXN9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBpbmRleCA9IHNlbGVjdGVkSXRlbXMuZmluZEluZGV4KHQgPT4gdCA9PT0gaXRlbSk7XG5cbiAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbXMgPSBbXG4gICAgICAuLi5zZWxlY3RlZEl0ZW1zLnNsaWNlKDAsIGluZGV4KSxcbiAgICAgIC4uLnNlbGVjdGVkSXRlbXMuc2xpY2UoaW5kZXggKyAxLCBzZWxlY3RlZEl0ZW1zLmxlbmd0aClcbiAgICBdO1xuXG4gICAgdGhpcy5wcm9wcy5vbkNoYW5nZShpdGVtcyk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5jbG9zZU9uU2VsZWN0KSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtzaG93VHlwZWFoZWFkOiBmYWxzZX0pO1xuICAgICAgdGhpcy5fb25CbHVyKCk7XG4gICAgfVxuICB9O1xuXG4gIF9zZWxlY3RJdGVtID0gaXRlbSA9PiB7XG4gICAgY29uc3QgZ2V0VmFsdWUgPSBBY2Nlc3Nvci5nZW5lcmF0ZU9wdGlvblRvU3RyaW5nRm9yKFxuICAgICAgdGhpcy5wcm9wcy5nZXRPcHRpb25WYWx1ZSB8fCB0aGlzLnByb3BzLmRpc3BsYXlPcHRpb25cbiAgICApO1xuXG4gICAgY29uc3QgcHJldmlvdXNTZWxlY3RlZCA9IF90b0FycmF5KHRoaXMucHJvcHMuc2VsZWN0ZWRJdGVtcyk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5tdWx0aVNlbGVjdCkge1xuICAgICAgY29uc3QgaXRlbXMgPSB1bmlxKHByZXZpb3VzU2VsZWN0ZWQuY29uY2F0KF90b0FycmF5KGl0ZW0pLm1hcChnZXRWYWx1ZSkpKTtcbiAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UoaXRlbXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKGdldFZhbHVlKGl0ZW0pKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy5jbG9zZU9uU2VsZWN0KSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtzaG93VHlwZWFoZWFkOiBmYWxzZX0pO1xuICAgICAgdGhpcy5fb25CbHVyKCk7XG4gICAgfVxuICB9O1xuXG4gIF9vbkVyYXNlID0gZSA9PiB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKG51bGwpO1xuICB9O1xuXG4gIF9zaG93VHlwZWFoZWFkID0gKCkgPT4ge1xuICAgIGlmICghdGhpcy5wcm9wcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNob3dUeXBlYWhlYWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBfcmVuZGVyRHJvcGRvd24oKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxEcm9wZG93bldyYXBwZXIgcGxhY2VtZW50PXt0aGlzLnByb3BzLnBsYWNlbWVudH0+XG4gICAgICAgIDxUeXBlYWhlYWRcbiAgICAgICAgICBjdXN0b21DbGFzc2VzPXt7XG4gICAgICAgICAgICByZXN1bHRzOiAnbGlzdC1zZWxlY3RvcicsXG4gICAgICAgICAgICBpbnB1dDogJ3R5cGVhaGVhZF9faW5wdXQnLFxuICAgICAgICAgICAgbGlzdEl0ZW06ICdsaXN0X19pdGVtJyxcbiAgICAgICAgICAgIGxpc3RBbmNob3I6ICdsaXN0X19pdGVtX19hbmNob3InXG4gICAgICAgICAgfX1cbiAgICAgICAgICBvcHRpb25zPXt0aGlzLnByb3BzLm9wdGlvbnN9XG4gICAgICAgICAgZmlsdGVyT3B0aW9uPXt0aGlzLnByb3BzLmZpbHRlck9wdGlvbn1cbiAgICAgICAgICBmaXhlZE9wdGlvbnM9e3RoaXMucHJvcHMuZml4ZWRPcHRpb25zfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCJcbiAgICAgICAgICBvbk9wdGlvblNlbGVjdGVkPXt0aGlzLl9zZWxlY3RJdGVtfVxuICAgICAgICAgIGN1c3RvbUxpc3RDb21wb25lbnQ9e3RoaXMucHJvcHMuRHJvcERvd25SZW5kZXJDb21wb25lbnR9XG4gICAgICAgICAgY3VzdG9tTGlzdEhlYWRlckNvbXBvbmVudD17dGhpcy5wcm9wcy5Ecm9wZG93bkhlYWRlckNvbXBvbmVudH1cbiAgICAgICAgICBjdXN0b21MaXN0SXRlbUNvbXBvbmVudD17dGhpcy5wcm9wcy5Ecm9wRG93bkxpbmVJdGVtUmVuZGVyQ29tcG9uZW50fVxuICAgICAgICAgIGRpc3BsYXlPcHRpb249e0FjY2Vzc29yLmdlbmVyYXRlT3B0aW9uVG9TdHJpbmdGb3IoXG4gICAgICAgICAgICB0aGlzLnByb3BzLmRpc3BsYXlPcHRpb25cbiAgICAgICAgICApfVxuICAgICAgICAgIHNlYXJjaGFibGU9e3RoaXMucHJvcHMuc2VhcmNoYWJsZX1cbiAgICAgICAgICBzaG93T3B0aW9uc1doZW5FbXB0eVxuICAgICAgICAgIHNlbGVjdGVkSXRlbXM9e190b0FycmF5KHRoaXMucHJvcHMuc2VsZWN0ZWRJdGVtcyl9XG4gICAgICAgIC8+XG4gICAgICA8L0Ryb3Bkb3duV3JhcHBlcj5cbiAgICApO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gX3RvQXJyYXkodGhpcy5wcm9wcy5zZWxlY3RlZEl0ZW1zKTtcbiAgICBjb25zdCBoYXNWYWx1ZSA9IHNlbGVjdGVkLmxlbmd0aDtcbiAgICBjb25zdCBkaXNwbGF5T3B0aW9uID0gQWNjZXNzb3IuZ2VuZXJhdGVPcHRpb25Ub1N0cmluZ0ZvcihcbiAgICAgIHRoaXMucHJvcHMuZGlzcGxheU9wdGlvblxuICAgICk7XG5cbiAgICBjb25zdCBkcm9wZG93blNlbGVjdFByb3BzID0ge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKGBpdGVtLXNlbGVjdG9yX19kcm9wZG93bmAsIHtcbiAgICAgICAgYWN0aXZlOiB0aGlzLnN0YXRlLnNob3dUeXBlYWhlYWRcbiAgICAgIH0pLFxuICAgICAgZGlzYWJsZWQ6IHRoaXMucHJvcHMuZGlzYWJsZWQsXG4gICAgICBvbkNsaWNrOiB0aGlzLl9zaG93VHlwZWFoZWFkLFxuICAgICAgb25Gb2N1czogdGhpcy5fc2hvd1BvcG92ZXIsXG4gICAgICBlcnJvcjogdGhpcy5wcm9wcy5pc0Vycm9yLFxuICAgICAgaW5wdXRUaGVtZTogdGhpcy5wcm9wcy5pbnB1dFRoZW1lXG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIml0ZW0tc2VsZWN0b3JcIj5cbiAgICAgICAgPGRpdiBzdHlsZT17e3Bvc2l0aW9uOiAncmVsYXRpdmUnfX0+XG4gICAgICAgICAgey8qIHRoaXMgcGFydCBpcyB1c2VkIHRvIGRpc3BsYXkgdGhlIGxhYmVsICovfVxuICAgICAgICAgIHt0aGlzLnByb3BzLm11bHRpU2VsZWN0ID8gKFxuICAgICAgICAgICAgPENoaWNrbGV0ZWRJbnB1dFxuICAgICAgICAgICAgICB7Li4uZHJvcGRvd25TZWxlY3RQcm9wc31cbiAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtcz17X3RvQXJyYXkodGhpcy5wcm9wcy5zZWxlY3RlZEl0ZW1zKX1cbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3RoaXMucHJvcHMucGxhY2Vob2xkZXJ9XG4gICAgICAgICAgICAgIGRpc3BsYXlPcHRpb249e2Rpc3BsYXlPcHRpb259XG4gICAgICAgICAgICAgIHJlbW92ZUl0ZW09e3RoaXMuX3JlbW92ZUl0ZW19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8U3R5bGVkRHJvcGRvd25TZWxlY3Qgey4uLmRyb3Bkb3duU2VsZWN0UHJvcHN9PlxuICAgICAgICAgICAgICA8RHJvcGRvd25TZWxlY3RWYWx1ZSBwbGFjZWhvbGRlcj17IWhhc1ZhbHVlfT5cbiAgICAgICAgICAgICAgICB7aGFzVmFsdWUgPyAoXG4gICAgICAgICAgICAgICAgICA8dGhpcy5wcm9wcy5Ecm9wRG93bkxpbmVJdGVtUmVuZGVyQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlPcHRpb249e2Rpc3BsYXlPcHRpb259XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzZWxlY3RlZFswXX1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L0Ryb3Bkb3duU2VsZWN0VmFsdWU+XG4gICAgICAgICAgICAgIHt0aGlzLnByb3BzLmVyYXNhYmxlICYmIGhhc1ZhbHVlID8gKFxuICAgICAgICAgICAgICAgIDxEcm9wZG93blNlbGVjdEVyYXNlPlxuICAgICAgICAgICAgICAgICAgPERlbGV0ZSBoZWlnaHQ9XCIxMnB4XCIgb25DbGljaz17dGhpcy5fb25FcmFzZX0gLz5cbiAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duU2VsZWN0RXJhc2U+XG4gICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgPC9TdHlsZWREcm9wZG93blNlbGVjdD5cbiAgICAgICAgICApfVxuICAgICAgICAgIHsvKiB0aGlzIHBhcnQgaXMgdXNlZCB0byBidWlsdCB0aGUgbGlzdCAqL31cbiAgICAgICAgICB7dGhpcy5zdGF0ZS5zaG93VHlwZWFoZWFkICYmIHRoaXMuX3JlbmRlckRyb3Bkb3duKCl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBsaXN0ZW5zVG9DbGlja091dHNpZGUoSXRlbVNlbGVjdG9yKTtcbiJdfQ==