UNPKG

tc-ui-toolkit

Version:

React components used to develop tools for the desktop app translationCore

446 lines (388 loc) 46.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; 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 _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _styles = require("@material-ui/core/styles"); var _List = _interopRequireDefault(require("@material-ui/core/List")); var _RootRef = _interopRequireDefault(require("@material-ui/core/RootRef")); var _memoizeOne = _interopRequireDefault(require("memoize-one")); var _MenuItem = _interopRequireDefault(require("./MenuItem")); var _MenuGroup = _interopRequireDefault(require("./MenuGroup")); var _EmptyItem = _interopRequireDefault(require("./EmptyItem")); 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 { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } var theme = (0, _styles.createMuiTheme)({ typography: { fontFamily: ['"Noto Sans"', 'Roboto', 'Arial'].join(','), fontSize: 12 }, props: { MuiButtonBase: { disableRipple: true } }, overrides: { MuiListItem: { root: { paddingTop: 6, paddingBottom: 6, minHeight: 40 }, gutters: { paddingLeft: 10, paddingRight: 5 } }, MuiSvgIcon: { root: { fontSize: 22 } }, MuiListItemText: { root: { paddingLeft: 5 }, inset: { paddingLeft: '32px!important' } }, MuiListItemIcon: { root: { marginRight: 5 } }, MuiChip: { root: { margin: 2, height: 26 }, label: { paddingLeft: 8, paddingRight: 8 }, deleteIcon: { marginRight: 2 } }, MuiListSubheader: { root: { lineHeight: 'inherit' } } } }); var styles = function styles() { return { root: { overflowY: 'scroll', color: '#FFFFFF', backgroundColor: '#333333' }, header: { borderBottom: 'solid #ffffff4d 1px' }, text: { color: '#FFFFFF', fontSize: 'inherit' } }; }; /** * Displays a list of grouped menu items * @param {[]} entries - an array of menu entries * @param {object} [active=null] - the active menu item object * @param {object[]} [statusIcons=[]] - an array of status configurations to control menu item icons * @param {*} [header=null] - a component to display as the menu header * @param {*} [height="auto"] - the height of the menu * @param {*} [width=250] - the width of the menu * @param {boolean} [autoSelect=true] - controls whether or not opening a group will automatically select the first child * @param {boolean} [autoScroll=true] - controls whether or not the menu will automatically scroll to the active item * @param {string} [emptyNotice=""] - an optional message to display when the menu is empty */ var Menu = /*#__PURE__*/function (_React$Component) { (0, _inherits2["default"])(Menu, _React$Component); var _super = _createSuper(Menu); function Menu(props) { var _this; (0, _classCallCheck2["default"])(this, Menu); _this = _super.call(this, props); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "menuRef", /*#__PURE__*/_react["default"].createRef()); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "selectedGroupRef", /*#__PURE__*/_react["default"].createRef()); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "selectedItemRef", /*#__PURE__*/_react["default"].createRef()); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "scrollToSelectedGroup", function () { var instant = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; _this.scrollIntoView(_this.selectedGroupRef, instant); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "scrollToSelectedItem", function () { var instant = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; _this.scrollIntoView(_this.selectedItemRef, instant); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "scrollIntoView", function (ref) { var instant = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; if (ref && ref.scrollIntoView && !_this.isRefInView(ref)) { ref.scrollIntoView({ block: 'center', behavior: instant ? 'instant' : 'smooth' }); } }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "isRefInView", function (ref) { if (ref && ref.getBoundingClientRect && _this.menuRef && _this.menuRef.current && _this.menuRef.current.getBoundingClientRect) { var rect = ref.getBoundingClientRect(); var menuRect = _this.menuRef.current.getBoundingClientRect(); return rect.top >= menuRect.top && rect.bottom <= menuRect.bottom; } else { return false; } }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "normalizeStatusIcons", (0, _memoizeOne["default"])(function (statusIcons) { var normalized = []; for (var i = 0, len = statusIcons.length; i < len; i++) { var icon = Object.assign({}, { value: true }, statusIcons[i]); normalized.push(icon); } return normalized; })); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleOpen", function (group) { return function () { var autoSelect = _this.props.autoSelect; var groupId = _this.getGroupIdForGroup(group); if (_this.state.opened === groupId) { _this.setState({ opened: -1 }); } else { _this.setState({ opened: groupId }); // auto select newly opened groups if not controlled elsewhere var firstChild = group.children[0]; if (autoSelect && firstChild && !_this.isGroupSelected(group)) { _this.handleClick(firstChild)(); } } }; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleClick", function (item) { return function () { var _this$props = _this.props, onItemClick = _this$props.onItemClick, active = _this$props.active; if (typeof onItemClick === 'function') { onItemClick(item); } // skip internal state if managed externally. if (!active) { _this.setState({ active: item }); } }; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "isGroupOpen", function (group) { return _this.state.opened === _this.getGroupIdForGroup(group); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "isGroupSelected", function (group) { var active = _this.getActive(); var selected = active && (group.organizeByRef && group.organizeByRef === active.organizeByRef || group.id === active.groupId); return selected; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "isItemSelected", function (item) { var activeItem = _this.getActive(); var groupId = item.groupId, itemId = item.itemId; var selected = activeItem && activeItem.groupId === groupId && activeItem.itemId === itemId; return selected; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getActive", function () { return _this.props.active ? _this.props.active : _this.state.active; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleGroupRef", function (group) { return function (ref) { if (_this.isGroupSelected(group)) { _this.selectedGroupRef = ref; } }; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleItemRef", function (item) { return function (ref) { if (_this.isItemSelected(item)) { _this.selectedItemRef = ref; } }; }); var autoOpen = null; // TRICKY: start with the controlled group open var _active = props.active, _autoSelect = props.autoSelect; if (_active && _autoSelect) { autoOpen = _this.getGroupIdForItem(_active); } _this.state = { opened: autoOpen, active: null }; return _this; } /** * if organizeByRef is set, used it. Otherwise we use the groupId * @param item * @return {string|*} */ (0, _createClass2["default"])(Menu, [{ key: "getGroupIdForItem", value: function getGroupIdForItem(item) { return (item === null || item === void 0 ? void 0 : item.organizeByRef) || (item === null || item === void 0 ? void 0 : item.groupId); } /** * if organizeByRef is set, used it. Otherwise we use the Id * @param group * @return {string|*} */ }, { key: "getGroupIdForGroup", value: function getGroupIdForGroup(group) { return (group === null || group === void 0 ? void 0 : group.organizeByRef) || (group === null || group === void 0 ? void 0 : group.id); } }, { key: "componentDidMount", value: function componentDidMount() { var opened = this.state.opened; var autoScroll = this.props.autoScroll; // scroll to the selection if (autoScroll && opened) { this.scrollToSelectedItem(); } else if (autoScroll) { this.scrollToSelectedGroup(); } } /** * * @param prevProps * @param prevState * @param nextContent */ // eslint-disable-next-line no-unused-vars }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps, prevState, nextContent) { var opened = this.state.opened; var autoScroll = this.props.autoScroll; var prevActive = prevProps.active ? prevProps.active : prevState.active; var active = this.getActive(); var activeGroupId = this.getGroupIdForItem(active); if (active && prevActive && this.getGroupIdForItem(prevActive) !== activeGroupId && activeGroupId !== opened) { // open the active group if it was changed externally this.setState({ opened: activeGroupId }); } else if (autoScroll && this.state.opened) { // scroll to the current selection this.scrollToSelectedItem(); } } /** * Scrolls the selected group into view * @param {boolean} [instant=true] - makes the scroll execute instantly. */ }, { key: "render", value: function render() { var _this2 = this; var _this$props2 = this.props, classes = _this$props2.classes, header = _this$props2.header, height = _this$props2.height, width = _this$props2.width, entries = _this$props2.entries, statusIcons = _this$props2.statusIcons, emptyNotice = _this$props2.emptyNotice, targetLanguageFont = _this$props2.targetLanguageFont; var normalizedStatusIcons = this.normalizeStatusIcons(statusIcons); return /*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, { theme: theme }, /*#__PURE__*/_react["default"].createElement(_RootRef["default"], { rootRef: this.menuRef }, /*#__PURE__*/_react["default"].createElement(_List["default"], { component: "nav", subheader: header, className: classes.root, style: { height: height, width: width, minWidth: width } }, entries.map(function (group, index) { return /*#__PURE__*/_react["default"].createElement(_RootRef["default"], { key: index, rootRef: _this2.handleGroupRef(group) }, /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_MenuGroup["default"], { selected: _this2.isGroupSelected(group), onClick: _this2.handleOpen(group), progress: group.progress, open: _this2.isGroupOpen(group), label: group.title }), _this2.isGroupOpen(group) ? /*#__PURE__*/_react["default"].createElement(_List["default"], { component: "div", disablePadding: true }, group.children.map(function (item, index) { return /*#__PURE__*/_react["default"].createElement(_RootRef["default"], { key: index, rootRef: _this2.handleItemRef(item) }, /*#__PURE__*/_react["default"].createElement(_MenuItem["default"], { status: item, selected: _this2.isItemSelected(item), statusIcons: normalizedStatusIcons, onClick: _this2.handleClick(item), tooltip: item.tooltip ? item.tooltip : item.title, title: item.title, targetLanguageFont: targetLanguageFont, direction: item.direction })); })) : null)); }), /*#__PURE__*/_react["default"].createElement(_EmptyItem["default"], { key: "empty", label: emptyNotice, enabled: entries.length === 0 })))); } }]); return Menu; }(_react["default"].Component); Menu.propTypes = { classes: _propTypes["default"].object.isRequired, entries: _propTypes["default"].array, active: _propTypes["default"].object, header: _propTypes["default"].element, height: _propTypes["default"].any, onItemClick: _propTypes["default"].func, width: _propTypes["default"].number, statusIcons: _propTypes["default"].array, emptyNotice: _propTypes["default"].string, autoSelect: _propTypes["default"].bool, autoScroll: _propTypes["default"].bool, targetLanguageFont: _propTypes["default"].string }; Menu.defaultProps = { active: null, height: 'auto', entries: [], width: 250, emptyNotice: '', autoSelect: true, autoScroll: true, statusIcons: [] }; Menu.muiName = 'List'; var _default = (0, _styles.withStyles)(styles)(Menu); exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9Hcm91cGVkTWVudS9NZW51L2luZGV4LmpzIl0sIm5hbWVzIjpbInRoZW1lIiwidHlwb2dyYXBoeSIsImZvbnRGYW1pbHkiLCJqb2luIiwiZm9udFNpemUiLCJwcm9wcyIsIk11aUJ1dHRvbkJhc2UiLCJkaXNhYmxlUmlwcGxlIiwib3ZlcnJpZGVzIiwiTXVpTGlzdEl0ZW0iLCJyb290IiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iLCJtaW5IZWlnaHQiLCJndXR0ZXJzIiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiLCJNdWlTdmdJY29uIiwiTXVpTGlzdEl0ZW1UZXh0IiwiaW5zZXQiLCJNdWlMaXN0SXRlbUljb24iLCJtYXJnaW5SaWdodCIsIk11aUNoaXAiLCJtYXJnaW4iLCJoZWlnaHQiLCJsYWJlbCIsImRlbGV0ZUljb24iLCJNdWlMaXN0U3ViaGVhZGVyIiwibGluZUhlaWdodCIsInN0eWxlcyIsIm92ZXJmbG93WSIsImNvbG9yIiwiYmFja2dyb3VuZENvbG9yIiwiaGVhZGVyIiwiYm9yZGVyQm90dG9tIiwidGV4dCIsIk1lbnUiLCJSZWFjdCIsImNyZWF0ZVJlZiIsImluc3RhbnQiLCJzY3JvbGxJbnRvVmlldyIsInNlbGVjdGVkR3JvdXBSZWYiLCJzZWxlY3RlZEl0ZW1SZWYiLCJyZWYiLCJpc1JlZkluVmlldyIsImJsb2NrIiwiYmVoYXZpb3IiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJtZW51UmVmIiwiY3VycmVudCIsInJlY3QiLCJtZW51UmVjdCIsInRvcCIsImJvdHRvbSIsInN0YXR1c0ljb25zIiwibm9ybWFsaXplZCIsImkiLCJsZW4iLCJsZW5ndGgiLCJpY29uIiwiT2JqZWN0IiwiYXNzaWduIiwidmFsdWUiLCJwdXNoIiwiZ3JvdXAiLCJhdXRvU2VsZWN0IiwiZ3JvdXBJZCIsImdldEdyb3VwSWRGb3JHcm91cCIsInN0YXRlIiwib3BlbmVkIiwic2V0U3RhdGUiLCJmaXJzdENoaWxkIiwiY2hpbGRyZW4iLCJpc0dyb3VwU2VsZWN0ZWQiLCJoYW5kbGVDbGljayIsIml0ZW0iLCJvbkl0ZW1DbGljayIsImFjdGl2ZSIsImdldEFjdGl2ZSIsInNlbGVjdGVkIiwib3JnYW5pemVCeVJlZiIsImlkIiwiYWN0aXZlSXRlbSIsIml0ZW1JZCIsImlzSXRlbVNlbGVjdGVkIiwiYXV0b09wZW4iLCJnZXRHcm91cElkRm9ySXRlbSIsImF1dG9TY3JvbGwiLCJzY3JvbGxUb1NlbGVjdGVkSXRlbSIsInNjcm9sbFRvU2VsZWN0ZWRHcm91cCIsInByZXZQcm9wcyIsInByZXZTdGF0ZSIsIm5leHRDb250ZW50IiwicHJldkFjdGl2ZSIsImFjdGl2ZUdyb3VwSWQiLCJjbGFzc2VzIiwid2lkdGgiLCJlbnRyaWVzIiwiZW1wdHlOb3RpY2UiLCJ0YXJnZXRMYW5ndWFnZUZvbnQiLCJub3JtYWxpemVkU3RhdHVzSWNvbnMiLCJub3JtYWxpemVTdGF0dXNJY29ucyIsIm1pbldpZHRoIiwibWFwIiwiaW5kZXgiLCJoYW5kbGVHcm91cFJlZiIsImhhbmRsZU9wZW4iLCJwcm9ncmVzcyIsImlzR3JvdXBPcGVuIiwidGl0bGUiLCJoYW5kbGVJdGVtUmVmIiwidG9vbHRpcCIsImRpcmVjdGlvbiIsIkNvbXBvbmVudCIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsIm9iamVjdCIsImlzUmVxdWlyZWQiLCJhcnJheSIsImVsZW1lbnQiLCJhbnkiLCJmdW5jIiwibnVtYmVyIiwic3RyaW5nIiwiYm9vbCIsImRlZmF1bHRQcm9wcyIsIm11aU5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBS0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7OztBQUVBLElBQU1BLEtBQUssR0FBRyw0QkFBZTtBQUMzQkMsRUFBQUEsVUFBVSxFQUFFO0FBQ1ZDLElBQUFBLFVBQVUsRUFBRSxDQUNWLGFBRFUsRUFFVixRQUZVLEVBR1YsT0FIVSxFQUlWQyxJQUpVLENBSUwsR0FK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cm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge1xuICB3aXRoU3R5bGVzLFxuICBjcmVhdGVNdWlUaGVtZSxcbiAgVGhlbWVQcm92aWRlciBhcyBNdWlUaGVtZVByb3ZpZGVyLFxufSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9zdHlsZXMnO1xuaW1wb3J0IExpc3QgZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvTGlzdCc7XG5pbXBvcnQgUm9vdFJlZiBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9Sb290UmVmJztcbmltcG9ydCBtZW1vaXplIGZyb20gJ21lbW9pemUtb25lJztcbmltcG9ydCBNZW51SXRlbSBmcm9tICcuL01lbnVJdGVtJztcbmltcG9ydCBNZW51R3JvdXAgZnJvbSAnLi9NZW51R3JvdXAnO1xuaW1wb3J0IEVtcHR5SXRlbSBmcm9tICcuL0VtcHR5SXRlbSc7XG5cbmNvbnN0IHRoZW1lID0gY3JlYXRlTXVpVGhlbWUoe1xuICB0eXBvZ3JhcGh5OiB7XG4gICAgZm9udEZhbWlseTogW1xuICAgICAgJ1wiTm90byBTYW5zXCInLFxuICAgICAgJ1JvYm90bycsXG4gICAgICAnQXJpYWwnLFxuICAgIF0uam9pbignLCcpLFxuICAgIGZvbnRTaXplOiAxMixcbiAgfSxcbiAgcHJvcHM6IHsgTXVpQnV0dG9uQmFzZTogeyBkaXNhYmxlUmlwcGxlOiB0cnVlIH0gfSxcbiAgb3ZlcnJpZGVzOiB7XG4gICAgTXVpTGlzdEl0ZW06IHtcbiAgICAgIHJvb3Q6IHtcbiAgICAgICAgcGFkZGluZ1RvcDogNixcbiAgICAgICAgcGFkZGluZ0JvdHRvbTogNixcbiAgICAgICAgbWluSGVpZ2h0OiA0MCxcbiAgICAgIH0sXG4gICAgICBndXR0ZXJzOiB7XG4gICAgICAgIHBhZGRpbmdMZWZ0OiAxMCxcbiAgICAgICAgcGFkZGluZ1JpZ2h0OiA1LFxuICAgICAgfSxcbiAgICB9LFxuICAgIE11aVN2Z0ljb246IHsgcm9vdDogeyBmb250U2l6ZTogMjIgfSB9LFxuICAgIE11aUxpc3RJdGVtVGV4dDoge1xuICAgICAgcm9vdDogeyBwYWRkaW5nTGVmdDogNSB9LFxuICAgICAgaW5zZXQ6IHsgcGFkZGluZ0xlZnQ6ICczMnB4IWltcG9ydGFudCcgfSxcbiAgICB9LFxuICAgIE11aUxpc3RJdGVtSWNvbjogeyByb290OiB7IG1hcmdpblJpZ2h0OiA1IH0gfSxcbiAgICBNdWlDaGlwOiB7XG4gICAgICByb290OiB7XG4gICAgICAgIG1hcmdpbjogMixcbiAgICAgICAgaGVpZ2h0OiAyNixcbiAgICAgIH0sXG4gICAgICBsYWJlbDoge1xuICAgICAgICBwYWRkaW5nTGVmdDogOCxcbiAgICAgICAgcGFkZGluZ1JpZ2h0OiA4LFxuICAgICAgfSxcbiAgICAgIGRlbGV0ZUljb246IHsgbWFyZ2luUmlnaHQ6IDIgfSxcbiAgICB9LFxuICAgIE11aUxpc3RTdWJoZWFkZXI6IHsgcm9vdDogeyBsaW5lSGVpZ2h0OiAnaW5oZXJpdCcgfSB9LFxuICB9LFxufSk7XG5cbmNvbnN0IHN0eWxlcyA9ICgpID0+ICh7XG4gIHJvb3Q6IHtcbiAgICBvdmVyZmxvd1k6ICdzY3JvbGwnLFxuICAgIGNvbG9yOiAnI0ZGRkZGRicsXG4gICAgYmFja2dyb3VuZENvbG9yOiAnIzMzMzMzMycsXG4gIH0sXG4gIGhlYWRlcjogeyBib3JkZXJCb3R0b206ICdzb2xpZCAjZmZmZmZmNGQgMXB4JyB9LFxuICB0ZXh0OiB7XG4gICAgY29sb3I6ICcjRkZGRkZGJyxcbiAgICBmb250U2l6ZTogJ2luaGVyaXQnLFxuICB9LFxufSk7XG5cbi8qKlxuICogRGlzcGxheXMgYSBsaXN0IG9mIGdyb3VwZWQgbWVudSBpdGVtc1xuICogQHBhcmFtIHtbXX0gZW50cmllcyAtIGFuIGFycmF5IG9mIG1lbnUgZW50cmllc1xuICogQHBhcmFtIHtvYmplY3R9IFthY3RpdmU9bnVsbF0gLSB0aGUgYWN0aXZlIG1lbnUgaXRlbSBvYmplY3RcbiAqIEBwYXJhbSB7b2JqZWN0W119IFtzdGF0dXNJY29ucz1bXV0gLSBhbiBhcnJheSBvZiBzdGF0dXMgY29uZmlndXJhdGlvbnMgdG8gY29udHJvbCBtZW51IGl0ZW0gaWNvbnNcbiAqIEBwYXJhbSB7Kn0gW2hlYWRlcj1udWxsXSAtIGEgY29tcG9uZW50IHRvIGRpc3BsYXkgYXMgdGhlIG1lbnUgaGVhZGVyXG4gKiBAcGFyYW0geyp9IFtoZWlnaHQ9XCJhdXRvXCJdIC0gdGhlIGhlaWdodCBvZiB0aGUgbWVudVxuICogQHBhcmFtIHsqfSBbd2lkdGg9MjUwXSAtIHRoZSB3aWR0aCBvZiB0aGUgbWVudVxuICogQHBhcmFtIHtib29sZWFufSBbYXV0b1NlbGVjdD10cnVlXSAtIGNvbnRyb2xzIHdoZXRoZXIgb3Igbm90IG9wZW5pbmcgYSBncm91cCB3aWxsIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZSBmaXJzdCBjaGlsZFxuICogQHBhcmFtIHtib29sZWFufSBbYXV0b1Njcm9sbD10cnVlXSAtIGNvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSBtZW51IHdpbGwgYXV0b21hdGljYWxseSBzY3JvbGwgdG8gdGhlIGFjdGl2ZSBpdGVtXG4gKiBAcGFyYW0ge3N0cmluZ30gW2VtcHR5Tm90aWNlPVwiXCJdIC0gYW4gb3B0aW9uYWwgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdGhlIG1lbnUgaXMgZW1wdHlcbiAqL1xuY2xhc3MgTWVudSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIG1lbnVSZWYgPSBSZWFjdC5jcmVhdGVSZWYoKTtcbiAgc2VsZWN0ZWRHcm91cFJlZiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuICBzZWxlY3RlZEl0ZW1SZWYgPSBSZWFjdC5jcmVhdGVSZWYoKTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICBsZXQgYXV0b09wZW4gPSBudWxsO1xuXG4gICAgLy8gVFJJQ0tZOiBzdGFydCB3aXRoIHRoZSBjb250cm9sbGVkIGdyb3VwIG9wZW5cbiAgICBjb25zdCB7IGFjdGl2ZSwgYXV0b1NlbGVjdCB9ID0gcHJvcHM7XG5cbiAgICBpZiAoYWN0aXZlICYmIGF1dG9TZWxlY3QpIHtcbiAgICAgIGF1dG9PcGVuID0gdGhpcy5nZXRHcm91cElkRm9ySXRlbShhY3RpdmUpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBvcGVuZWQ6IGF1dG9PcGVuLFxuICAgICAgYWN0aXZlOiBudWxsLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogaWYgb3JnYW5pemVCeVJlZiBpcyBzZXQsIHVzZWQgaXQuICBPdGhlcndpc2Ugd2UgdXNlIHRoZSBncm91cElkXG4gICAqIEBwYXJhbSBpdGVtXG4gICAqIEByZXR1cm4ge3N0cmluZ3wqfVxuICAgKi9cbiAgZ2V0R3JvdXBJZEZvckl0ZW0oaXRlbSkge1xuICAgIHJldHVybiBpdGVtPy5vcmdhbml6ZUJ5UmVmIHx8IGl0ZW0/Lmdyb3VwSWQ7XG4gIH1cblxuICAvKipcbiAgICogaWYgb3JnYW5pemVCeVJlZiBpcyBzZXQsIHVzZWQgaXQuICBPdGhlcndpc2Ugd2UgdXNlIHRoZSBJZFxuICAgKiBAcGFyYW0gZ3JvdXBcbiAgICogQHJldHVybiB7c3RyaW5nfCp9XG4gICAqL1xuICBnZXRHcm91cElkRm9yR3JvdXAoZ3JvdXApIHtcbiAgICByZXR1cm4gZ3JvdXA/Lm9yZ2FuaXplQnlSZWYgfHwgZ3JvdXA/LmlkO1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgY29uc3QgeyBvcGVuZWQgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgeyBhdXRvU2Nyb2xsIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgLy8gc2Nyb2xsIHRvIHRoZSBzZWxlY3Rpb25cbiAgICBpZiAoYXV0b1Njcm9sbCAmJiBvcGVuZWQpIHtcbiAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZEl0ZW0oKTtcbiAgICB9IGVsc2UgaWYgKGF1dG9TY3JvbGwpIHtcbiAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZEdyb3VwKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBwcmV2UHJvcHNcbiAgICogQHBhcmFtIHByZXZTdGF0ZVxuICAgKiBAcGFyYW0gbmV4dENvbnRlbnRcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIG5leHRDb250ZW50KSB7XG4gICAgY29uc3QgeyBvcGVuZWQgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgeyBhdXRvU2Nyb2xsIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHByZXZBY3RpdmUgPSBwcmV2UHJvcHMuYWN0aXZlID8gcHJldlByb3BzLmFjdGl2ZSA6IHByZXZTdGF0ZS5hY3RpdmU7XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5nZXRBY3RpdmUoKTtcbiAgICBjb25zdCBhY3RpdmVHcm91cElkID0gdGhpcy5nZXRHcm91cElkRm9ySXRlbShhY3RpdmUpO1xuXG4gICAgaWYgKFxuICAgICAgYWN0aXZlICYmXG4gICAgICBwcmV2QWN0aXZlICYmXG4gICAgICB0aGlzLmdldEdyb3VwSWRGb3JJdGVtKHByZXZBY3RpdmUpICE9PSBhY3RpdmVHcm91cElkICYmXG4gICAgICBhY3RpdmVHcm91cElkICE9PSBvcGVuZWRcbiAgICApIHtcbiAgICAgIC8vIG9wZW4gdGhlIGFjdGl2ZSBncm91cCBpZiBpdCB3YXMgY2hhbmdlZCBleHRlcm5hbGx5XG4gICAgICB0aGlzLnNldFN0YXRlKHsgb3BlbmVkOiBhY3RpdmVHcm91cElkIH0pO1xuICAgIH0gZWxzZSBpZiAoYXV0b1Njcm9sbCAmJiB0aGlzLnN0YXRlLm9wZW5lZCkge1xuICAgICAgLy8gc2Nyb2xsIHRvIHRoZSBjdXJyZW50IHNlbGVjdGlvblxuICAgICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkSXRlbSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGxzIHRoZSBzZWxlY3RlZCBncm91cCBpbnRvIHZpZXdcbiAgICogQHBhcmFtIHtib29sZWFufSBbaW5zdGFudD10cnVlXSAtIG1ha2VzIHRoZSBzY3JvbGwgZXhlY3V0ZSBpbnN0YW50bHkuXG4gICAqL1xuICBzY3JvbGxUb1NlbGVjdGVkR3JvdXAgPSAoaW5zdGFudCA9IHRydWUpID0+IHtcbiAgICB0aGlzLnNjcm9sbEludG9WaWV3KHRoaXMuc2VsZWN0ZWRHcm91cFJlZiwgaW5zdGFudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgdGhlIHNlbGVjdGVkIGl0ZW0gaW50byB2aWV3XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luc3RhbnQ9dHJ1ZV0gLSBtYWtlcyB0aGUgc2Nyb2xsIGV4ZWN1dGUgaW5zdGFudGx5LlxuICAgKi9cbiAgc2Nyb2xsVG9TZWxlY3RlZEl0ZW0gPSAoaW5zdGFudCA9IHRydWUpID0+IHtcbiAgICB0aGlzLnNjcm9sbEludG9WaWV3KHRoaXMuc2VsZWN0ZWRJdGVtUmVmLCBpbnN0YW50KTtcbiAgfTtcblxuICAvKipcbiAgICogU2Nyb2xscyBhIHJlZiBpbnRvIHZpZXdcbiAgICogQHBhcmFtIHJlZlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbnN0YW50PXRydWVdIC0gbWFrZXMgdGhlIHNjcm9sbCBleGVjdXRlIGluc3RhbnRseVxuICAgKi9cbiAgc2Nyb2xsSW50b1ZpZXcgPSAocmVmLCBpbnN0YW50ID0gdHJ1ZSkgPT4ge1xuICAgIGlmIChcbiAgICAgIHJlZiAmJlxuICAgICAgcmVmLnNjcm9sbEludG9WaWV3ICYmXG4gICAgICAhdGhpcy5pc1JlZkluVmlldyhyZWYpXG4gICAgKSB7XG4gICAgICByZWYuc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgICBibG9jazogJ2NlbnRlcicsXG4gICAgICAgIGJlaGF2aW9yOiBpbnN0YW50ID8gJ2luc3RhbnQnIDogJ3Ntb290aCcsXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGRvbSByZWN0IGlzIHdpdGhpbiBhbm90aGVyXG4gICAqIEBwYXJhbSByZWYgLSBhIHJlYWN0IHJlZlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzUmVmSW5WaWV3ID0gKHJlZikgPT4ge1xuICAgIGlmIChyZWYgJiYgcmVmLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAmJiB0aGlzLm1lbnVSZWYgJiZcbiAgICAgIHRoaXMubWVudVJlZi5jdXJyZW50ICYmIHRoaXMubWVudVJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xuICAgICAgY29uc3QgcmVjdCA9IHJlZi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IG1lbnVSZWN0ID0gdGhpcy5tZW51UmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICByZXR1cm4gcmVjdC50b3AgPj0gbWVudVJlY3QudG9wICYmIHJlY3QuYm90dG9tIDw9IG1lbnVSZWN0LmJvdHRvbTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQXBwbGllcyBkZWZhdWx0IGtleSB2YWx1ZXMgdG8gdGhlIHN0YXR1cyBpY29ucy5cbiAgICogVGhpcyBwcmVwYXJlcyBzdGF0dXMgaWNvbnMgZm9yIHVzZSBpbiB0aGUgbWVudS5cbiAgICogQHBhcmFtIHtvYmplY3RbXX0gc3RhdHVzSWNvbnMgLSBhbiBhcnJheSBvZiBzdGF0dXMgaWNvbiBvYmplY3RzXG4gICAqIEByZXR1cm5zIHtvYmplY3RbXX0gLSBhbiBhcnJheSBvZiBub3JtYWxpemVkIHN0YXR1cyBpY29uIG9iamVjdHMuXG4gICAqL1xuICBub3JtYWxpemVTdGF0dXNJY29ucyA9IG1lbW9pemUoc3RhdHVzSWNvbnMgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzdGF0dXNJY29ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgaWNvbiA9IE9iamVjdC5hc3NpZ24oe30sIHsgdmFsdWU6IHRydWUgfSwgc3RhdHVzSWNvbnNbaV0pO1xuICAgICAgbm9ybWFsaXplZC5wdXNoKGljb24pO1xuICAgIH1cbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgb3BlbmluZyBhIGdyb3VwIHdpdGhpbiB0aGUgbWVudS5cbiAgICogSWYgYXV0byBzZWxlY3RlZCBpcyBlbmFibGVkIHRoaXMgd2lsbCBhbHNvIHNlbGVjdCB0aGUgZmlyc3QgY2hpbGRcbiAgICogQHBhcmFtIHtvYmplY3R9IGdyb3VwIC0gdGhlIGdyb3VwIGJlaW5nIG9wZW5lZFxuICAgKi9cbiAgaGFuZGxlT3BlbiA9IGdyb3VwID0+ICgpID0+IHtcbiAgICBjb25zdCB7IGF1dG9TZWxlY3QgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgZ3JvdXBJZCA9IHRoaXMuZ2V0R3JvdXBJZEZvckdyb3VwKGdyb3VwKTtcblxuICAgIGlmICh0aGlzLnN0YXRlLm9wZW5lZCA9PT0gZ3JvdXBJZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW5lZDogLTEgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBvcGVuZWQ6IGdyb3VwSWQgfSk7XG5cbiAgICAgIC8vIGF1dG8gc2VsZWN0IG5ld2x5IG9wZW5lZCBncm91cHMgaWYgbm90IGNvbnRyb2xsZWQgZWxzZXdoZXJlXG4gICAgICBjb25zdCBmaXJzdENoaWxkID0gZ3JvdXAuY2hpbGRyZW5bMF07XG5cbiAgICAgIGlmIChhdXRvU2VsZWN0ICYmIGZpcnN0Q2hpbGQgJiYgIXRoaXMuaXNHcm91cFNlbGVjdGVkKGdyb3VwKSkge1xuICAgICAgICB0aGlzLmhhbmRsZUNsaWNrKGZpcnN0Q2hpbGQpKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGVzIG1lbnUgaXRlbSBjbGlja3MuXG4gICAqIElmIHRoZSBhY3RpdmUgbWVudSBpdGVtIGlzIGNvbnRyb2xsZWQgZXh0ZXJuYWxseSB0aGlzIHdpbGwgZGVmZXIgY29udHJvbCB0byB0aGUgcGFyZW50XG4gICAqIG90aGVyd2lzZSBtZW51IHNlbGVjdGlvbnMgd2lsbCBiZSBtYW5hZ2VkIGludGVybmFsbHkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpdGVtIC0gdGhlIGNsaWNrZWQgbWVudSBpdGVtIG9iamVjdFxuICAgKi9cbiAgaGFuZGxlQ2xpY2sgPSBpdGVtID0+ICgpID0+IHtcbiAgICBjb25zdCB7IG9uSXRlbUNsaWNrLCBhY3RpdmUgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBpZiAodHlwZW9mIG9uSXRlbUNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvbkl0ZW1DbGljayhpdGVtKTtcbiAgICB9XG5cbiAgICAvLyBza2lwIGludGVybmFsIHN0YXRlIGlmIG1hbmFnZWQgZXh0ZXJuYWxseS5cbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGFjdGl2ZTogaXRlbSB9KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGdyb3VwIGlzIG9wZW5lZFxuICAgKiBAcGFyYW0ge29iamVjdH0gZ3JvdXAgLSB0aGUgbWVudSBncm91cFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzR3JvdXBPcGVuID0gZ3JvdXAgPT4gdGhpcy5zdGF0ZS5vcGVuZWQgPT09IHRoaXMuZ2V0R3JvdXBJZEZvckdyb3VwKGdyb3VwKTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgZ3JvdXAgaXMgc2VsZWN0ZWRcbiAgICogQHBhcmFtIHtvYmplY3R9IGdyb3VwIC0gdGhlIG1lbnUgZ3JvdXBcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0dyb3VwU2VsZWN0ZWQgPSBncm91cCA9PiB7XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5nZXRBY3RpdmUoKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkID0gYWN0aXZlICYmIChcbiAgICAgIChncm91cC5vcmdhbml6ZUJ5UmVmICYmIGdyb3VwLm9yZ2FuaXplQnlSZWYgPT09IGFjdGl2ZS5vcmdhbml6ZUJ5UmVmKVxuICAgICAgfHwgKGdyb3VwLmlkID09PSBhY3RpdmUuZ3JvdXBJZClcbiAgICApO1xuICAgIHJldHVybiBzZWxlY3RlZDtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgbWVudSBpdGVtIGlzIHNlbGVjdGVkXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpdGVtIC0gdGhlIG1lbnUgaXRlbVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzSXRlbVNlbGVjdGVkID0gaXRlbSA9PiB7XG4gICAgY29uc3QgYWN0aXZlSXRlbSA9IHRoaXMuZ2V0QWN0aXZlKCk7XG4gICAgY29uc3Qge1xuICAgICAgZ3JvdXBJZCxcbiAgICAgIGl0ZW1JZCxcbiAgICB9ID0gaXRlbTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IGFjdGl2ZUl0ZW0gJiZcbiAgICAgIGFjdGl2ZUl0ZW0uZ3JvdXBJZCA9PT0gZ3JvdXBJZCAmJlxuICAgICAgYWN0aXZlSXRlbS5pdGVtSWQgPT09IGl0ZW1JZDtcbiAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFjdGl2ZSBjb250ZXh0LlxuICAgKiBJZiB0aGUgYWN0aXZlIGl0ZW0gaXMgY29udHJvbGxlZCBleHRlcm5hbGx5IGl0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fG51bGx9XG4gICAqL1xuICBnZXRBY3RpdmUgPSAoKSA9PiB0aGlzLnByb3BzLmFjdGl2ZSA/IHRoaXMucHJvcHMuYWN0aXZlIDogdGhpcy5zdGF0ZS5hY3RpdmU7XG5cbiAgLyoqXG4gICAqIENvbGxlY3RzIHRoZSByZWFjdCByZWYgdG8gdGhlIGdyb3VwLlxuICAgKiBUaGlzIGRldGVybWluZXMgaWYgdGhlIGdyb3VwIGlzIHNlbGVjdGVkIGFuZCBzdG9yZXMgaXRzIHJlZlxuICAgKiBAcGFyYW0ge29iamVjdH0gZ3JvdXAgLSB0aGUgbWVudSBncm91cFxuICAgKi9cbiAgaGFuZGxlR3JvdXBSZWYgPSBncm91cCA9PiByZWYgPT4ge1xuICAgIGlmICh0aGlzLmlzR3JvdXBTZWxlY3RlZChncm91cCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRHcm91cFJlZiA9IHJlZjtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbGxlY3RzIHRoZSByZWFjdCByZWYgdG8gdGhlIGl0ZW0uXG4gICAqIFRoaXMgZGV0ZXJtaW5lcyBpZiB0aGUgbWVudSBpdGVtIGlzIHNlbGVjdGVkIGFuZCBzdG9yZXMgaXQncyByZWZcbiAgICogQHBhcmFtIHtvYmplY3R9IGl0ZW0gLSB0aGUgbWVudSBpdGVtXG4gICAqL1xuICBoYW5kbGVJdGVtUmVmID0gaXRlbSA9PiByZWYgPT4ge1xuICAgIGlmICh0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbVJlZiA9IHJlZjtcbiAgICB9XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNsYXNzZXMsXG4gICAgICBoZWFkZXIsXG4gICAgICBoZWlnaHQsXG4gICAgICB3aWR0aCxcbiAgICAgIGVudHJpZXMsXG4gICAgICBzdGF0dXNJY29ucyxcbiAgICAgIGVtcHR5Tm90aWNlLFxuICAgICAgdGFyZ2V0TGFuZ3VhZ2VGb250LFxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTdGF0dXNJY29ucyA9IHRoaXMubm9ybWFsaXplU3RhdHVzSWNvbnMoc3RhdHVzSWNvbnMpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxNdWlUaGVtZVByb3ZpZGVyIHRoZW1lPXt0aGVtZX0+XG4gICAgICAgIDxSb290UmVmIHJvb3RSZWY9e3RoaXMubWVudVJlZn0+XG4gICAgICAgICAgPExpc3RcbiAgICAgICAgICAgIGNvbXBvbmVudD1cIm5hdlwiXG4gICAgICAgICAgICBzdWJoZWFkZXI9e2hlYWRlcn1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5yb290fVxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgaGVpZ2h0LCB3aWR0aCwgbWluV2lkdGg6IHdpZHRoLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7ZW50cmllcy5tYXAoKGdyb3VwLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICA8Um9vdFJlZiBrZXk9e2luZGV4fSByb290UmVmPXt0aGlzLmhhbmRsZUdyb3VwUmVmKGdyb3VwKX0+XG4gICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAgPE1lbnVHcm91cFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZD17dGhpcy5pc0dyb3VwU2VsZWN0ZWQoZ3JvdXApfVxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZU9wZW4oZ3JvdXApfVxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcz17Z3JvdXAucHJvZ3Jlc3N9XG4gICAgICAgICAgICAgICAgICAgIG9wZW49e3RoaXMuaXNHcm91cE9wZW4oZ3JvdXApfVxuICAgICAgICAgICAgICAgICAgICBsYWJlbD17Z3JvdXAudGl0bGV9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAge3RoaXMuaXNHcm91cE9wZW4oZ3JvdXApID8gKFxuICAgICAgICAgICAgICAgICAgICA8TGlzdCBjb21wb25lbnQ9XCJkaXZcIiBkaXNhYmxlUGFkZGluZz5cbiAgICAgICAgICAgICAgICAgICAgICB7Z3JvdXAuY2hpbGRyZW4ubWFwKChpdGVtLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFJvb3RSZWYga2V5PXtpbmRleH0gcm9vdFJlZj17dGhpcy5oYW5kbGVJdGVtUmVmKGl0ZW0pfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPE1lbnVJdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzPXtpdGVtfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkPXt0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0ljb25zPXtub3JtYWxpemVkU3RhdHVzSWNvbnN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVDbGljayhpdGVtKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwPXtpdGVtLnRvb2x0aXAgPyBpdGVtLnRvb2x0aXAgOiBpdGVtLnRpdGxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXtpdGVtLnRpdGxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldExhbmd1YWdlRm9udD17dGFyZ2V0TGFuZ3VhZ2VGb250fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbj17aXRlbS5kaXJlY3Rpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1Jvb3RSZWY+XG4gICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgIDwvTGlzdD5cbiAgICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgICAgIDwvUm9vdFJlZj5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPEVtcHR5SXRlbSBrZXk9XCJlbXB0eVwiIGxhYmVsPXtlbXB0eU5vdGljZX1cbiAgICAgICAgICAgICAgZW5hYmxlZD17ZW50cmllcy5sZW5ndGggPT09IDB9Lz5cbiAgICAgICAgICA8L0xpc3Q+XG4gICAgICAgIDwvUm9vdFJlZj5cbiAgICAgIDwvTXVpVGhlbWVQcm92aWRlcj5cbiAgICApO1xuICB9XG59XG5cbk1lbnUucHJvcFR5cGVzID0ge1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIGVudHJpZXM6IFByb3BUeXBlcy5hcnJheSxcbiAgYWN0aXZlOiBQcm9wVHlwZXMub2JqZWN0LFxuICBoZWFkZXI6IFByb3BUeXBlcy5lbGVtZW50LFxuICBoZWlnaHQ6IFByb3BUeXBlcy5hbnksXG4gIG9uSXRlbUNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcbiAgd2lkdGg6IFByb3BUeXBlcy5udW1iZXIsXG4gIHN0YXR1c0ljb25zOiBQcm9wVHlwZXMuYXJyYXksXG4gIGVtcHR5Tm90aWNlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBhdXRvU2VsZWN0OiBQcm9wVHlwZXMuYm9vbCxcbiAgYXV0b1Njcm9sbDogUHJvcFR5cGVzLmJvb2wsXG4gIHRhcmdldExhbmd1YWdlRm9udDogUHJvcFR5cGVzLnN0cmluZyxcbn07XG5cbk1lbnUuZGVmYXVsdFByb3BzID0ge1xuICBhY3RpdmU6IG51bGwsXG4gIGhlaWdodDogJ2F1dG8nLFxuICBlbnRyaWVzOiBbXSxcbiAgd2lkdGg6IDI1MCxcbiAgZW1wdHlOb3RpY2U6ICcnLFxuICBhdXRvU2VsZWN0OiB0cnVlLFxuICBhdXRvU2Nyb2xsOiB0cnVlLFxuICBzdGF0dXNJY29uczogW10sXG59O1xuXG5NZW51Lm11aU5hbWUgPSAnTGlzdCc7XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzKShNZW51KTtcbiJdfQ==