mui-checkboxlist
Version:
A Material UI based react component for checkbox list.
326 lines (272 loc) • 35.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _lodash = _interopRequireDefault(require("lodash"));
var _Checkbox = _interopRequireDefault(require("@material-ui/core/Checkbox"));
var _Grid = _interopRequireDefault(require("@material-ui/core/Grid"));
var _TextField = _interopRequireDefault(require("@material-ui/core/TextField"));
var _FormControlLabel = _interopRequireDefault(require("@material-ui/core/FormControlLabel"));
var _InputAdornment = _interopRequireDefault(require("@material-ui/core/InputAdornment"));
var _IconButton = _interopRequireDefault(require("@material-ui/core/IconButton"));
var _Close = _interopRequireDefault(require("@material-ui/icons/Close"));
var _DefaultStyles = _interopRequireDefault(require("./DefaultStyles"));
var _styles = require("@material-ui/styles");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
var CheckboxValueSelect =
/*#__PURE__*/
function (_React$Component) {
_inherits(CheckboxValueSelect, _React$Component);
function CheckboxValueSelect(props) {
var _this;
_classCallCheck(this, CheckboxValueSelect);
_this = _possibleConstructorReturn(this, _getPrototypeOf(CheckboxValueSelect).call(this, props));
_this.state = {
searchKey: null,
selectedItems: props.selectedItems || []
};
return _this;
}
_createClass(CheckboxValueSelect, [{
key: "isChecked",
value: function isChecked(item, selectedItems) {
var valueFilter = _lodash["default"].filter(selectedItems, function (selectedItem) {
return selectedItem === item;
});
return !_lodash["default"].isEmpty(valueFilter);
}
}, {
key: "renderSearchBar",
value: function renderSearchBar() {
var _this2 = this;
var _this$props = this.props,
classes = _this$props.classes,
searchBarLabel = _this$props.searchBarLabel,
disabled = _this$props.disabled;
var searchKey = this.state.searchKey;
if (_lodash["default"].isNil(searchBarLabel) || disabled) return;
var handleSearchChange = function handleSearchChange(event) {
_this2.setState({
searchKey: _lodash["default"].lowerCase(event.target.value)
});
};
return _react["default"].createElement(_react["default"].Fragment, null, _react["default"].createElement(_Grid["default"], {
item: true,
xs: 12,
className: classes.listSearchBar
}, _react["default"].createElement(_TextField["default"], {
fullWidth: true,
placeholder: searchBarLabel,
className: classes.listSearchBarText,
value: searchKey || "",
onChange: handleSearchChange,
InputProps: !_lodash["default"].isNil(this.state.searchKey) && this.state.searchKey !== "" ? {
endAdornment: _react["default"].createElement(_InputAdornment["default"], {
position: "end"
}, _react["default"].createElement(_IconButton["default"], {
edge: "end",
"aria-label": "Clear search bar",
onClick: function onClick() {
_this2.setState({
searchKey: null
});
}
}, _react["default"].createElement(_Close["default"], null)))
} : null
})));
}
}, {
key: "renderSelectAll",
value: function renderSelectAll() {
var _this3 = this;
var _this$props2 = this.props,
classes = _this$props2.classes,
listItems = _this$props2.listItems,
selectAllLabel = _this$props2.selectAllLabel,
onChange = _this$props2.onChange,
checkedIcon = _this$props2.checkedIcon,
icon = _this$props2.icon,
disabled = _this$props2.disabled,
limit = _this$props2.limit;
var selectedItems = this.state.selectedItems;
if (_lodash["default"].isNil(selectAllLabel) || !_lodash["default"].isNil(limit)) return;
var handleSelectAllChange = function handleSelectAllChange(event) {
var newSelectedItems = [];
if (event.target.checked) {
newSelectedItems = _lodash["default"].clone(listItems);
}
onChange(newSelectedItems);
_this3.setState({
selectedItems: newSelectedItems
});
};
return _react["default"].createElement("div", {
className: classes.listItem
}, _react["default"].createElement(_FormControlLabel["default"], {
control: _react["default"].createElement(_Checkbox["default"], {
className: classes.listItemCheckbox,
disableRipple: true,
color: "default",
checked: _lodash["default"].isEqual(selectedItems, listItems),
onChange: handleSelectAllChange,
disabled: disabled,
checkedIcon: checkedIcon,
icon: icon
}),
className: classes.listItemCheckbox.label,
label: selectAllLabel
}));
}
}, {
key: "renderStatusBar",
value: function renderStatusBar() {
var selectedItems = this.state.selectedItems;
var limit = this.props.limit;
var status = "".concat(selectedItems.length, " item").concat(selectedItems.length !== 1 ? "s are" : " is", " currently selected.");
if (limit) {
status = status + " You can only select ".concat(limit.max, " ").concat(limit.max > 1 ? "items" : "item", ".");
}
return status;
}
}, {
key: "renderValueCheckbox",
value: function renderValueCheckbox(item) {
var _this4 = this;
var _this$props3 = this.props,
classes = _this$props3.classes,
checkedIcon = _this$props3.checkedIcon,
icon = _this$props3.icon,
disabled = _this$props3.disabled,
onChange = _this$props3.onChange,
limit = _this$props3.limit;
var selectedItems = this.state.selectedItems;
var handleChange = function handleChange(item) {
return function (event) {
var selectedItems = _this4.state.selectedItems;
var newSelectedItems = selectedItems;
if (event.target.checked) {
if (limit && limit.max === newSelectedItems.length) {
newSelectedItems.splice(limit.deleteLast ? limit.max - 1 : 0, 1);
}
newSelectedItems.push(item);
} else {
_lodash["default"].remove(newSelectedItems, function (listItem) {
return item === listItem;
});
}
onChange(newSelectedItems);
_this4.setState({
selectedItems: newSelectedItems
});
};
};
return _react["default"].createElement("div", {
className: classes.listItem,
key: "div-".concat(item)
}, _react["default"].createElement(_FormControlLabel["default"], {
control: _react["default"].createElement(_Checkbox["default"], {
className: classes.listItemCheckbox,
disabled: disabled,
disableRipple: true,
color: "default",
checked: this.isChecked(item, selectedItems),
onChange: handleChange(item),
checkedIcon: checkedIcon,
icon: icon
}),
className: classes.listItemCheckbox.label,
label: item
}));
}
}, {
key: "renderCheckboxes",
value: function renderCheckboxes() {
var _this5 = this;
var _this$state = this.state,
selectedItems = _this$state.selectedItems,
searchKey = _this$state.searchKey;
var _this$props4 = this.props,
listItems = _this$props4.listItems,
selectedItemsFirst = _this$props4.selectedItemsFirst;
var filteredListItems = _lodash["default"].orderBy(searchKey && searchKey !== "" ? _lodash["default"].filter(listItems, function (listItem) {
return _lodash["default"].startsWith(_lodash["default"].lowerCase(listItem), searchKey);
}) : selectedItemsFirst && !_lodash["default"].isEmpty(selectedItems) ? _lodash["default"].filter(listItems, function (listItem) {
return _lodash["default"].isNil(_lodash["default"].find(selectedItems, function (selectedItem) {
return selectedItem === listItem;
}));
}) : listItems);
return _react["default"].createElement(_react["default"].Fragment, null, selectedItemsFirst && (_lodash["default"].isNil(searchKey) || searchKey === "") && !_lodash["default"].isEmpty(selectedItems) && _lodash["default"].orderBy(selectedItems).map(function (item) {
return _this5.renderValueCheckbox(item);
}), filteredListItems.map(function (item) {
return _this5.renderValueCheckbox(item);
}));
}
}, {
key: "render",
value: function render() {
var _this$props5 = this.props,
classes = _this$props5.classes,
label = _this$props5.label,
statusBar = _this$props5.statusBar;
console.log(classes.listLabel);
return _react["default"].createElement(_Grid["default"], {
container: true,
direction: "row",
alignItems: "stretch",
className: classes.root
}, label && _react["default"].createElement(_Grid["default"], {
item: true,
xs: 12,
className: classes.listLabel
}, label), statusBar && _react["default"].createElement(_Grid["default"], {
item: true,
xs: 12,
className: classes.listStatusBar
}, this.renderStatusBar()), this.renderSearchBar(), _react["default"].createElement(_Grid["default"], {
item: true,
xs: 12,
className: classes.listContainer
}, this.renderSelectAll(), this.renderCheckboxes()));
}
}]);
return CheckboxValueSelect;
}(_react["default"].Component);
CheckboxValueSelect.propTypes = {
checkedIcon: _propTypes["default"].object,
classes: _propTypes["default"].object,
disabled: _propTypes["default"].bool,
icon: _propTypes["default"].object,
label: _propTypes["default"].string,
limit: _propTypes["default"].shape({
max: _propTypes["default"].number.isRequired,
deleteLast: _propTypes["default"].bool.isRequired
}),
listItems: _propTypes["default"].arrayOf(_propTypes["default"].string).isRequired,
onChange: _propTypes["default"].func.isRequired,
searchBarLabel: _propTypes["default"].string,
selectAllLabel: _propTypes["default"].string,
selectedItems: _propTypes["default"].arrayOf(_propTypes["default"].string),
selectedItemsFirst: _propTypes["default"].bool,
statusBar: _propTypes["default"].bool
};
CheckboxValueSelect.defaultProps = {
disabled: false,
selectAll: true,
statusBar: false,
selectedItemsFirst: false
};
var _default = (0, _styles.withStyles)(_DefaultStyles["default"])(CheckboxValueSelect);
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9DaGVja2JveFZhbHVlU2VsZWN0LmpzIl0sIm5hbWVzIjpbIkNoZWNrYm94VmFsdWVTZWxlY3QiLCJwcm9wcyIsInN0YXRlIiwic2VhcmNoS2V5Iiwic2VsZWN0ZWRJdGVtcyIsIml0ZW0iLCJ2YWx1ZUZpbHRlciIsIl8iLCJmaWx0ZXIiLCJzZWxlY3RlZEl0ZW0iLCJpc0VtcHR5IiwiY2xhc3NlcyIsInNlYXJjaEJhckxhYmVsIiwiZGlzYWJsZWQiLCJpc05pbCIsImhhbmRsZVNlYXJjaENoYW5nZSIsImV2ZW50Iiwic2V0U3RhdGUiLCJsb3dlckNhc2UiLCJ0YXJnZXQiLCJ2YWx1ZSIsImxpc3RTZWFyY2hCYXIiLCJsaXN0U2VhcmNoQmFyVGV4dCIsImVuZEFkb3JubWVudCIsImxpc3RJdGVtcyIsInNlbGVjdEFsbExhYmVsIiwib25DaGFuZ2UiLCJjaGVja2VkSWNvbiIsImljb24iLCJsaW1pdCIsImhhbmRsZVNlbGVjdEFsbENoYW5nZSIsIm5ld1NlbGVjdGVkSXRlbXMiLCJjaGVja2VkIiwiY2xvbmUiLCJsaXN0SXRlbSIsImxpc3RJdGVtQ2hlY2tib3giLCJpc0VxdWFsIiwibGFiZWwiLCJzdGF0dXMiLCJsZW5ndGgiLCJtYXgiLCJoYW5kbGVDaGFuZ2UiLCJzcGxpY2UiLCJkZWxldGVMYXN0IiwicHVzaCIsInJlbW92ZSIsImlzQ2hlY2tlZCIsInNlbGVjdGVkSXRlbXNGaXJzdCIsImZpbHRlcmVkTGlzdEl0ZW1zIiwib3JkZXJCeSIsInN0YXJ0c1dpdGgiLCJmaW5kIiwibWFwIiwicmVuZGVyVmFsdWVDaGVja2JveCIsInN0YXR1c0JhciIsImNvbnNvbGUiLCJsb2ciLCJsaXN0TGFiZWwiLCJyb290IiwibGlzdFN0YXR1c0JhciIsInJlbmRlclN0YXR1c0JhciIsInJlbmRlclNlYXJjaEJhciIsImxpc3RDb250YWluZXIiLCJyZW5kZXJTZWxlY3RBbGwiLCJyZW5kZXJDaGVja2JveGVzIiwiUmVhY3QiLCJDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJvYmplY3QiLCJib29sIiwic3RyaW5nIiwic2hhcGUiLCJudW1iZXIiLCJpc1JlcXVpcmVkIiwiYXJyYXlPZiIsImZ1bmMiLCJkZWZhdWx0UHJvcHMiLCJzZWxlY3RBbGwiLCJEZWZhdWx0U3R5bGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFFTUEsbUI7Ozs7O0FBQ0osK0JBQVlDLEtBQVosRUFBbUI7QUFBQTs7QUFBQTs7QUFDakIsNkZBQU1BLEtBQU47QUFDQSxVQUFLQyxLQUFMLEdBQWE7QUFDWEMsTUFBQUEsU0FBUyxFQUFFLElBREE7QUFFWEMsTUFBQUEsYUFBYSxFQUFFSCxLQUFLLENBQUNHLGFBQU4sSUFBdUI7QUFGM0IsS0FBYjtBQUZpQjtBQU1sQjs7Ozs4QkFFU0MsSSxFQUFNRCxhLEVBQWU7QUFDN0IsVUFBTUUsV0FBVyxHQUFHQyxtQkFBRUMsTUFBRixDQUFTSixhQUFULEVBQXdCLFVBQVNLLFlBQVQsRUFBdUI7QUFDakUsZUFBT0EsWUFBWSxLQUFLSixJQUF4QjtBQUNELE9BRm1CLENBQXBCOztBQUdBLGFBQU8sQ0FBQ0UsbUJBQUVHLE9BQUYsQ0FBVUosV0FBVixDQUFSO0FBQ0Q7OztzQ0FFaUI7QUFBQTs7QUFBQSx3QkFDOEIsS0FBS0wsS0FEbkM7QUFBQSxVQUNSVSxPQURRLGVBQ1JBLE9BRFE7QUFBQSxVQUNDQyxjQURELGVBQ0NBLGNBREQ7QUFBQSxVQUNpQkMsUUFEakIsZUFDaUJBLFFBRGpCO0FBQUEsVUFFUlYsU0FGUSxHQUVNLEtBQUtELEtBRlgsQ0FFUkMsU0FGUTtBQUloQixVQUFJSSxtQkFBRU8sS0FBRixDQUFRRixjQUFSLEtBQTJCQyxRQUEvQixFQUF5Qzs7QUFFekMsVUFBTUUsa0JBQWtCLEdBQUcsU0FBckJBLGtCQUFxQixDQUFBQyxLQUFLLEVBQUk7QUFDbEMsUUFBQSxNQUFJLENBQUNDLFFBQUwsQ0FBYztBQUFFZCxVQUFBQSxTQUFTLEVBQUVJLG1CQUFFVyxTQUFGLENBQVlGLEtBQUssQ0FBQ0csTUFBTixDQUFhQyxLQUF6QjtBQUFiLFNBQWQ7QUFDRCxPQUZEOztBQUlBLGFBQ0UsZ0NBQUMsaUJBQUQsQ0FBTyxRQUFQLFFBQ0UsZ0NBQUMsZ0JBQUQ7QUFBTSxRQUFBLElBQUksTUFBVjtBQUFXLFFBQUEsRUFBRSxFQUFFLEVBQWY7QUFBbUIsUUFBQSxTQUFTLEVBQUVULE9BQU8sQ0FBQ1U7QUFBdEMsU0FDRSxnQ0FBQyxxQkFBRDtBQUNFLFFBQUEsU0FBUyxNQURYO0FBRUUsUUFBQSxXQUFXLEVBQUVULGNBRmY7QUFHRSxRQUFBLFNBQVMsRUFBRUQsT0FBTyxDQUFDVyxpQkFIckI7QUFJRSxRQUFBLEtBQUssRUFBRW5CLFNBQVMsSUFBSSxFQUp0QjtBQUtFLFFBQUEsUUFBUSxFQUFFWSxrQkFMWjtBQU1FLFFBQUEsVUFBVSxFQUNSLENBQUNSLG1CQUFFTyxLQUFGLENBQVEsS0FBS1osS0FBTCxDQUFXQyxTQUFuQixDQUFELElBQWtDLEtBQUtELEtBQUwsQ0FBV0MsU0FBWCxLQUF5QixFQUEzRCxHQUNJO0FBQ0VvQixVQUFBQSxZQUFZLEVBQ1YsZ0NBQUMsMEJBQUQ7QUFBZ0IsWUFBQSxRQUFRLEVBQUM7QUFBekIsYUFDRSxnQ0FBQyxzQkFBRDtBQUNFLFlBQUEsSUFBSSxFQUFDLEtBRFA7QUFFRSwwQkFBVyxrQkFGYjtBQUdFLFlBQUEsT0FBTyxFQUFFLG1CQUFNO0FBQ2IsY0FBQSxNQUFJLENBQUNOLFFBQUwsQ0FBYztBQUFFZCxnQkFBQUEsU0FBUyxFQUFFO0FBQWIsZUFBZDtBQUNEO0FBTEgsYUFPRSxnQ0FBQyxpQkFBRCxPQVBGLENBREY7QUFGSixTQURKLEdBZ0JJO0FBdkJSLFFBREYsQ0FERixDQURGO0FBZ0NEOzs7c0NBRWlCO0FBQUE7O0FBQUEseUJBVVosS0FBS0YsS0FWTztBQUFBLFVBRWRVLE9BRmMsZ0JBRWRBLE9BRmM7QUFBQSxVQUdkYSxTQUhjLGdCQUdkQSxTQUhjO0FBQUEsVUFJZEMsY0FKYyxnQkFJZEEsY0FKYztBQUFBLFVBS2RDLFFBTGMsZ0JBS2RBLFFBTGM7QUFBQSxVQU1kQyxXQU5jLGdCQU1kQSxXQU5jO0FBQUEsVUFPZEMsSUFQYyxnQkFPZEEsSUFQYztBQUFBLFVBUWRmLFFBUmMsZ0JBUWRBLFFBUmM7QUFBQSxVQVNkZ0IsS0FUYyxnQkFTZEEsS0FUYztBQUFBLFVBV1J6QixhQVhRLEdBV1UsS0FBS0YsS0FYZixDQVdSRSxhQVhRO0FBYWhCLFVBQUlHLG1CQUFFTyxLQUFGLENBQVFXLGNBQVIsS0FBMkIsQ0FBQ2xCLG1CQUFFTyxLQUFGLENBQVFlLEtBQVIsQ0FBaEMsRUFBZ0Q7O0FBRWhELFVBQU1DLHFCQUFxQixHQUFHLFNBQXhCQSxxQkFBd0IsQ0FBQWQsS0FBSyxFQUFJO0FBQ3JDLFlBQUllLGdCQUFnQixHQUFHLEVBQXZCOztBQUNBLFlBQUlmLEtBQUssQ0FBQ0csTUFBTixDQUFhYSxPQUFqQixFQUEwQjtBQUN4QkQsVUFBQUEsZ0JBQWdCLEdBQUd4QixtQkFBRTBCLEtBQUYsQ0FBUVQsU0FBUixDQUFuQjtBQUNEOztBQUNERSxRQUFBQSxRQUFRLENBQUNLLGdCQUFELENBQVI7O0FBQ0EsUUFBQSxNQUFJLENBQUNkLFFBQUwsQ0FBYztBQUFFYixVQUFBQSxhQUFhLEVBQUUyQjtBQUFqQixTQUFkO0FBQ0QsT0FQRDs7QUFTQSxhQUNFO0FBQUssUUFBQSxTQUFTLEVBQUVwQixPQUFPLENBQUN1QjtBQUF4QixTQUNFLGdDQUFDLDRCQUFEO0FBQ0UsUUFBQSxPQUFPLEVBQ0wsZ0NBQUMsb0JBQUQ7QUFDRSxVQUFBLFNBQVMsRUFBRXZCLE9BQU8sQ0FBQ3dCLGdCQURyQjtBQUVFLFVBQUEsYUFBYSxNQUZmO0FBR0UsVUFBQSxLQUFLLEVBQUMsU0FIUjtBQUlFLFVBQUEsT0FBTyxFQUFFNUIsbUJBQUU2QixPQUFGLENBQVVoQyxhQUFWLEVBQXlCb0IsU0FBekIsQ0FKWDtBQUtFLFVBQUEsUUFBUSxFQUFFTSxxQkFMWjtBQU1FLFVBQUEsUUFBUSxFQUFFakIsUUFOWjtBQU9FLFVBQUEsV0FBVyxFQUFFYyxXQVBmO0FBUUUsVUFBQSxJQUFJLEVBQUVDO0FBUlIsVUFGSjtBQWFFLFFBQUEsU0FBUyxFQUFFakIsT0FBTyxDQUFDd0IsZ0JBQVIsQ0FBeUJFLEtBYnRDO0FBY0UsUUFBQSxLQUFLLEVBQUVaO0FBZFQsUUFERixDQURGO0FBb0JEOzs7c0NBRWlCO0FBQUEsVUFDUnJCLGFBRFEsR0FDVSxLQUFLRixLQURmLENBQ1JFLGFBRFE7QUFBQSxVQUVSeUIsS0FGUSxHQUVFLEtBQUs1QixLQUZQLENBRVI0QixLQUZRO0FBSWhCLFVBQUlTLE1BQU0sYUFBTWxDLGFBQWEsQ0FBQ21DLE1BQXBCLGtCQUNSbkMsYUFBYSxDQUFDbUMsTUFBZCxLQUF5QixDQUF6QixHQUE2QixPQUE3QixHQUF1QyxLQUQvQix5QkFBVjs7QUFJQSxVQUFJVixLQUFKLEVBQVc7QUFDVFMsUUFBQUEsTUFBTSxHQUNKQSxNQUFNLGtDQUNrQlQsS0FBSyxDQUFDVyxHQUR4QixjQUVKWCxLQUFLLENBQUNXLEdBQU4sR0FBWSxDQUFaLEdBQWdCLE9BQWhCLEdBQTBCLE1BRnRCLE1BRFI7QUFLRDs7QUFFRCxhQUFPRixNQUFQO0FBQ0Q7Ozt3Q0FFbUJqQyxJLEVBQU07QUFBQTs7QUFBQSx5QkFDMEMsS0FBS0osS0FEL0M7QUFBQSxVQUNoQlUsT0FEZ0IsZ0JBQ2hCQSxPQURnQjtBQUFBLFVBQ1BnQixXQURPLGdCQUNQQSxXQURPO0FBQUEsVUFDTUMsSUFETixnQkFDTUEsSUFETjtBQUFBLFVBQ1lmLFFBRFosZ0JBQ1lBLFFBRFo7QUFBQSxVQUNzQmEsUUFEdEIsZ0JBQ3NCQSxRQUR0QjtBQUFBLFVBQ2dDRyxLQURoQyxnQkFDZ0NBLEtBRGhDO0FBQUEsVUFFaEJ6QixhQUZnQixHQUVFLEtBQUtGLEtBRlAsQ0FFaEJFLGFBRmdCOztBQUl4QixVQUFNcUMsWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQXBDLElBQUk7QUFBQSxlQUFJLFVBQUFXLEtBQUssRUFBSTtBQUFBLGNBQzVCWixhQUQ0QixHQUNWLE1BQUksQ0FBQ0YsS0FESyxDQUM1QkUsYUFENEI7QUFFcEMsY0FBSTJCLGdCQUFnQixHQUFHM0IsYUFBdkI7O0FBQ0EsY0FBSVksS0FBSyxDQUFDRyxNQUFOLENBQWFhLE9BQWpCLEVBQTBCO0FBQ3hCLGdCQUFJSCxLQUFLLElBQUlBLEtBQUssQ0FBQ1csR0FBTixLQUFjVCxnQkFBZ0IsQ0FBQ1EsTUFBNUMsRUFBb0Q7QUFDbERSLGNBQUFBLGdCQUFnQixDQUFDVyxNQUFqQixDQUF3QmIsS0FBSyxDQUFDYyxVQUFOLEdBQW1CZCxLQUFLLENBQUNXLEdBQU4sR0FBWSxDQUEvQixHQUFtQyxDQUEzRCxFQUE4RCxDQUE5RDtBQUNEOztBQUNEVCxZQUFBQSxnQkFBZ0IsQ0FBQ2EsSUFBakIsQ0FBc0J2QyxJQUF0QjtBQUNELFdBTEQsTUFLTztBQUNMRSwrQkFBRXNDLE1BQUYsQ0FBU2QsZ0JBQVQsRUFBMkIsVUFBU0csUUFBVCxFQUFtQjtBQUM1QyxxQkFBTzdCLElBQUksS0FBSzZCLFFBQWhCO0FBQ0QsYUFGRDtBQUdEOztBQUVEUixVQUFBQSxRQUFRLENBQUNLLGdCQUFELENBQVI7O0FBQ0EsVUFBQSxNQUFJLENBQUNkLFFBQUwsQ0FBYztBQUFFYixZQUFBQSxhQUFhLEVBQUUyQjtBQUFqQixXQUFkO0FBQ0QsU0FoQndCO0FBQUEsT0FBekI7O0FBa0JBLGFBQ0U7QUFBSyxRQUFBLFNBQVMsRUFBRXBCLE9BQU8sQ0FBQ3VCLFFBQXhCO0FBQWtDLFFBQUEsR0FBRyxnQkFBUzdCLElBQVQ7QUFBckMsU0FDRSxnQ0FBQyw0QkFBRDtBQUNFLFFBQUEsT0FBTyxFQUNMLGdDQUFDLG9CQUFEO0FBQ0UsVUFBQSxTQUFTLEVBQUVNLE9BQU8sQ0FBQ3dCLGdCQURyQjtBQUVFLFVBQUEsUUFBUSxFQUFFdEIsUUFGWjtBQUdFLFVBQUEsYUFBYSxNQUhmO0FBSUUsVUFBQSxLQUFLLEVBQUMsU0FKUjtBQUtFLFVBQUEsT0FBTyxFQUFFLEtBQUtpQyxTQUFMLENBQWV6QyxJQUFmLEVBQXFCRCxhQUFyQixDQUxYO0FBTUUsVUFBQSxRQUFRLEVBQUVxQyxZQUFZLENBQUNwQyxJQUFELENBTnhCO0FBT0UsVUFBQSxXQUFXLEVBQUVzQixXQVBmO0FBUUUsVUFBQSxJQUFJLEVBQUVDO0FBUlIsVUFGSjtBQWFFLFFBQUEsU0FBUyxFQUFFakIsT0FBTyxDQUFDd0IsZ0JBQVIsQ0FBeUJFLEtBYnRDO0FBY0UsUUFBQSxLQUFLLEVBQUVoQztBQWRULFFBREYsQ0FERjtBQW9CRDs7O3VDQUVrQjtBQUFBOztBQUFBLHdCQUNvQixLQUFLSCxLQUR6QjtBQUFBLFVBQ1RFLGFBRFMsZUFDVEEsYUFEUztBQUFBLFVBQ01ELFNBRE4sZUFDTUEsU0FETjtBQUFBLHlCQUV5QixLQUFLRixLQUY5QjtBQUFBLFVBRVR1QixTQUZTLGdCQUVUQSxTQUZTO0FBQUEsVUFFRXVCLGtCQUZGLGdCQUVFQSxrQkFGRjs7QUFJakIsVUFBTUMsaUJBQWlCLEdBQUd6QyxtQkFBRTBDLE9BQUYsQ0FDeEI5QyxTQUFTLElBQUlBLFNBQVMsS0FBSyxFQUEzQixHQUNJSSxtQkFBRUMsTUFBRixDQUFTZ0IsU0FBVCxFQUFvQixVQUFBVSxRQUFRLEVBQUk7QUFDOUIsZUFBTzNCLG1CQUFFMkMsVUFBRixDQUFhM0MsbUJBQUVXLFNBQUYsQ0FBWWdCLFFBQVosQ0FBYixFQUFvQy9CLFNBQXBDLENBQVA7QUFDRCxPQUZELENBREosR0FJSTRDLGtCQUFrQixJQUFJLENBQUN4QyxtQkFBRUcsT0FBRixDQUFVTixhQUFWLENBQXZCLEdBQ0FHLG1CQUFFQyxNQUFGLENBQVNnQixTQUFULEVBQW9CLFVBQUFVLFFBQVEsRUFBSTtBQUM5QixlQUFPM0IsbUJBQUVPLEtBQUYsQ0FDTFAsbUJBQUU0QyxJQUFGLENBQU8vQyxhQUFQLEVBQXNCLFVBQUFLLFlBQVksRUFBSTtBQUNwQyxpQkFBT0EsWUFBWSxLQUFLeUIsUUFBeEI7QUFDRCxTQUZELENBREssQ0FBUDtBQUtELE9BTkQsQ0FEQSxHQVFBVixTQWJvQixDQUExQjs7QUFnQkEsYUFDRSxnQ0FBQyxpQkFBRCxDQUFPLFFBQVAsUUFDR3VCLGtCQUFrQixLQUNoQnhDLG1CQUFFTyxLQUFGLENBQVFYLFNBQVIsS0FBc0JBLFNBQVMsS0FBSyxFQURwQixDQUFsQixJQUVDLENBQUNJLG1CQUFFRyxPQUFGLENBQVVOLGFBQVYsQ0FGRixJQUdDRyxtQkFBRTBDLE9BQUYsQ0FBVTdDLGFBQVYsRUFBeUJnRCxHQUF6QixDQUE2QixVQUFBL0MsSUFBSSxFQUFJO0FBQ25DLGVBQU8sTUFBSSxDQUFDZ0QsbUJBQUwsQ0FBeUJoRCxJQUF6QixDQUFQO0FBQ0QsT0FGRCxDQUpKLEVBT0cyQyxpQkFBaUIsQ0FBQ0ksR0FBbEIsQ0FBc0IsVUFBQS9DLElBQUksRUFBSTtBQUM3QixlQUFPLE1BQUksQ0FBQ2dELG1CQUFMLENBQXlCaEQsSUFBekIsQ0FBUDtBQUNELE9BRkEsQ0FQSCxDQURGO0FBYUQ7Ozs2QkFFUTtBQUFBLHlCQUMrQixLQUFLSixLQURwQztBQUFBLFVBQ0NVLE9BREQsZ0JBQ0NBLE9BREQ7QUFBQSxVQUNVMEIsS0FEVixnQkFDVUEsS0FEVjtBQUFBLFVBQ2lCaUIsU0FEakIsZ0JBQ2lCQSxTQURqQjtBQUVQQyxNQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWTdDLE9BQU8sQ0FBQzhDLFNBQXBCO0FBRUEsYUFDRSxnQ0FBQyxnQkFBRDtBQUFNLFFBQUEsU0FBUyxNQUFmO0FBQWdCLFFBQUEsU0FBUyxFQUFDLEtBQTFCO0FBQWdDLFFBQUEsVUFBVSxFQUFDLFNBQTNDO0FBQXFELFFBQUEsU0FBUyxFQUFFOUMsT0FBTyxDQUFDK0M7QUFBeEUsU0FDR3JCLEtBQUssSUFDSixnQ0FBQyxnQkFBRDtBQUFNLFFBQUEsSUFBSSxNQUFWO0FBQVcsUUFBQSxFQUFFLEVBQUUsRUFBZjtBQUFtQixRQUFBLFNBQVMsRUFBRTFCLE9BQU8sQ0FBQzhDO0FBQXRDLFNBQ0dwQixLQURILENBRkosRUFNR2lCLFNBQVMsSUFDUixnQ0FBQyxnQkFBRDtBQUFNLFFBQUEsSUFBSSxNQUFWO0FBQVcsUUFBQSxFQUFFLEVBQUUsRUFBZjtBQUFtQixRQUFBLFNBQVMsRUFBRTNDLE9BQU8sQ0FBQ2dEO0FBQXRDLFNBQ0csS0FBS0MsZUFBTCxFQURILENBUEosRUFXRyxLQUFLQyxlQUFMLEVBWEgsRUFZRSxnQ0FBQyxnQkFBRDtBQUFNLFFBQUEsSUFBSSxNQUFWO0FBQVcsUUFBQSxFQUFFLEVBQUUsRUFBZjtBQUFtQixRQUFBLFNBQVMsRUFBRWxELE9BQU8sQ0FBQ21EO0FBQXRDLFNBQ0csS0FBS0MsZUFBTCxFQURILEVBRUcsS0FBS0MsZ0JBQUwsRUFGSCxDQVpGLENBREY7QUFtQkQ7Ozs7RUFuTytCQyxrQkFBTUMsUzs7QUFzT3hDbEUsbUJBQW1CLENBQUNtRSxTQUFwQixHQUFnQztBQUM5QnhDLEVBQUFBLFdBQVcsRUFBRXlDLHNCQUFVQyxNQURPO0FBRTlCMUQsRUFBQUEsT0FBTyxFQUFFeUQsc0JBQVVDLE1BRlc7QUFHOUJ4RCxFQUFBQSxRQUFRLEVBQUV1RCxzQkFBVUUsSUFIVTtBQUk5QjFDLEVBQUFBLElBQUksRUFBRXdDLHNCQUFVQyxNQUpjO0FBSzlCaEMsRUFBQUEsS0FBSyxFQUFFK0Isc0JBQVVHLE1BTGE7QUFNOUIxQyxFQUFBQSxLQUFLLEVBQUV1QyxzQkFBVUksS0FBVixDQUFnQjtBQUNyQmhDLElBQUFBLEdBQUcsRUFBRTRCLHNCQUFVSyxNQUFWLENBQWlCQyxVQUREO0FBRXJCL0IsSUFBQUEsVUFBVSxFQUFFeUIsc0JBQVVFLElBQVYsQ0FBZUk7QUFGTixHQUFoQixDQU51QjtBQVU5QmxELEVBQUFBLFNBQVMsRUFBRTRDLHNCQUFVTyxPQUFWLENBQWtCUCxzQkFBVUcsTUFBNUIsRUFBb0NHLFVBVmpCO0FBVzlCaEQsRUFBQUEsUUFBUSxFQUFFMEMsc0JBQVVRLElBQVYsQ0FBZUYsVUFYSztBQVk5QjlELEVBQUFBLGNBQWMsRUFBRXdELHNCQUFVRyxNQVpJO0FBYTlCOUMsRUFBQUEsY0FBYyxFQUFFMkMsc0JBQVVHLE1BYkk7QUFjOUJuRSxFQUFBQSxhQUFhLEVBQUVnRSxzQkFBVU8sT0FBVixDQUFrQlAsc0JBQVVHLE1BQTVCLENBZGU7QUFlOUJ4QixFQUFBQSxrQkFBa0IsRUFBRXFCLHNCQUFVRSxJQWZBO0FBZ0I5QmhCLEVBQUFBLFNBQVMsRUFBRWMsc0JBQVVFO0FBaEJTLENBQWhDO0FBbUJBdEUsbUJBQW1CLENBQUM2RSxZQUFwQixHQUFtQztBQUNqQ2hFLEVBQUFBLFFBQVEsRUFBRSxLQUR1QjtBQUVqQ2lFLEVBQUFBLFNBQVMsRUFBRSxJQUZzQjtBQUdqQ3hCLEVBQUFBLFNBQVMsRUFBRSxLQUhzQjtBQUlqQ1AsRUFBQUEsa0JBQWtCLEVBQUU7QUFKYSxDQUFuQzs7ZUFPZSx3QkFBV2dDLHlCQUFYLEVBQTBCL0UsbUJBQTFCLEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XHJcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcclxuaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiO1xyXG5pbXBvcnQgQ2hlY2tib3ggZnJvbSBcIkBtYXRlcmlhbC11aS9jb3JlL0NoZWNrYm94XCI7XHJcbmltcG9ydCBHcmlkIGZyb20gXCJAbWF0ZXJpYWwtdWkvY29yZS9HcmlkXCI7XHJcbmltcG9ydCBUZXh0RmllbGQgZnJvbSBcIkBtYXRlcmlhbC11aS9jb3JlL1RleHRGaWVsZFwiO1xyXG5pbXBvcnQgRm9ybUNvbnRyb2xMYWJlbCBmcm9tIFwiQG1hdGVyaWFsLXVpL2NvcmUvRm9ybUNvbnRyb2xMYWJlbFwiO1xyXG5pbXBvcnQgSW5wdXRBZG9ybm1lbnQgZnJvbSBcIkBtYXRlcmlhbC11aS9jb3JlL0lucHV0QWRvcm5tZW50XCI7XHJcbmltcG9ydCBJY29uQnV0dG9uIGZyb20gXCJAbWF0ZXJpYWwtdWkvY29yZS9JY29uQnV0dG9uXCI7XHJcbmltcG9ydCBDbG9zZSBmcm9tIFwiQG1hdGVyaWFsLXVpL2ljb25zL0Nsb3NlXCI7XHJcbmltcG9ydCBEZWZhdWx0U3R5bGVzIGZyb20gJy4vRGVmYXVsdFN0eWxlcyc7XHJcbmltcG9ydCB7d2l0aFN0eWxlc30gZnJvbSAnQG1hdGVyaWFsLXVpL3N0eWxlcyc7XHJcblxyXG5jbGFzcyBDaGVja2JveFZhbHVlU2VsZWN0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgc3VwZXIocHJvcHMpO1xyXG4gICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgc2VhcmNoS2V5OiBudWxsLFxyXG4gICAgICBzZWxlY3RlZEl0ZW1zOiBwcm9wcy5zZWxlY3RlZEl0ZW1zIHx8IFtdXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgaXNDaGVja2VkKGl0ZW0sIHNlbGVjdGVkSXRlbXMpIHtcclxuICAgIGNvbnN0IHZhbHVlRmlsdGVyID0gXy5maWx0ZXIoc2VsZWN0ZWRJdGVtcywgZnVuY3Rpb24oc2VsZWN0ZWRJdGVtKSB7XHJcbiAgICAgIHJldHVybiBzZWxlY3RlZEl0ZW0gPT09IGl0ZW07XHJcbiAgICB9KTtcclxuICAgIHJldHVybiAhXy5pc0VtcHR5KHZhbHVlRmlsdGVyKTtcclxuICB9XHJcblxyXG4gIHJlbmRlclNlYXJjaEJhcigpIHtcclxuICAgIGNvbnN0IHsgY2xhc3Nlcywgc2VhcmNoQmFyTGFiZWwsIGRpc2FibGVkIH0gPSB0aGlzLnByb3BzO1xyXG4gICAgY29uc3QgeyBzZWFyY2hLZXkgfSA9IHRoaXMuc3RhdGU7XHJcblxyXG4gICAgaWYgKF8uaXNOaWwoc2VhcmNoQmFyTGFiZWwpIHx8IGRpc2FibGVkKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgaGFuZGxlU2VhcmNoQ2hhbmdlID0gZXZlbnQgPT4ge1xyXG4gICAgICB0aGlzLnNldFN0YXRlKHsgc2VhcmNoS2V5OiBfLmxvd2VyQ2FzZShldmVudC50YXJnZXQudmFsdWUpIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICA8UmVhY3QuRnJhZ21lbnQ+XHJcbiAgICAgICAgPEdyaWQgaXRlbSB4cz17MTJ9IGNsYXNzTmFtZT17Y2xhc3Nlcy5saXN0U2VhcmNoQmFyfT5cclxuICAgICAgICAgIDxUZXh0RmllbGRcclxuICAgICAgICAgICAgZnVsbFdpZHRoXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtzZWFyY2hCYXJMYWJlbH1cclxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzLmxpc3RTZWFyY2hCYXJUZXh0fVxyXG4gICAgICAgICAgICB2YWx1ZT17c2VhcmNoS2V5IHx8IFwiXCJ9XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVTZWFyY2hDaGFuZ2V9XHJcbiAgICAgICAgICAgIElucHV0UHJvcHM9e1xyXG4gICAgICAgICAgICAgICFfLmlzTmlsKHRoaXMuc3RhdGUuc2VhcmNoS2V5KSAmJiB0aGlzLnN0YXRlLnNlYXJjaEtleSAhPT0gXCJcIlxyXG4gICAgICAgICAgICAgICAgPyB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRBZG9ybm1lbnQgcG9zaXRpb249XCJlbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPEljb25CdXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlPVwiZW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xlYXIgc2VhcmNoIGJhclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNlYXJjaEtleTogbnVsbCB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPENsb3NlIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvSWNvbkJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvSW5wdXRBZG9ybm1lbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA6IG51bGxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyU2VsZWN0QWxsKCkge1xyXG4gICAgY29uc3Qge1xyXG4gICAgICBjbGFzc2VzLFxyXG4gICAgICBsaXN0SXRlbXMsXHJcbiAgICAgIHNlbGVjdEFsbExhYmVsLFxyXG4gICAgICBvbkNoYW5nZSxcclxuICAgICAgY2hlY2tlZEljb24sXHJcbiAgICAgIGljb24sXHJcbiAgICAgIGRpc2FibGVkLFxyXG4gICAgICBsaW1pdFxyXG4gICAgfSA9IHRoaXMucHJvcHM7XHJcbiAgICBjb25zdCB7IHNlbGVjdGVkSXRlbXMgfSA9IHRoaXMuc3RhdGU7XHJcblxyXG4gICAgaWYgKF8uaXNOaWwoc2VsZWN0QWxsTGFiZWwpIHx8ICFfLmlzTmlsKGxpbWl0KSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGhhbmRsZVNlbGVjdEFsbENoYW5nZSA9IGV2ZW50ID0+IHtcclxuICAgICAgbGV0IG5ld1NlbGVjdGVkSXRlbXMgPSBbXTtcclxuICAgICAgaWYgKGV2ZW50LnRhcmdldC5jaGVja2VkKSB7XHJcbiAgICAgICAgbmV3U2VsZWN0ZWRJdGVtcyA9IF8uY2xvbmUobGlzdEl0ZW1zKTtcclxuICAgICAgfVxyXG4gICAgICBvbkNoYW5nZShuZXdTZWxlY3RlZEl0ZW1zKTtcclxuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNlbGVjdGVkSXRlbXM6IG5ld1NlbGVjdGVkSXRlbXMgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiAoXHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc2VzLmxpc3RJdGVtfT5cclxuICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxyXG4gICAgICAgICAgY29udHJvbD17XHJcbiAgICAgICAgICAgIDxDaGVja2JveFxyXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5saXN0SXRlbUNoZWNrYm94fVxyXG4gICAgICAgICAgICAgIGRpc2FibGVSaXBwbGVcclxuICAgICAgICAgICAgICBjb2xvcj1cImRlZmF1bHRcIlxyXG4gICAgICAgICAgICAgIGNoZWNrZWQ9e18uaXNFcXVhbChzZWxlY3RlZEl0ZW1zLCBsaXN0SXRlbXMpfVxyXG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVTZWxlY3RBbGxDaGFuZ2V9XHJcbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxyXG4gICAgICAgICAgICAgIGNoZWNrZWRJY29uPXtjaGVja2VkSWNvbn1cclxuICAgICAgICAgICAgICBpY29uPXtpY29ufVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzLmxpc3RJdGVtQ2hlY2tib3gubGFiZWx9XHJcbiAgICAgICAgICBsYWJlbD17c2VsZWN0QWxsTGFiZWx9XHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyU3RhdHVzQmFyKCkge1xyXG4gICAgY29uc3QgeyBzZWxlY3RlZEl0ZW1zIH0gPSB0aGlzLnN0YXRlO1xyXG4gICAgY29uc3QgeyBsaW1pdCB9ID0gdGhpcy5wcm9wcztcclxuXHJcbiAgICBsZXQgc3RhdHVzID0gYCR7c2VsZWN0ZWRJdGVtcy5sZW5ndGh9IGl0ZW0ke1xyXG4gICAgICBzZWxlY3RlZEl0ZW1zLmxlbmd0aCAhPT0gMSA/IFwicyBhcmVcIiA6IFwiIGlzXCJcclxuICAgIH0gY3VycmVudGx5IHNlbGVjdGVkLmA7XHJcblxyXG4gICAgaWYgKGxpbWl0KSB7XHJcbiAgICAgIHN0YXR1cyA9XHJcbiAgICAgICAgc3RhdHVzICtcclxuICAgICAgICBgIFlvdSBjYW4gb25seSBzZWxlY3QgJHtsaW1pdC5tYXh9ICR7XHJcbiAgICAgICAgICBsaW1pdC5tYXggPiAxID8gXCJpdGVtc1wiIDogXCJpdGVtXCJcclxuICAgICAgICB9LmA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHN0YXR1cztcclxuICB9XHJcblxyXG4gIHJlbmRlclZhbHVlQ2hlY2tib3goaXRlbSkge1xyXG4gICAgY29uc3QgeyBjbGFzc2VzLCBjaGVja2VkSWNvbiwgaWNvbiwgZGlzYWJsZWQsIG9uQ2hhbmdlLCBsaW1pdCB9ID0gdGhpcy5wcm9wcztcclxuICAgIGNvbnN0IHsgc2VsZWN0ZWRJdGVtcyB9ID0gdGhpcy5zdGF0ZTtcclxuXHJcbiAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSBpdGVtID0+IGV2ZW50ID0+IHtcclxuICAgICAgY29uc3QgeyBzZWxlY3RlZEl0ZW1zIH0gPSB0aGlzLnN0YXRlO1xyXG4gICAgICBsZXQgbmV3U2VsZWN0ZWRJdGVtcyA9IHNlbGVjdGVkSXRlbXM7XHJcbiAgICAgIGlmIChldmVudC50YXJnZXQuY2hlY2tlZCkge1xyXG4gICAgICAgIGlmIChsaW1pdCAmJiBsaW1pdC5tYXggPT09IG5ld1NlbGVjdGVkSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBuZXdTZWxlY3RlZEl0ZW1zLnNwbGljZShsaW1pdC5kZWxldGVMYXN0ID8gbGltaXQubWF4IC0gMSA6IDAsIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBuZXdTZWxlY3RlZEl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgXy5yZW1vdmUobmV3U2VsZWN0ZWRJdGVtcywgZnVuY3Rpb24obGlzdEl0ZW0pIHtcclxuICAgICAgICAgIHJldHVybiBpdGVtID09PSBsaXN0SXRlbTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgb25DaGFuZ2UobmV3U2VsZWN0ZWRJdGVtcyk7XHJcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzZWxlY3RlZEl0ZW1zOiBuZXdTZWxlY3RlZEl0ZW1zIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3Nlcy5saXN0SXRlbX0ga2V5PXtgZGl2LSR7aXRlbX1gfT5cclxuICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxyXG4gICAgICAgICAgY29udHJvbD17XHJcbiAgICAgICAgICAgIDxDaGVja2JveFxyXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5saXN0SXRlbUNoZWNrYm94fVxyXG4gICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cclxuICAgICAgICAgICAgICBkaXNhYmxlUmlwcGxlXHJcbiAgICAgICAgICAgICAgY29sb3I9XCJkZWZhdWx0XCJcclxuICAgICAgICAgICAgICBjaGVja2VkPXt0aGlzLmlzQ2hlY2tlZChpdGVtLCBzZWxlY3RlZEl0ZW1zKX1cclxuICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlKGl0ZW0pfVxyXG4gICAgICAgICAgICAgIGNoZWNrZWRJY29uPXtjaGVja2VkSWNvbn1cclxuICAgICAgICAgICAgICBpY29uPXtpY29ufVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzLmxpc3RJdGVtQ2hlY2tib3gubGFiZWx9XHJcbiAgICAgICAgICBsYWJlbD17aXRlbX1cclxuICAgICAgICAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICByZW5kZXJDaGVja2JveGVzKCkge1xyXG4gICAgY29uc3QgeyBzZWxlY3RlZEl0ZW1zLCBzZWFyY2hLZXkgfSA9IHRoaXMuc3RhdGU7XHJcbiAgICBjb25zdCB7IGxpc3RJdGVtcywgc2VsZWN0ZWRJdGVtc0ZpcnN0IH0gPSB0aGlzLnByb3BzO1xyXG5cclxuICAgIGNvbnN0IGZpbHRlcmVkTGlzdEl0ZW1zID0gXy5vcmRlckJ5KFxyXG4gICAgICBzZWFyY2hLZXkgJiYgc2VhcmNoS2V5ICE9PSBcIlwiXHJcbiAgICAgICAgPyBfLmZpbHRlcihsaXN0SXRlbXMsIGxpc3RJdGVtID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIF8uc3RhcnRzV2l0aChfLmxvd2VyQ2FzZShsaXN0SXRlbSksIHNlYXJjaEtleSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIDogc2VsZWN0ZWRJdGVtc0ZpcnN0ICYmICFfLmlzRW1wdHkoc2VsZWN0ZWRJdGVtcylcclxuICAgICAgICA/IF8uZmlsdGVyKGxpc3RJdGVtcywgbGlzdEl0ZW0gPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gXy5pc05pbChcclxuICAgICAgICAgICAgICBfLmZpbmQoc2VsZWN0ZWRJdGVtcywgc2VsZWN0ZWRJdGVtID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZEl0ZW0gPT09IGxpc3RJdGVtO1xyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIDogbGlzdEl0ZW1zXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiAoXHJcbiAgICAgIDxSZWFjdC5GcmFnbWVudD5cclxuICAgICAgICB7c2VsZWN0ZWRJdGVtc0ZpcnN0ICYmXHJcbiAgICAgICAgICAoXy5pc05pbChzZWFyY2hLZXkpIHx8IHNlYXJjaEtleSA9PT0gXCJcIikgJiZcclxuICAgICAgICAgICFfLmlzRW1wdHkoc2VsZWN0ZWRJdGVtcykgJiZcclxuICAgICAgICAgIF8ub3JkZXJCeShzZWxlY3RlZEl0ZW1zKS5tYXAoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlclZhbHVlQ2hlY2tib3goaXRlbSk7XHJcbiAgICAgICAgICB9KX1cclxuICAgICAgICB7ZmlsdGVyZWRMaXN0SXRlbXMubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyVmFsdWVDaGVja2JveChpdGVtKTtcclxuICAgICAgICB9KX1cclxuICAgICAgPC9SZWFjdC5GcmFnbWVudD5cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICByZW5kZXIoKSB7XHJcbiAgICBjb25zdCB7IGNsYXNzZXMsIGxhYmVsLCBzdGF0dXNCYXIgfSA9IHRoaXMucHJvcHM7XHJcbiAgICBjb25zb2xlLmxvZyhjbGFzc2VzLmxpc3RMYWJlbCk7XHJcblxyXG4gICAgcmV0dXJuIChcclxuICAgICAgPEdyaWQgY29udGFpbmVyIGRpcmVjdGlvbj1cInJvd1wiIGFsaWduSXRlbXM9XCJzdHJldGNoXCIgY2xhc3NOYW1lPXtjbGFzc2VzLnJvb3R9PlxyXG4gICAgICAgIHtsYWJlbCAmJiAoXHJcbiAgICAgICAgICA8R3JpZCBpdGVtIHhzPXsxMn0gY2xhc3NOYW1lPXtjbGFzc2VzLmxpc3RMYWJlbH0+XHJcbiAgICAgICAgICAgIHtsYWJlbH1cclxuICAgICAgICAgIDwvR3JpZD5cclxuICAgICAgICApfVxyXG4gICAgICAgIHtzdGF0dXNCYXIgJiYgKFxyXG4gICAgICAgICAgPEdyaWQgaXRlbSB4cz17MTJ9IGNsYXNzTmFtZT17Y2xhc3Nlcy5saXN0U3RhdHVzQmFyfT5cclxuICAgICAgICAgICAge3RoaXMucmVuZGVyU3RhdHVzQmFyKCl9XHJcbiAgICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgKX1cclxuICAgICAgICB7dGhpcy5yZW5kZXJTZWFyY2hCYXIoKX1cclxuICAgICAgICA8R3JpZCBpdGVtIHhzPXsxMn0gY2xhc3NOYW1lPXtjbGFzc2VzLmxpc3RDb250YWluZXJ9PlxyXG4gICAgICAgICAge3RoaXMucmVuZGVyU2VsZWN0QWxsKCl9XHJcbiAgICAgICAgICB7dGhpcy5yZW5kZXJDaGVja2JveGVzKCl9XHJcbiAgICAgICAgPC9HcmlkPlxyXG4gICAgICA8L0dyaWQ+XHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5cclxuQ2hlY2tib3hWYWx1ZVNlbGVjdC5wcm9wVHlwZXMgPSB7XHJcbiAgY2hlY2tlZEljb246IFByb3BUeXBlcy5vYmplY3QsXHJcbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcclxuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXHJcbiAgaWNvbjogUHJvcFR5cGVzLm9iamVjdCxcclxuICBsYWJlbDogUHJvcFR5cGVzLnN0cmluZyxcclxuICBsaW1pdDogUHJvcFR5cGVzLnNoYXBlKHtcclxuICAgIG1heDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxyXG4gICAgZGVsZXRlTGFzdDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZFxyXG4gIH0pLFxyXG4gIGxpc3RJdGVtczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZykuaXNSZXF1aXJlZCxcclxuICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcclxuICBzZWFyY2hCYXJMYWJlbDogUHJvcFR5cGVzLnN0cmluZyxcclxuICBzZWxlY3RBbGxMYWJlbDogUHJvcFR5cGVzLnN0cmluZyxcclxuICBzZWxlY3RlZEl0ZW1zOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKSxcclxuICBzZWxlY3RlZEl0ZW1zRmlyc3Q6IFByb3BUeXBlcy5ib29sLFxyXG4gIHN0YXR1c0JhcjogUHJvcFR5cGVzLmJvb2wsXHJcbn07XHJcblxyXG5DaGVja2JveFZhbHVlU2VsZWN0LmRlZmF1bHRQcm9wcyA9IHtcclxuICBkaXNhYmxlZDogZmFsc2UsXHJcbiAgc2VsZWN0QWxsOiB0cnVlLFxyXG4gIHN0YXR1c0JhcjogZmFsc2UsXHJcbiAgc2VsZWN0ZWRJdGVtc0ZpcnN0OiBmYWxzZSxcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoRGVmYXVsdFN0eWxlcykoQ2hlY2tib3hWYWx1ZVNlbGVjdCk7XHJcbiJdfQ==