UNPKG

mui-checkboxlist

Version:

A Material UI based react component for checkbox list.

325 lines (271 loc) 36.7 kB
"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 CheckboxLabelValueSelect = /*#__PURE__*/ function (_React$Component) { _inherits(CheckboxLabelValueSelect, _React$Component); function CheckboxLabelValueSelect(props) { var _this; _classCallCheck(this, CheckboxLabelValueSelect); _this = _possibleConstructorReturn(this, _getPrototypeOf(CheckboxLabelValueSelect).call(this, props)); _this.state = { searchKey: null, selectedItems: props.selectedItems || [] }; return _this; } _createClass(CheckboxLabelValueSelect, [{ key: "isValueChecked", value: function isValueChecked(item, selectedItems) { var valueFilter = _lodash["default"].find(selectedItems, function (selectedItem) { return selectedItem.value === item.value; }); return !_lodash["default"].isNil(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(_react["default"].Fragment, null, _react["default"].createElement("div", { className: classes.listItem }, _react["default"].createElement(_FormControlLabel["default"], { control: _react["default"].createElement(_Checkbox["default"], { className: classes.listItemCheckbox, disabled: disabled, disableRipple: true, color: "default", checked: _lodash["default"].isEqual(selectedItems, listItems), onChange: handleSelectAllChange, 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: "renderLabelValueCheckbox", value: function renderLabelValueCheckbox(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 handleValueChange = function handleValueChange(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.label === listItem.label; }); } onChange(newSelectedItems); _this4.setState({ selectedItems: newSelectedItems }); }; }; return _react["default"].createElement("div", { className: classes.listItem, key: "div-".concat(item.label) }, _react["default"].createElement(_FormControlLabel["default"], { control: _react["default"].createElement(_Checkbox["default"], { className: classes.listItemCheckbox, disabled: disabled, disableRipple: true, color: "default", checked: this.isValueChecked(item, selectedItems), onChange: handleValueChange(item), checkedIcon: checkedIcon, icon: icon }), className: classes.listItemCheckbox.label, label: item.label })); } }, { 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.label), searchKey); }) : selectedItemsFirst && !_lodash["default"].isEmpty(selectedItems) ? _lodash["default"].filter(listItems, function (listItem) { return _lodash["default"].isNil(_lodash["default"].find(selectedItems, function (selectedItem) { return selectedItem.label === listItem.label; })); }) : listItems, ["label"]); return _react["default"].createElement(_react["default"].Fragment, null, selectedItemsFirst && (_lodash["default"].isNil(searchKey) || searchKey === "") && !_lodash["default"].isEmpty(selectedItems) && _lodash["default"].orderBy(selectedItems, ["label"]).map(function (item) { return _this5.renderLabelValueCheckbox(item); }), filteredListItems.map(function (item) { return _this5.renderLabelValueCheckbox(item); })); } }, { key: "render", value: function render() { var _this$props5 = this.props, classes = _this$props5.classes, label = _this$props5.label, statusBar = _this$props5.statusBar; 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 CheckboxLabelValueSelect; }(_react["default"].Component); CheckboxLabelValueSelect.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 }; CheckboxLabelValueSelect.defaultProps = { disabled: false, selectAll: true, statusBar: false, selectedItemsFirst: false }; var _default = (0, _styles.withStyles)(_DefaultStyles["default"])(CheckboxLabelValueSelect); exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9DaGVja2JveExhYmVsVmFsdWVTZWxlY3QuanMiXSwibmFtZXMiOlsiQ2hlY2tib3hMYWJlbFZhbHVlU2VsZWN0IiwicHJvcHMiLCJzdGF0ZSIsInNlYXJjaEtleSIsInNlbGVjdGVkSXRlbXMiLCJpdGVtIiwidmFsdWVGaWx0ZXIiLCJfIiwiZmluZCIsInNlbGVjdGVkSXRlbSIsInZhbHVlIiwiaXNOaWwiLCJjbGFzc2VzIiwic2VhcmNoQmFyTGFiZWwiLCJkaXNhYmxlZCIsImhhbmRsZVNlYXJjaENoYW5nZSIsImV2ZW50Iiwic2V0U3RhdGUiLCJsb3dlckNhc2UiLCJ0YXJnZXQiLCJsaXN0U2VhcmNoQmFyIiwibGlzdFNlYXJjaEJhclRleHQiLCJlbmRBZG9ybm1lbnQiLCJsaXN0SXRlbXMiLCJzZWxlY3RBbGxMYWJlbCIsIm9uQ2hhbmdlIiwiY2hlY2tlZEljb24iLCJpY29uIiwibGltaXQiLCJoYW5kbGVTZWxlY3RBbGxDaGFuZ2UiLCJuZXdTZWxlY3RlZEl0ZW1zIiwiY2hlY2tlZCIsImNsb25lIiwibGlzdEl0ZW0iLCJsaXN0SXRlbUNoZWNrYm94IiwiaXNFcXVhbCIsImxhYmVsIiwic3RhdHVzIiwibGVuZ3RoIiwibWF4IiwiaGFuZGxlVmFsdWVDaGFuZ2UiLCJzcGxpY2UiLCJkZWxldGVMYXN0IiwicHVzaCIsInJlbW92ZSIsImlzVmFsdWVDaGVja2VkIiwic2VsZWN0ZWRJdGVtc0ZpcnN0IiwiZmlsdGVyZWRMaXN0SXRlbXMiLCJvcmRlckJ5IiwiZmlsdGVyIiwic3RhcnRzV2l0aCIsImlzRW1wdHkiLCJtYXAiLCJyZW5kZXJMYWJlbFZhbHVlQ2hlY2tib3giLCJzdGF0dXNCYXIiLCJyb290IiwibGlzdExhYmVsIiwibGlzdFN0YXR1c0JhciIsInJlbmRlclN0YXR1c0JhciIsInJlbmRlclNlYXJjaEJhciIsImxpc3RDb250YWluZXIiLCJyZW5kZXJTZWxlY3RBbGwiLCJyZW5kZXJDaGVja2JveGVzIiwiUmVhY3QiLCJDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJvYmplY3QiLCJib29sIiwic3RyaW5nIiwic2hhcGUiLCJudW1iZXIiLCJpc1JlcXVpcmVkIiwiYXJyYXlPZiIsImZ1bmMiLCJkZWZhdWx0UHJvcHMiLCJzZWxlY3RBbGwiLCJEZWZhdWx0U3R5bGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFFTUEsd0I7Ozs7O0FBQ0osb0NBQVlDLEtBQVosRUFBbUI7QUFBQTs7QUFBQTs7QUFDakIsa0dBQU1BLEtBQU47QUFDQSxVQUFLQyxLQUFMLEdBQWE7QUFDWEMsTUFBQUEsU0FBUyxFQUFFLElBREE7QUFFWEMsTUFBQUEsYUFBYSxFQUFFSCxLQUFLLENBQUNHLGFBQU4sSUFBdUI7QUFGM0IsS0FBYjtBQUZpQjtBQU1sQjs7OzttQ0FFY0MsSSxFQUFNRCxhLEVBQWU7QUFDbEMsVUFBTUUsV0FBVyxHQUFHQyxtQkFBRUMsSUFBRixDQUFPSixhQUFQLEVBQXNCLFVBQVNLLFlBQVQsRUFBdUI7QUFDL0QsZUFBT0EsWUFBWSxDQUFDQyxLQUFiLEtBQXVCTCxJQUFJLENBQUNLLEtBQW5DO0FBQ0QsT0FGbUIsQ0FBcEI7O0FBR0EsYUFBTyxDQUFDSCxtQkFBRUksS0FBRixDQUFRTCxXQUFSLENBQVI7QUFDRDs7O3NDQUVpQjtBQUFBOztBQUFBLHdCQUM4QixLQUFLTCxLQURuQztBQUFBLFVBQ1JXLE9BRFEsZUFDUkEsT0FEUTtBQUFBLFVBQ0NDLGNBREQsZUFDQ0EsY0FERDtBQUFBLFVBQ2lCQyxRQURqQixlQUNpQkEsUUFEakI7QUFBQSxVQUVSWCxTQUZRLEdBRU0sS0FBS0QsS0FGWCxDQUVSQyxTQUZRO0FBSWhCLFVBQUlJLG1CQUFFSSxLQUFGLENBQVFFLGNBQVIsS0FBMkJDLFFBQS9CLEVBQXlDOztBQUV6QyxVQUFNQyxrQkFBa0IsR0FBRyxTQUFy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QUFFeUMsc0JBQVVRLElBQVYsQ0FBZUYsVUFYVTtBQVluQzNELEVBQUFBLGNBQWMsRUFBRXFELHNCQUFVRyxNQVpTO0FBYW5DN0MsRUFBQUEsY0FBYyxFQUFFMEMsc0JBQVVHLE1BYlM7QUFjbkNqRSxFQUFBQSxhQUFhLEVBQUU4RCxzQkFBVU8sT0FBVixDQUFrQlAsc0JBQVVHLE1BQTVCLENBZG9CO0FBZW5DdkIsRUFBQUEsa0JBQWtCLEVBQUVvQixzQkFBVUUsSUFmSztBQWdCbkNkLEVBQUFBLFNBQVMsRUFBRVksc0JBQVVFO0FBaEJjLENBQXJDO0FBbUJBcEUsd0JBQXdCLENBQUMyRSxZQUF6QixHQUF3QztBQUN0QzdELEVBQUFBLFFBQVEsRUFBRSxLQUQ0QjtBQUV0QzhELEVBQUFBLFNBQVMsRUFBRSxJQUYyQjtBQUd0Q3RCLEVBQUFBLFNBQVMsRUFBRSxLQUgyQjtBQUl0Q1IsRUFBQUEsa0JBQWtCLEVBQUU7QUFKa0IsQ0FBeEM7O2VBT2Usd0JBQVcrQix5QkFBWCxFQUEwQjdFLHdCQUExQixDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XHJcbmltcG9ydCBfIGZyb20gXCJsb2Rhc2hcIjtcclxuaW1wb3J0IENoZWNrYm94IGZyb20gXCJAbWF0ZXJpYWwtdWkvY29yZS9DaGVja2JveFwiO1xyXG5pbXBvcnQgR3JpZCBmcm9tIFwiQG1hdGVyaWFsLXVpL2NvcmUvR3JpZFwiO1xyXG5pbXBvcnQgVGV4dEZpZWxkIGZyb20gXCJAbWF0ZXJpYWwtdWkvY29yZS9UZXh0RmllbGRcIjtcclxuaW1wb3J0IEZvcm1Db250cm9sTGFiZWwgZnJvbSBcIkBtYXRlcmlhbC11aS9jb3JlL0Zvcm1Db250cm9sTGFiZWxcIjtcclxuaW1wb3J0IElucHV0QWRvcm5tZW50IGZyb20gXCJAbWF0ZXJpYWwtdWkvY29yZS9JbnB1dEFkb3JubWVudFwiO1xyXG5pbXBvcnQgSWNvbkJ1dHRvbiBmcm9tIFwiQG1hdGVyaWFsLXVpL2NvcmUvSWNvbkJ1dHRvblwiO1xyXG5pbXBvcnQgQ2xvc2UgZnJvbSBcIkBtYXRlcmlhbC11aS9pY29ucy9DbG9zZVwiO1xyXG5pbXBvcnQgRGVmYXVsdFN0eWxlcyBmcm9tICcuL0RlZmF1bHRTdHlsZXMnO1xyXG5pbXBvcnQge3dpdGhTdHlsZXN9IGZyb20gJ0BtYXRlcmlhbC11aS9zdHlsZXMnO1xyXG5cclxuY2xhc3MgQ2hlY2tib3hMYWJlbFZhbHVlU2VsZWN0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgc3VwZXIocHJvcHMpO1xyXG4gICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgc2VhcmNoS2V5OiBudWxsLFxyXG4gICAgICBzZWxlY3RlZEl0ZW1zOiBwcm9wcy5zZWxlY3RlZEl0ZW1zIHx8IFtdXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgaXNWYWx1ZUNoZWNrZWQoaXRlbSwgc2VsZWN0ZWRJdGVtcykge1xyXG4gICAgY29uc3QgdmFsdWVGaWx0ZXIgPSBfLmZpbmQoc2VsZWN0ZWRJdGVtcywgZnVuY3Rpb24oc2VsZWN0ZWRJdGVtKSB7XHJcbiAgICAgIHJldHVybiBzZWxlY3RlZEl0ZW0udmFsdWUgPT09IGl0ZW0udmFsdWU7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiAhXy5pc05pbCh2YWx1ZUZpbHRlcik7XHJcbiAgfVxyXG5cclxuICByZW5kZXJTZWFyY2hCYXIoKSB7XHJcbiAgICBjb25zdCB7IGNsYXNzZXMsIHNlYXJjaEJhckxhYmVsLCBkaXNhYmxlZCB9ID0gdGhpcy5wcm9wcztcclxuICAgIGNvbnN0IHsgc2VhcmNoS2V5IH0gPSB0aGlzLnN0YXRlO1xyXG5cclxuICAgIGlmIChfLmlzTmlsKHNlYXJjaEJhckxhYmVsKSB8fCBkaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGhhbmRsZVNlYXJjaENoYW5nZSA9IGV2ZW50ID0+IHtcclxuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNlYXJjaEtleTogXy5sb3dlckNhc2UoZXZlbnQudGFyZ2V0LnZhbHVlKSB9KTtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIChcclxuICAgICAgPFJlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgIDxHcmlkIGl0ZW0geHM9ezEyfSBjbGFzc05hbWU9e2NsYXNzZXMubGlzdFNlYXJjaEJhcn0+XHJcbiAgICAgICAgICA8VGV4dEZpZWxkXHJcbiAgICAgICAgICAgIGZ1bGxXaWR0aFxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj17c2VhcmNoQmFyTGFiZWx9XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5saXN0U2VhcmNoQmFyVGV4dH1cclxuICAgICAgICAgICAgdmFsdWU9e3NlYXJjaEtleSB8fCBcIlwifVxyXG4gICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlU2VhcmNoQ2hhbmdlfVxyXG4gICAgICAgICAgICBJbnB1dFByb3BzPXtcclxuICAgICAgICAgICAgICAhXy5pc05pbCh0aGlzLnN0YXRlLnNlYXJjaEtleSkgJiYgdGhpcy5zdGF0ZS5zZWFyY2hLZXkgIT09IFwiXCJcclxuICAgICAgICAgICAgICAgID8ge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZEFkb3JubWVudDogKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPElucHV0QWRvcm5tZW50IHBvc2l0aW9uPVwiZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxJY29uQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZT1cImVuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNsZWFyIHNlYXJjaCBiYXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzZWFyY2hLZXk6IG51bGwgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxDbG9zZSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L0ljb25CdXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L0lucHV0QWRvcm5tZW50PlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgOiBudWxsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9HcmlkPlxyXG4gICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHJlbmRlclNlbGVjdEFsbCgpIHtcclxuICAgIGNvbnN0IHtcclxuICAgICAgY2xhc3NlcyxcclxuICAgICAgbGlzdEl0ZW1zLFxyXG4gICAgICBzZWxlY3RBbGxMYWJlbCxcclxuICAgICAgb25DaGFuZ2UsXHJcbiAgICAgIGNoZWNrZWRJY29uLFxyXG4gICAgICBpY29uLFxyXG4gICAgICBkaXNhYmxlZCxcclxuICAgICAgbGltaXRcclxuICAgIH0gPSB0aGlzLnByb3BzO1xyXG4gICAgY29uc3QgeyBzZWxlY3RlZEl0ZW1zIH0gPSB0aGlzLnN0YXRlO1xyXG5cclxuICAgIGlmIChfLmlzTmlsKHNlbGVjdEFsbExhYmVsKSB8fCAhXy5pc05pbChsaW1pdCkpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBoYW5kbGVTZWxlY3RBbGxDaGFuZ2UgPSBldmVudCA9PiB7XHJcbiAgICAgIGxldCBuZXdTZWxlY3RlZEl0ZW1zID0gW107XHJcbiAgICAgIGlmIChldmVudC50YXJnZXQuY2hlY2tlZCkge1xyXG4gICAgICAgIG5ld1NlbGVjdGVkSXRlbXMgPSBfLmNsb25lKGxpc3RJdGVtcyk7XHJcbiAgICAgIH1cclxuICAgICAgb25DaGFuZ2UobmV3U2VsZWN0ZWRJdGVtcyk7XHJcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzZWxlY3RlZEl0ZW1zOiBuZXdTZWxlY3RlZEl0ZW1zIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICA8UmVhY3QuRnJhZ21lbnQ+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e2NsYXNzZXMubGlzdEl0ZW19PlxyXG4gICAgICAgICAgPEZvcm1Db250cm9sTGFiZWxcclxuICAgICAgICAgICAgY29udHJvbD17XHJcbiAgICAgICAgICAgICAgPENoZWNrYm94XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMubGlzdEl0ZW1DaGVja2JveH1cclxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cclxuICAgICAgICAgICAgICAgIGRpc2FibGVSaXBwbGVcclxuICAgICAgICAgICAgICAgIGNvbG9yPVwiZGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICBjaGVja2VkPXtfLmlzRXF1YWwoc2VsZWN0ZWRJdGVtcywgbGlzdEl0ZW1zKX1cclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVTZWxlY3RBbGxDaGFuZ2V9XHJcbiAgICAgICAgICAgICAgICBjaGVja2VkSWNvbj17Y2hlY2tlZEljb259XHJcbiAgICAgICAgICAgICAgICBpY29uPXtpY29ufVxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzLmxpc3RJdGVtQ2hlY2tib3gubGFiZWx9XHJcbiAgICAgICAgICAgIGxhYmVsPXtzZWxlY3RBbGxMYWJlbH1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyU3RhdHVzQmFyKCkge1xyXG4gICAgY29uc3QgeyBzZWxlY3RlZEl0ZW1zIH0gPSB0aGlzLnN0YXRlO1xyXG4gICAgY29uc3QgeyBsaW1pdCB9ID0gdGhpcy5wcm9wcztcclxuXHJcbiAgICBsZXQgc3RhdHVzID0gYCR7c2VsZWN0ZWRJdGVtcy5sZW5ndGh9IGl0ZW0ke1xyXG4gICAgICBzZWxlY3RlZEl0ZW1zLmxlbmd0aCAhPT0gMSA/IFwicyBhcmVcIiA6IFwiIGlzXCJcclxuICAgIH0gY3VycmVudGx5IHNlbGVjdGVkLmA7XHJcblxyXG4gICAgaWYgKGxpbWl0KSB7XHJcbiAgICAgIHN0YXR1cyA9XHJcbiAgICAgICAgc3RhdHVzICtcclxuICAgICAgICBgIFlvdSBjYW4gb25seSBzZWxlY3QgJHtsaW1pdC5tYXh9ICR7XHJcbiAgICAgICAgICBsaW1pdC5tYXggPiAxID8gXCJpdGVtc1wiIDogXCJpdGVtXCJcclxuICAgICAgICB9LmA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHN0YXR1cztcclxuICB9XHJcblxyXG4gIHJlbmRlckxhYmVsVmFsdWVDaGVja2JveChpdGVtKSB7XHJcbiAgICBjb25zdCB7XHJcbiAgICAgIGNsYXNzZXMsXHJcbiAgICAgIGNoZWNrZWRJY29uLFxyXG4gICAgICBpY29uLFxyXG4gICAgICBkaXNhYmxlZCxcclxuICAgICAgb25DaGFuZ2UsXHJcbiAgICAgIGxpbWl0XHJcbiAgICB9ID0gdGhpcy5wcm9wcztcclxuICAgIGNvbnN0IHsgc2VsZWN0ZWRJdGVtcyB9ID0gdGhpcy5zdGF0ZTtcclxuXHJcbiAgICBjb25zdCBoYW5kbGVWYWx1ZUNoYW5nZSA9IGl0ZW0gPT4gZXZlbnQgPT4ge1xyXG4gICAgICBjb25zdCB7IHNlbGVjdGVkSXRlbXMgfSA9IHRoaXMuc3RhdGU7XHJcbiAgICAgIGxldCBuZXdTZWxlY3RlZEl0ZW1zID0gc2VsZWN0ZWRJdGVtcztcclxuICAgICAgaWYgKGV2ZW50LnRhcmdldC5jaGVja2VkKSB7XHJcbiAgICAgICAgaWYgKGxpbWl0ICYmIGxpbWl0Lm1heCA9PT0gbmV3U2VsZWN0ZWRJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgIG5ld1NlbGVjdGVkSXRlbXMuc3BsaWNlKGxpbWl0LmRlbGV0ZUxhc3QgPyBsaW1pdC5tYXggLSAxIDogMCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG5ld1NlbGVjdGVkSXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBfLnJlbW92ZShuZXdTZWxlY3RlZEl0ZW1zLCBmdW5jdGlvbihsaXN0SXRlbSkge1xyXG4gICAgICAgICAgcmV0dXJuIGl0ZW0ubGFiZWwgPT09IGxpc3RJdGVtLmxhYmVsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBvbkNoYW5nZShuZXdTZWxlY3RlZEl0ZW1zKTtcclxuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNlbGVjdGVkSXRlbXM6IG5ld1NlbGVjdGVkSXRlbXMgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiAoXHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc2VzLmxpc3RJdGVtfSBrZXk9e2BkaXYtJHtpdGVtLmxhYmVsfWB9PlxyXG4gICAgICAgIDxGb3JtQ29udHJvbExhYmVsXHJcbiAgICAgICAgICBjb250cm9sPXtcclxuICAgICAgICAgICAgPENoZWNrYm94XHJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzLmxpc3RJdGVtQ2hlY2tib3h9XHJcbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxyXG4gICAgICAgICAgICAgIGRpc2FibGVSaXBwbGVcclxuICAgICAgICAgICAgICBjb2xvcj1cImRlZmF1bHRcIlxyXG4gICAgICAgICAgICAgIGNoZWNrZWQ9e3RoaXMuaXNWYWx1ZUNoZWNrZWQoaXRlbSwgc2VsZWN0ZWRJdGVtcyl9XHJcbiAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZVZhbHVlQ2hhbmdlKGl0ZW0pfVxyXG4gICAgICAgICAgICAgIGNoZWNrZWRJY29uPXtjaGVja2VkSWNvbn1cclxuICAgICAgICAgICAgICBpY29uPXtpY29ufVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzLmxpc3RJdGVtQ2hlY2tib3gubGFiZWx9XHJcbiAgICAgICAgICBsYWJlbD17aXRlbS5sYWJlbH1cclxuICAgICAgICAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICByZW5kZXJDaGVja2JveGVzKCkge1xyXG4gICAgY29uc3QgeyBzZWxlY3RlZEl0ZW1zLCBzZWFyY2hLZXkgfSA9IHRoaXMuc3RhdGU7XHJcbiAgICBjb25zdCB7IGxpc3RJdGVtcywgc2VsZWN0ZWRJdGVtc0ZpcnN0IH0gPSB0aGlzLnByb3BzO1xyXG5cclxuICAgIGNvbnN0IGZpbHRlcmVkTGlzdEl0ZW1zID0gXy5vcmRlckJ5KFxyXG4gICAgICBzZWFyY2hLZXkgJiYgc2VhcmNoS2V5ICE9PSBcIlwiXHJcbiAgICAgICAgPyBfLmZpbHRlcihsaXN0SXRlbXMsIGxpc3RJdGVtID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIF8uc3RhcnRzV2l0aChfLmxvd2VyQ2FzZShsaXN0SXRlbS5sYWJlbCksIHNlYXJjaEtleSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIDogc2VsZWN0ZWRJdGVtc0ZpcnN0ICYmICFfLmlzRW1wdHkoc2VsZWN0ZWRJdGVtcylcclxuICAgICAgICA/IF8uZmlsdGVyKGxpc3RJdGVtcywgbGlzdEl0ZW0gPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gXy5pc05pbChcclxuICAgICAgICAgICAgICBfLmZpbmQoc2VsZWN0ZWRJdGVtcywgc2VsZWN0ZWRJdGVtID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZEl0ZW0ubGFiZWwgPT09IGxpc3RJdGVtLmxhYmVsO1xyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIDogbGlzdEl0ZW1zLFxyXG4gICAgICBbXCJsYWJlbFwiXVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICA8UmVhY3QuRnJhZ21lbnQ+XHJcbiAgICAgICAge3NlbGVjdGVkSXRlbXNGaXJzdCAmJlxyXG4gICAgICAgICAgKF8uaXNOaWwoc2VhcmNoS2V5KSB8fCBzZWFyY2hLZXkgPT09IFwiXCIpICYmXHJcbiAgICAgICAgICAhXy5pc0VtcHR5KHNlbGVjdGVkSXRlbXMpICYmXHJcbiAgICAgICAgICBfLm9yZGVyQnkoc2VsZWN0ZWRJdGVtcywgW1wibGFiZWxcIl0pLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyTGFiZWxWYWx1ZUNoZWNrYm94KGl0ZW0pO1xyXG4gICAgICAgICAgfSl9XHJcbiAgICAgICAge2ZpbHRlcmVkTGlzdEl0ZW1zLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckxhYmVsVmFsdWVDaGVja2JveChpdGVtKTtcclxuICAgICAgICB9KX1cclxuICAgICAgPC9SZWFjdC5GcmFnbWVudD5cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICByZW5kZXIoKSB7XHJcbiAgICBjb25zdCB7IGNsYXNzZXMsIGxhYmVsLCBzdGF0dXNCYXIgfSA9IHRoaXMucHJvcHM7XHJcblxyXG4gICAgcmV0dXJuIChcclxuICAgICAgPEdyaWRcclxuICAgICAgICBjb250YWluZXJcclxuICAgICAgICBkaXJlY3Rpb249XCJyb3dcIlxyXG4gICAgICAgIGFsaWduSXRlbXM9XCJzdHJldGNoXCJcclxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMucm9vdH1cclxuICAgICAgPlxyXG4gICAgICAgIHtsYWJlbCAmJiAoXHJcbiAgICAgICAgICA8R3JpZCBpdGVtIHhzPXsxMn0gY2xhc3NOYW1lPXtjbGFzc2VzLmxpc3RMYWJlbH0+XHJcbiAgICAgICAgICAgIHtsYWJlbH1cclxuICAgICAgICAgIDwvR3JpZD5cclxuICAgICAgICApfVxyXG4gICAgICAgIHtzdGF0dXNCYXIgJiYgKFxyXG4gICAgICAgICAgPEdyaWQgaXRlbSB4cz17MTJ9IGNsYXNzTmFtZT17Y2xhc3Nlcy5saXN0U3RhdHVzQmFyfT5cclxuICAgICAgICAgICAge3RoaXMucmVuZGVyU3RhdHVzQmFyKCl9XHJcbiAgICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgKX1cclxuICAgICAgICB7dGhpcy5yZW5kZXJTZWFyY2hCYXIoKX1cclxuICAgICAgICA8R3JpZCBpdGVtIHhzPXsxMn0gY2xhc3NOYW1lPXtjbGFzc2VzLmxpc3RDb250YWluZXJ9PlxyXG4gICAgICAgICAge3RoaXMucmVuZGVyU2VsZWN0QWxsKCl9XHJcbiAgICAgICAgICB7dGhpcy5yZW5kZXJDaGVja2JveGVzKCl9XHJcbiAgICAgICAgPC9HcmlkPlxyXG4gICAgICA8L0dyaWQ+XHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5cclxuQ2hlY2tib3hMYWJlbFZhbHVlU2VsZWN0LnByb3BUeXBlcyA9IHtcclxuICBjaGVja2VkSWNvbjogUHJvcFR5cGVzLm9iamVjdCxcclxuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxyXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcclxuICBpY29uOiBQcm9wVHlwZXMub2JqZWN0LFxyXG4gIGxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nLFxyXG4gIGxpbWl0OiBQcm9wVHlwZXMuc2hhcGUoe1xyXG4gICAgbWF4OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXHJcbiAgICBkZWxldGVMYXN0OiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkXHJcbiAgfSksXHJcbiAgbGlzdEl0ZW1zOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKS5pc1JlcXVpcmVkLFxyXG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxyXG4gIHNlYXJjaEJhckxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nLFxyXG4gIHNlbGVjdEFsbExhYmVsOiBQcm9wVHlwZXMuc3RyaW5nLFxyXG4gIHNlbGVjdGVkSXRlbXM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zdHJpbmcpLFxyXG4gIHNlbGVjdGVkSXRlbXNGaXJzdDogUHJvcFR5cGVzLmJvb2wsXHJcbiAgc3RhdHVzQmFyOiBQcm9wVHlwZXMuYm9vbCxcclxufTtcclxuXHJcbkNoZWNrYm94TGFiZWxWYWx1ZVNlbGVjdC5kZWZhdWx0UHJvcHMgPSB7XHJcbiAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gIHNlbGVjdEFsbDogdHJ1ZSxcclxuICBzdGF0dXNCYXI6IGZhbHNlLFxyXG4gIHNlbGVjdGVkSXRlbXNGaXJzdDogZmFsc2UsXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCB3aXRoU3R5bGVzKERlZmF1bHRTdHlsZXMpKENoZWNrYm94TGFiZWxWYWx1ZVNlbGVjdCk7XHJcbiJdfQ==