matrix-react-sdk
Version:
SDK for matrix.org using React
307 lines (304 loc) • 51.2 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SpaceItem = exports.SpaceButton = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _react = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _types = require("matrix-js-sdk/src/types");
var _RoomAvatar = _interopRequireDefault(require("../avatars/RoomAvatar"));
var _SpaceStore = _interopRequireDefault(require("../../../stores/spaces/SpaceStore"));
var _SpaceTreeLevelLayoutStore = _interopRequireDefault(require("../../../stores/spaces/SpaceTreeLevelLayoutStore"));
var _NotificationBadge = _interopRequireDefault(require("../rooms/NotificationBadge"));
var _languageHandler = require("../../../languageHandler");
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _actions = require("../../../dispatcher/actions");
var _ContextMenuTooltipButton = require("../../../accessibility/context_menu/ContextMenuTooltipButton");
var _ContextMenu = require("../../structures/ContextMenu");
var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton"));
var _StaticNotificationState = require("../../../stores/notifications/StaticNotificationState");
var _NotificationLevel = require("../../../stores/notifications/NotificationLevel");
var _KeyBindingsManager = require("../../../KeyBindingsManager");
var _SpaceContextMenu = _interopRequireDefault(require("../context_menus/SpaceContextMenu"));
var _RovingTabIndex = require("../../../accessibility/RovingTabIndex");
var _KeyboardShortcuts = require("../../../accessibility/KeyboardShortcuts");
const _excluded = ["space", "spaceKey", "className", "selected", "label", "contextMenuTooltip", "notificationState", "size", "isNarrow", "children", "innerRef", "ContextMenuComponent"],
_excluded2 = ["space", "activeSpaces", "isNested", "isPanelCollapsed", "onExpand", "parents", "innerRef", "dragHandleProps"],
_excluded3 = ["tabIndex"];
/*
Copyright 2024 New Vector Ltd.
Copyright 2021-2023 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
const SpaceButton = _ref => {
let {
space,
spaceKey: _spaceKey,
className,
selected,
label,
contextMenuTooltip,
notificationState,
size,
isNarrow,
children,
innerRef,
ContextMenuComponent
} = _ref,
props = (0, _objectWithoutProperties2.default)(_ref, _excluded);
const [menuDisplayed, handle, openMenu, closeMenu] = (0, _ContextMenu.useContextMenu)(innerRef);
const [onFocus, isActive] = (0, _RovingTabIndex.useRovingTabIndex)(handle);
const tabIndex = isActive ? 0 : -1;
const spaceKey = _spaceKey ?? space?.roomId;
let avatar = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceButton_avatarPlaceholder"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceButton_icon"
}));
if (space) {
avatar = /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, {
size: size,
room: space,
type: "square"
});
}
let notifBadge;
if (spaceKey && notificationState) {
let ariaLabel = (0, _languageHandler._t)("a11y_jump_first_unread_room");
if (space?.getMyMembership() === _types.KnownMembership.Invite) {
ariaLabel = (0, _languageHandler._t)("a11y|jump_first_invite");
}
const jumpToNotification = ev => {
ev.stopPropagation();
ev.preventDefault();
_SpaceStore.default.instance.setActiveRoomInSpace(spaceKey);
};
notifBadge = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpacePanel_badgeContainer"
}, /*#__PURE__*/_react.default.createElement(_NotificationBadge.default, {
onClick: jumpToNotification,
notification: notificationState,
"aria-label": ariaLabel,
tabIndex: tabIndex,
showUnsentTooltip: true
}));
}
let contextMenu;
if (menuDisplayed && handle.current && ContextMenuComponent) {
contextMenu = /*#__PURE__*/_react.default.createElement(ContextMenuComponent, (0, _extends2.default)({}, (0, _ContextMenu.toRightOf)(handle.current.getBoundingClientRect(), 0), {
space: space,
onFinished: closeMenu
}));
}
const viewSpaceHome = () =>
// space is set here because of the assignment condition of onClick
_dispatcher.default.dispatch({
action: _actions.Action.ViewRoom,
room_id: space.roomId
});
const activateSpace = () => {
if (spaceKey) _SpaceStore.default.instance.setActiveSpace(spaceKey);
};
const onClick = props.onClick ?? (selected && space ? viewSpaceHome : activateSpace);
return /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, (0, _extends2.default)({}, props, {
className: (0, _classnames.default)("mx_SpaceButton", className, {
mx_SpaceButton_active: selected,
mx_SpaceButton_hasMenuOpen: menuDisplayed,
mx_SpaceButton_narrow: isNarrow
}),
"aria-label": label,
title: !isNarrow || menuDisplayed ? undefined : label,
onClick: onClick,
onContextMenu: openMenu,
ref: handle,
tabIndex: tabIndex,
onFocus: onFocus
}), children, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceButton_selectionWrapper"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceButton_avatarWrapper"
}, avatar, notifBadge), !isNarrow && /*#__PURE__*/_react.default.createElement("span", {
className: "mx_SpaceButton_name"
}, label), ContextMenuComponent && /*#__PURE__*/_react.default.createElement(_ContextMenuTooltipButton.ContextMenuTooltipButton, {
className: "mx_SpaceButton_menuButton",
onClick: openMenu,
title: contextMenuTooltip,
isExpanded: menuDisplayed
}), contextMenu));
};
exports.SpaceButton = SpaceButton;
class SpaceItem extends _react.default.PureComponent {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "buttonRef", /*#__PURE__*/(0, _react.createRef)());
(0, _defineProperty2.default)(this, "onSpaceUpdate", () => {
this.setState({
childSpaces: this.childSpaces
});
});
(0, _defineProperty2.default)(this, "onRoomNameChange", () => {
this.setState({
name: this.props.space.name
});
});
(0, _defineProperty2.default)(this, "toggleCollapse", evt => {
if (this.props.onExpand && this.isCollapsed) {
this.props.onExpand();
}
const newCollapsedState = !this.isCollapsed;
_SpaceTreeLevelLayoutStore.default.instance.setSpaceCollapsedState(this.props.space.roomId, this.props.parents, newCollapsedState);
this.setState({
collapsed: newCollapsedState
});
// don't bubble up so encapsulating button for space
// doesn't get triggered
evt.stopPropagation();
});
(0, _defineProperty2.default)(this, "onKeyDown", ev => {
let handled = true;
const action = (0, _KeyBindingsManager.getKeyBindingsManager)().getRoomListAction(ev);
const hasChildren = this.state.childSpaces?.length;
switch (action) {
case _KeyboardShortcuts.KeyBindingAction.CollapseRoomListSection:
if (hasChildren && !this.isCollapsed) {
this.toggleCollapse(ev);
} else {
const parentItem = this.buttonRef?.current?.parentElement?.parentElement;
const parentButton = parentItem?.previousElementSibling;
parentButton?.focus();
}
break;
case _KeyboardShortcuts.KeyBindingAction.ExpandRoomListSection:
if (hasChildren) {
if (this.isCollapsed) {
this.toggleCollapse(ev);
} else {
const childLevel = this.buttonRef?.current?.nextElementSibling;
const firstSpaceItemChild = childLevel?.querySelector(".mx_SpaceItem");
firstSpaceItemChild?.querySelector(".mx_SpaceButton")?.focus();
}
}
break;
default:
handled = false;
}
if (handled) {
ev.stopPropagation();
ev.preventDefault();
}
});
const collapsed = _SpaceTreeLevelLayoutStore.default.instance.getSpaceCollapsedState(props.space.roomId, this.props.parents, !props.isNested // default to collapsed for root items
);
this.state = {
name: this.props.space.name,
collapsed,
childSpaces: this.childSpaces
};
_SpaceStore.default.instance.on(this.props.space.roomId, this.onSpaceUpdate);
this.props.space.on(_matrix.RoomEvent.Name, this.onRoomNameChange);
}
componentWillUnmount() {
_SpaceStore.default.instance.off(this.props.space.roomId, this.onSpaceUpdate);
this.props.space.off(_matrix.RoomEvent.Name, this.onRoomNameChange);
}
get childSpaces() {
return _SpaceStore.default.instance.getChildSpaces(this.props.space.roomId).filter(s => !this.props.parents?.has(s.roomId));
}
get isCollapsed() {
return this.state.collapsed || !!this.props.isPanelCollapsed;
}
render() {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const _this$props = this.props,
{
space,
activeSpaces,
isNested,
isPanelCollapsed,
onExpand,
parents,
innerRef,
dragHandleProps
} = _this$props,
otherProps = (0, _objectWithoutProperties2.default)(_this$props, _excluded2);
const collapsed = this.isCollapsed;
const itemClasses = (0, _classnames.default)(this.props.className, {
mx_SpaceItem: true,
mx_SpaceItem_narrow: isPanelCollapsed,
collapsed: collapsed,
hasSubSpaces: this.state.childSpaces?.length
});
const isInvite = space.getMyMembership() === _types.KnownMembership.Invite;
const notificationState = isInvite ? _StaticNotificationState.StaticNotificationState.forSymbol("!", _NotificationLevel.NotificationLevel.Highlight) : _SpaceStore.default.instance.getNotificationState(space.roomId);
const hasChildren = this.state.childSpaces?.length;
let childItems;
if (hasChildren && !collapsed) {
childItems = /*#__PURE__*/_react.default.createElement(SpaceTreeLevel, {
spaces: this.state.childSpaces,
activeSpaces: activeSpaces,
isNested: true,
parents: new Set(parents).add(space.roomId)
});
}
const toggleCollapseButton = hasChildren ? /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_SpaceButton_toggleCollapse",
onClick: this.toggleCollapse,
tabIndex: -1,
"aria-label": collapsed ? (0, _languageHandler._t)("action|expand") : (0, _languageHandler._t)("action|collapse")
}) : null;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const _ref2 = dragHandleProps || {},
{
tabIndex
} = _ref2,
restDragHandleProps = (0, _objectWithoutProperties2.default)(_ref2, _excluded3);
const selected = activeSpaces.includes(space.roomId);
return /*#__PURE__*/_react.default.createElement("li", (0, _extends2.default)({}, otherProps, {
className: itemClasses,
ref: innerRef,
"aria-expanded": hasChildren ? !collapsed : undefined,
"aria-selected": selected,
role: "treeitem"
}), /*#__PURE__*/_react.default.createElement(SpaceButton, (0, _extends2.default)({}, restDragHandleProps, {
space: space,
className: isInvite ? "mx_SpaceButton_invite" : undefined,
selected: selected,
label: this.state.name,
contextMenuTooltip: (0, _languageHandler._t)("space|context_menu|options"),
notificationState: notificationState,
isNarrow: isPanelCollapsed,
size: isNested ? "24px" : "32px",
onKeyDown: this.onKeyDown,
ContextMenuComponent: this.props.space.getMyMembership() === _types.KnownMembership.Join ? _SpaceContextMenu.default : undefined
}), toggleCollapseButton), childItems);
}
}
exports.SpaceItem = SpaceItem;
const SpaceTreeLevel = ({
spaces,
activeSpaces,
isNested,
parents
}) => {
return /*#__PURE__*/_react.default.createElement("ul", {
className: "mx_SpaceTreeLevel",
role: "group"
}, spaces.map(s => {
return /*#__PURE__*/_react.default.createElement(SpaceItem, {
key: s.roomId,
activeSpaces: activeSpaces,
space: s,
isNested: isNested,
parents: parents
});
}));
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbWF0cml4IiwiX3R5cGVzIiwiX1Jvb21BdmF0YXIiLCJfU3BhY2VTdG9yZSIsIl9TcGFjZVRyZWVMZXZlbExheW91dFN0b3JlIiwiX05vdGlmaWNhdGlvbkJhZGdlIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9kaXNwYXRjaGVyIiwiX2FjdGlvbnMiLCJfQ29udGV4dE1lbnVUb29sdGlwQnV0dG9uIiwiX0NvbnRleHRNZW51IiwiX0FjY2Vzc2libGVCdXR0b24iLCJfU3RhdGljTm90aWZpY2F0aW9uU3RhdGUiLCJfTm90aWZpY2F0aW9uTGV2ZWwiLCJfS2V5QmluZGluZ3NNYW5hZ2VyIiwiX1NwYWNlQ29udGV4dE1lbnUiLCJfUm92aW5nVGFiSW5kZXgiLCJfS2V5Ym9hcmRTaG9ydGN1dHMiLCJfZXhjbHVkZWQiLCJfZXhjbHVkZWQyIiwiX2V4Y2x1ZGVkMyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIlNwYWNlQnV0dG9uIiwiX3JlZiIsInNwYWNlIiwic3BhY2VLZXkiLCJfc3BhY2VLZXkiLCJjbGFzc05hbWUiLCJzZWxlY3RlZCIsImxhYmVsIiwiY29udGV4dE1lbnVUb29sdGlwIiwibm90aWZpY2F0aW9uU3RhdGUiLCJzaXplIiwiaXNOYXJyb3ciLCJjaGlsZHJlbiIsImlubmVyUmVmIiwiQ29udGV4dE1lbnVDb21wb25lbnQiLCJwcm9wcyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllczIiLCJtZW51RGlzcGxheWVkIiwiaGFuZGxlIiwib3Blbk1lbnUiLCJjbG9zZU1lbnUiLCJ1c2VDb250ZXh0TWVudSIsIm9uRm9jdXMiLCJpc0FjdGl2ZSIsInVzZVJvdmluZ1RhYkluZGV4IiwidGFiSW5kZXgiLCJyb29tSWQiLCJhdmF0YXIiLCJjcmVhdGVFbGVtZW50Iiwicm9vbSIsInR5cGUiLCJub3RpZkJhZGdlIiwiYXJpYUxhYmVsIiwiX3QiLCJnZXRNeU1lbWJlcnNoaXAiLCJLbm93bk1lbWJlcnNoaXAiLCJJbnZpdGUiLCJqdW1wVG9Ob3RpZmljYXRpb24iLCJldiIsInN0b3BQcm9wYWdhdGlvbiIsInByZXZlbnREZWZhdWx0IiwiU3BhY2VTdG9yZSIsImluc3RhbmNlIiwic2V0QWN0aXZlUm9vbUluU3BhY2UiLCJvbkNsaWNrIiwibm90aWZpY2F0aW9uIiwic2hvd1Vuc2VudFRvb2x0aXAiLCJjb250ZXh0TWVudSIsImN1cnJlbnQiLCJfZXh0ZW5kczIiLCJ0b1JpZ2h0T2YiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJvbkZpbmlzaGVkIiwidmlld1NwYWNlSG9tZSIsImRlZmF1bHREaXNwYXRjaGVyIiwiZGlzcGF0Y2giLCJhY3Rpb24iLCJBY3Rpb24iLCJWaWV3Um9vbSIsInJvb21faWQiLCJhY3RpdmF0ZVNwYWNlIiwic2V0QWN0aXZlU3BhY2UiLCJjbGFzc05hbWVzIiwibXhfU3BhY2VCdXR0b25fYWN0aXZlIiwibXhfU3BhY2VCdXR0b25faGFzTWVudU9wZW4iLCJteF9TcGFjZUJ1dHRvbl9uYXJyb3ciLCJ0aXRsZSIsInVuZGVmaW5lZCIsIm9uQ29udGV4dE1lbnUiLCJyZWYiLCJDb250ZXh0TWVudVRvb2x0aXBCdXR0b24iLCJpc0V4cGFuZGVkIiwiZXhwb3J0cyIsIlNwYWNlSXRlbSIsIlJlYWN0IiwiUHVyZUNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwiX2RlZmluZVByb3BlcnR5MiIsImNyZWF0ZVJlZiIsInNldFN0YXRlIiwiY2hpbGRTcGFjZXMiLCJuYW1lIiwiZXZ0Iiwib25FeHBhbmQiLCJpc0NvbGxhcHNlZCIsIm5ld0NvbGxhcHNlZFN0YXRlIiwiU3BhY2VUcmVlTGV2ZWxMYXlvdXRTdG9yZSIsInNldFNwYWNlQ29sbGFwc2VkU3RhdGUiLCJwYXJlbnRzIiwiY29sbGFwc2VkIiwiaGFuZGxlZCIsImdldEtleUJpbmRpbmdzTWFuYWdlciIsImdldFJvb21MaXN0QWN0aW9uIiwiaGFzQ2hpbGRyZW4iLCJzdGF0ZSIsImxlbmd0aCIsIktleUJpbmRpbmdBY3Rpb24iLCJDb2xsYXBzZVJvb21MaXN0U2VjdGlvbiIsInRvZ2dsZUNvbGxhcHNlIiwicGFyZW50SXRlbSIsImJ1dHRvblJlZiIsInBhcmVudEVsZW1lbnQiLCJwYXJlbnRCdXR0b24iLCJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIiwiZm9jdXMiLCJFeHBhbmRSb29tTGlzdFNlY3Rpb24iLCJjaGlsZExldmVsIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwiZmlyc3RTcGFjZUl0ZW1DaGlsZCIsInF1ZXJ5U2VsZWN0b3IiLCJnZXRTcGFjZUNvbGxhcHNlZFN0YXRlIiwiaXNOZXN0ZWQiLCJvbiIsIm9uU3BhY2VVcGRhdGUiLCJSb29tRXZlbnQiLCJOYW1lIiwib25Sb29tTmFtZUNoYW5nZSIsImNvbXBvbmVudFdpbGxVbm1vdW50Iiwib2ZmIiwiZ2V0Q2hpbGRTcGFjZXMiLCJmaWx0ZXIiLCJzIiwiaXNQYW5lbENvbGxhcHNlZCIsInJlbmRlciIsIl90aGlzJHByb3BzIiwiYWN0aXZlU3BhY2VzIiwiZHJhZ0hhbmRsZVByb3BzIiwib3RoZXJQcm9wcyIsIml0ZW1DbGFzc2VzIiwibXhfU3BhY2VJdGVtIiwibXhfU3BhY2VJdGVtX25hcnJvdyIsImhhc1N1YlNwYWNlcyIsImlzSW52aXRlIiwiU3RhdGljTm90aWZpY2F0aW9uU3RhdGUiLCJmb3JTeW1ib2wiLCJOb3RpZmljYXRpb25MZXZlbCIsIkhpZ2hsaWdodCIsImdldE5vdGlmaWNhdGlvblN0YXRlIiwiY2hpbGRJdGVtcyIsIlNwYWNlVHJlZUxldmVsIiwic3BhY2VzIiwiU2V0IiwiYWRkIiwidG9nZ2xlQ29sbGFwc2VCdXR0b24iLCJfcmVmMiIsInJlc3REcmFnSGFuZGxlUHJvcHMiLCJpbmNsdWRlcyIsInJvbGUiLCJvbktleURvd24iLCJKb2luIiwiU3BhY2VDb250ZXh0TWVudSIsIm1hcCIsImtleSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3NwYWNlcy9TcGFjZVRyZWVMZXZlbC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjEtMjAyMyBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHtcbiAgICBNb3VzZUV2ZW50LFxuICAgIENvbXBvbmVudFByb3BzLFxuICAgIENvbXBvbmVudFR5cGUsXG4gICAgY3JlYXRlUmVmLFxuICAgIElucHV0SFRNTEF0dHJpYnV0ZXMsXG4gICAgTGVnYWN5UmVmLFxuICAgIFJlZk9iamVjdCxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuaW1wb3J0IHsgUm9vbSwgUm9vbUV2ZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgS25vd25NZW1iZXJzaGlwIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL3R5cGVzXCI7XG5pbXBvcnQgeyBEcmFnZ2FibGVQcm92aWRlZERyYWdIYW5kbGVQcm9wcyB9IGZyb20gXCJyZWFjdC1iZWF1dGlmdWwtZG5kXCI7XG5cbmltcG9ydCBSb29tQXZhdGFyIGZyb20gXCIuLi9hdmF0YXJzL1Jvb21BdmF0YXJcIjtcbmltcG9ydCBTcGFjZVN0b3JlIGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvc3BhY2VzL1NwYWNlU3RvcmVcIjtcbmltcG9ydCB7IFNwYWNlS2V5IH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9zcGFjZXNcIjtcbmltcG9ydCBTcGFjZVRyZWVMZXZlbExheW91dFN0b3JlIGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvc3BhY2VzL1NwYWNlVHJlZUxldmVsTGF5b3V0U3RvcmVcIjtcbmltcG9ydCBOb3RpZmljYXRpb25CYWRnZSBmcm9tIFwiLi4vcm9vbXMvTm90aWZpY2F0aW9uQmFkZ2VcIjtcbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IGRlZmF1bHREaXNwYXRjaGVyIGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2FjdGlvbnNcIjtcbmltcG9ydCB7IENvbnRleHRNZW51VG9vbHRpcEJ1dHRvbiB9IGZyb20gXCIuLi8uLi8uLi9hY2Nlc3NpYmlsaXR5L2NvbnRleHRfbWVudS9Db250ZXh0TWVudVRvb2x0aXBCdXR0b25cIjtcbmltcG9ydCB7IHRvUmlnaHRPZiwgdXNlQ29udGV4dE1lbnUgfSBmcm9tIFwiLi4vLi4vc3RydWN0dXJlcy9Db250ZXh0TWVudVwiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24sIHsgQnV0dG9uRXZlbnQgfSBmcm9tIFwiLi4vZWxlbWVudHMvQWNjZXNzaWJsZUJ1dHRvblwiO1xuaW1wb3J0IHsgU3RhdGljTm90aWZpY2F0aW9uU3RhdGUgfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL25vdGlmaWNhdGlvbnMvU3RhdGljTm90aWZpY2F0aW9uU3RhdGVcIjtcbmltcG9ydCB7IE5vdGlmaWNhdGlvbkxldmVsIH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9ub3RpZmljYXRpb25zL05vdGlmaWNhdGlvbkxldmVsXCI7XG5pbXBvcnQgeyBnZXRLZXlCaW5kaW5nc01hbmFnZXIgfSBmcm9tIFwiLi4vLi4vLi4vS2V5QmluZGluZ3NNYW5hZ2VyXCI7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25TdGF0ZSB9IGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvbm90aWZpY2F0aW9ucy9Ob3RpZmljYXRpb25TdGF0ZVwiO1xuaW1wb3J0IFNwYWNlQ29udGV4dE1lbnUgZnJvbSBcIi4uL2NvbnRleHRfbWVudXMvU3BhY2VDb250ZXh0TWVudVwiO1xuaW1wb3J0IHsgdXNlUm92aW5nVGFiSW5kZXggfSBmcm9tIFwiLi4vLi4vLi4vYWNjZXNzaWJpbGl0eS9Sb3ZpbmdUYWJJbmRleFwiO1xuaW1wb3J0IHsgS2V5QmluZGluZ0FjdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9hY2Nlc3NpYmlsaXR5L0tleWJvYXJkU2hvcnRjdXRzXCI7XG5cbnR5cGUgQnV0dG9uUHJvcHM8VCBleHRlbmRzIGtleW9mIEpTWC5JbnRyaW5zaWNFbGVtZW50cz4gPSBPbWl0PFxuICAgIENvbXBvbmVudFByb3BzPHR5cGVvZiBBY2Nlc3NpYmxlQnV0dG9uPFQ+PixcbiAgICBcInRpdGxlXCIgfCBcIm9uQ2xpY2tcIiB8IFwic2l6ZVwiIHwgXCJlbGVtZW50XCJcbj4gJiB7XG4gICAgc3BhY2U/OiBSb29tO1xuICAgIHNwYWNlS2V5PzogU3BhY2VLZXk7XG4gICAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICAgIHNlbGVjdGVkPzogYm9vbGVhbjtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGNvbnRleHRNZW51VG9vbHRpcD86IHN0cmluZztcbiAgICBub3RpZmljYXRpb25TdGF0ZT86IE5vdGlmaWNhdGlvblN0YXRlO1xuICAgIGlzTmFycm93PzogYm9vbGVhbjtcbiAgICBzaXplOiBzdHJpbmc7XG4gICAgaW5uZXJSZWY/OiBSZWZPYmplY3Q8SFRNTEVsZW1lbnQ+O1xuICAgIENvbnRleHRNZW51Q29tcG9uZW50PzogQ29tcG9uZW50VHlwZTxDb21wb25lbnRQcm9wczx0eXBlb2YgU3BhY2VDb250ZXh0TWVudT4+O1xuICAgIG9uQ2xpY2s/KGV2PzogQnV0dG9uRXZlbnQpOiB2b2lkO1xufTtcblxuZXhwb3J0IGNvbnN0IFNwYWNlQnV0dG9uID0gPFQgZXh0ZW5kcyBrZXlvZiBKU1guSW50cmluc2ljRWxlbWVudHM+KHtcbiAgICBzcGFjZSxcbiAgICBzcGFjZUtleTogX3NwYWNlS2V5LFxuICAgIGNsYXNzTmFtZSxcbiAgICBzZWxlY3RlZCxcbiAgICBsYWJlbCxcbiAgICBjb250ZXh0TWVudVRvb2x0aXAsXG4gICAgbm90aWZpY2F0aW9uU3RhdGUsXG4gICAgc2l6ZSxcbiAgICBpc05hcnJvdyxcbiAgICBjaGlsZHJlbixcbiAgICBpbm5lclJlZixcbiAgICBDb250ZXh0TWVudUNvbXBvbmVudCxcbiAgICAuLi5wcm9wc1xufTogQnV0dG9uUHJvcHM8VD4pOiBKU1guRWxlbWVudCA9PiB7XG4gICAgY29uc3QgW21lbnVEaXNwbGF5ZWQsIGhhbmRsZSwgb3Blbk1lbnUsIGNsb3NlTWVudV0gPSB1c2VDb250ZXh0TWVudTxIVE1MRWxlbWVudD4oaW5uZXJSZWYpO1xuICAgIGNvbnN0IFtvbkZvY3VzLCBpc0FjdGl2ZV0gPSB1c2VSb3ZpbmdUYWJJbmRleChoYW5kbGUpO1xuICAgIGNvbnN0IHRhYkluZGV4ID0gaXNBY3RpdmUgPyAwIDogLTE7XG5cbiAgICBjb25zdCBzcGFjZUtleSA9IF9zcGFjZUtleSA/PyBzcGFjZT8ucm9vbUlkO1xuXG4gICAgbGV0IGF2YXRhciA9IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9TcGFjZUJ1dHRvbl9hdmF0YXJQbGFjZWhvbGRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9TcGFjZUJ1dHRvbl9pY29uXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbiAgICBpZiAoc3BhY2UpIHtcbiAgICAgICAgYXZhdGFyID0gPFJvb21BdmF0YXIgc2l6ZT17c2l6ZX0gcm9vbT17c3BhY2V9IHR5cGU9XCJzcXVhcmVcIiAvPjtcbiAgICB9XG5cbiAgICBsZXQgbm90aWZCYWRnZTtcbiAgICBpZiAoc3BhY2VLZXkgJiYgbm90aWZpY2F0aW9uU3RhdGUpIHtcbiAgICAgICAgbGV0IGFyaWFMYWJlbCA9IF90KFwiYTExeV9qdW1wX2ZpcnN0X3VucmVhZF9yb29tXCIpO1xuICAgICAgICBpZiAoc3BhY2U/LmdldE15TWVtYmVyc2hpcCgpID09PSBLbm93bk1lbWJlcnNoaXAuSW52aXRlKSB7XG4gICAgICAgICAgICBhcmlhTGFiZWwgPSBfdChcImExMXl8anVtcF9maXJzdF9pbnZpdGVcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBqdW1wVG9Ob3RpZmljYXRpb24gPSAoZXY6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIFNwYWNlU3RvcmUuaW5zdGFuY2Uuc2V0QWN0aXZlUm9vbUluU3BhY2Uoc3BhY2VLZXkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIG5vdGlmQmFkZ2UgPSAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1NwYWNlUGFuZWxfYmFkZ2VDb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8Tm90aWZpY2F0aW9uQmFkZ2VcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17anVtcFRvTm90aWZpY2F0aW9ufVxuICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb249e25vdGlmaWNhdGlvblN0YXRlfVxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXthcmlhTGFiZWx9XG4gICAgICAgICAgICAgICAgICAgIHRhYkluZGV4PXt0YWJJbmRleH1cbiAgICAgICAgICAgICAgICAgICAgc2hvd1Vuc2VudFRvb2x0aXA9e3RydWV9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cblxuICAgIGxldCBjb250ZXh0TWVudTogSlNYLkVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgaWYgKG1lbnVEaXNwbGF5ZWQgJiYgaGFuZGxlLmN1cnJlbnQgJiYgQ29udGV4dE1lbnVDb21wb25lbnQpIHtcbiAgICAgICAgY29udGV4dE1lbnUgPSAoXG4gICAgICAgICAgICA8Q29udGV4dE1lbnVDb21wb25lbnRcbiAgICAgICAgICAgICAgICB7Li4udG9SaWdodE9mKGhhbmRsZS5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCAwKX1cbiAgICAgICAgICAgICAgICBzcGFjZT17c3BhY2V9XG4gICAgICAgICAgICAgICAgb25GaW5pc2hlZD17Y2xvc2VNZW51fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB2aWV3U3BhY2VIb21lID0gKCk6IHZvaWQgPT5cbiAgICAgICAgLy8gc3BhY2UgaXMgc2V0IGhlcmUgYmVjYXVzZSBvZiB0aGUgYXNzaWdubWVudCBjb25kaXRpb24gb2Ygb25DbGlja1xuICAgICAgICBkZWZhdWx0RGlzcGF0Y2hlci5kaXNwYXRjaCh7IGFjdGlvbjogQWN0aW9uLlZpZXdSb29tLCByb29tX2lkOiBzcGFjZSEucm9vbUlkIH0pO1xuICAgIGNvbnN0IGFjdGl2YXRlU3BhY2UgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzcGFjZUtleSkgU3BhY2VTdG9yZS5pbnN0YW5jZS5zZXRBY3RpdmVTcGFjZShzcGFjZUtleSk7XG4gICAgfTtcbiAgICBjb25zdCBvbkNsaWNrID0gcHJvcHMub25DbGljayA/PyAoc2VsZWN0ZWQgJiYgc3BhY2UgPyB2aWV3U3BhY2VIb21lIDogYWN0aXZhdGVTcGFjZSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvblxuICAgICAgICAgICAgey4uLnByb3BzfVxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFwibXhfU3BhY2VCdXR0b25cIiwgY2xhc3NOYW1lLCB7XG4gICAgICAgICAgICAgICAgbXhfU3BhY2VCdXR0b25fYWN0aXZlOiBzZWxlY3RlZCxcbiAgICAgICAgICAgICAgICBteF9TcGFjZUJ1dHRvbl9oYXNNZW51T3BlbjogbWVudURpc3BsYXllZCxcbiAgICAgICAgICAgICAgICBteF9TcGFjZUJ1dHRvbl9uYXJyb3c6IGlzTmFycm93LFxuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPXtsYWJlbH1cbiAgICAgICAgICAgIHRpdGxlPXshaXNOYXJyb3cgfHwgbWVudURpc3BsYXllZCA/IHVuZGVmaW5lZCA6IGxhYmVsfVxuICAgICAgICAgICAgb25DbGljaz17b25DbGlja31cbiAgICAgICAgICAgIG9uQ29udGV4dE1lbnU9e29wZW5NZW51fVxuICAgICAgICAgICAgcmVmPXtoYW5kbGV9XG4gICAgICAgICAgICB0YWJJbmRleD17dGFiSW5kZXh9XG4gICAgICAgICAgICBvbkZvY3VzPXtvbkZvY3VzfVxuICAgICAgICA+XG4gICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1NwYWNlQnV0dG9uX3NlbGVjdGlvbldyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1NwYWNlQnV0dG9uX2F2YXRhcldyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAge2F2YXRhcn1cbiAgICAgICAgICAgICAgICAgICAge25vdGlmQmFkZ2V9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgeyFpc05hcnJvdyAmJiA8c3BhbiBjbGFzc05hbWU9XCJteF9TcGFjZUJ1dHRvbl9uYW1lXCI+e2xhYmVsfTwvc3Bhbj59XG5cbiAgICAgICAgICAgICAgICB7Q29udGV4dE1lbnVDb21wb25lbnQgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8Q29udGV4dE1lbnVUb29sdGlwQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9TcGFjZUJ1dHRvbl9tZW51QnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29wZW5NZW51fVxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9e2NvbnRleHRNZW51VG9vbHRpcH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRXhwYW5kZWQ9e21lbnVEaXNwbGF5ZWR9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgICAgIHtjb250ZXh0TWVudX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4gICAgKTtcbn07XG5cbmludGVyZmFjZSBJSXRlbVByb3BzIGV4dGVuZHMgSW5wdXRIVE1MQXR0cmlidXRlczxIVE1MTElFbGVtZW50PiB7XG4gICAgc3BhY2U6IFJvb207XG4gICAgYWN0aXZlU3BhY2VzOiBTcGFjZUtleVtdO1xuICAgIGlzTmVzdGVkPzogYm9vbGVhbjtcbiAgICBpc1BhbmVsQ29sbGFwc2VkPzogYm9vbGVhbjtcbiAgICBvbkV4cGFuZD86IEZ1bmN0aW9uO1xuICAgIHBhcmVudHM/OiBTZXQ8c3RyaW5nPjtcbiAgICBpbm5lclJlZj86IExlZ2FjeVJlZjxIVE1MTElFbGVtZW50PjtcbiAgICBkcmFnSGFuZGxlUHJvcHM/OiBEcmFnZ2FibGVQcm92aWRlZERyYWdIYW5kbGVQcm9wcyB8IG51bGw7XG59XG5cbmludGVyZmFjZSBJSXRlbVN0YXRlIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgY29sbGFwc2VkOiBib29sZWFuO1xuICAgIGNoaWxkU3BhY2VzOiBSb29tW107XG59XG5cbmV4cG9ydCBjbGFzcyBTcGFjZUl0ZW0gZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50PElJdGVtUHJvcHMsIElJdGVtU3RhdGU+IHtcbiAgICBwcml2YXRlIGJ1dHRvblJlZiA9IGNyZWF0ZVJlZjxIVE1MRGl2RWxlbWVudD4oKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogSUl0ZW1Qcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgY29uc3QgY29sbGFwc2VkID0gU3BhY2VUcmVlTGV2ZWxMYXlvdXRTdG9yZS5pbnN0YW5jZS5nZXRTcGFjZUNvbGxhcHNlZFN0YXRlKFxuICAgICAgICAgICAgcHJvcHMuc3BhY2Uucm9vbUlkLFxuICAgICAgICAgICAgdGhpcy5wcm9wcy5wYXJlbnRzLFxuICAgICAgICAgICAgIXByb3BzLmlzTmVzdGVkLCAvLyBkZWZhdWx0IHRvIGNvbGxhcHNlZCBmb3Igcm9vdCBpdGVtc1xuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLnByb3BzLnNwYWNlLm5hbWUsXG4gICAgICAgICAgICBjb2xsYXBzZWQsXG4gICAgICAgICAgICBjaGlsZFNwYWNlczogdGhpcy5jaGlsZFNwYWNlcyxcbiAgICAgICAgfTtcblxuICAgICAgICBTcGFjZVN0b3JlLmluc3RhbmNlLm9uKHRoaXMucHJvcHMuc3BhY2Uucm9vbUlkLCB0aGlzLm9uU3BhY2VVcGRhdGUpO1xuICAgICAgICB0aGlzLnByb3BzLnNwYWNlLm9uKFJvb21FdmVudC5OYW1lLCB0aGlzLm9uUm9vbU5hbWVDaGFuZ2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21wb25lbnRXaWxsVW5tb3VudCgpOiB2b2lkIHtcbiAgICAgICAgU3BhY2VTdG9yZS5pbnN0YW5jZS5vZmYodGhpcy5wcm9wcy5zcGFjZS5yb29tSWQsIHRoaXMub25TcGFjZVVwZGF0ZSk7XG4gICAgICAgIHRoaXMucHJvcHMuc3BhY2Uub2ZmKFJvb21FdmVudC5OYW1lLCB0aGlzLm9uUm9vbU5hbWVDaGFuZ2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25TcGFjZVVwZGF0ZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBjaGlsZFNwYWNlczogdGhpcy5jaGlsZFNwYWNlcyxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25Sb29tTmFtZUNoYW5nZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLnByb3BzLnNwYWNlLm5hbWUsXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGdldCBjaGlsZFNwYWNlcygpOiBSb29tW10ge1xuICAgICAgICByZXR1cm4gU3BhY2VTdG9yZS5pbnN0YW5jZVxuICAgICAgICAgICAgLmdldENoaWxkU3BhY2VzKHRoaXMucHJvcHMuc3BhY2Uucm9vbUlkKVxuICAgICAgICAgICAgLmZpbHRlcigocykgPT4gIXRoaXMucHJvcHMucGFyZW50cz8uaGFzKHMucm9vbUlkKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgaXNDb2xsYXBzZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmNvbGxhcHNlZCB8fCAhIXRoaXMucHJvcHMuaXNQYW5lbENvbGxhcHNlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZUNvbGxhcHNlID0gKGV2dDogQnV0dG9uRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25FeHBhbmQgJiYgdGhpcy5pc0NvbGxhcHNlZCkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkV4cGFuZCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0NvbGxhcHNlZFN0YXRlID0gIXRoaXMuaXNDb2xsYXBzZWQ7XG5cbiAgICAgICAgU3BhY2VUcmVlTGV2ZWxMYXlvdXRTdG9yZS5pbnN0YW5jZS5zZXRTcGFjZUNvbGxhcHNlZFN0YXRlKFxuICAgICAgICAgICAgdGhpcy5wcm9wcy5zcGFjZS5yb29tSWQsXG4gICAgICAgICAgICB0aGlzLnByb3BzLnBhcmVudHMsXG4gICAgICAgICAgICBuZXdDb2xsYXBzZWRTdGF0ZSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGNvbGxhcHNlZDogbmV3Q29sbGFwc2VkU3RhdGUgfSk7XG4gICAgICAgIC8vIGRvbid0IGJ1YmJsZSB1cCBzbyBlbmNhcHN1bGF0aW5nIGJ1dHRvbiBmb3Igc3BhY2VcbiAgICAgICAgLy8gZG9lc24ndCBnZXQgdHJpZ2dlcmVkXG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbktleURvd24gPSAoZXY6IFJlYWN0LktleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgbGV0IGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBhY3Rpb24gPSBnZXRLZXlCaW5kaW5nc01hbmFnZXIoKS5nZXRSb29tTGlzdEFjdGlvbihldik7XG4gICAgICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gdGhpcy5zdGF0ZS5jaGlsZFNwYWNlcz8ubGVuZ3RoO1xuICAgICAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgICAgICAgY2FzZSBLZXlCaW5kaW5nQWN0aW9uLkNvbGxhcHNlUm9vbUxpc3RTZWN0aW9uOlxuICAgICAgICAgICAgICAgIGlmIChoYXNDaGlsZHJlbiAmJiAhdGhpcy5pc0NvbGxhcHNlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUNvbGxhcHNlKGV2KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJdGVtID0gdGhpcy5idXR0b25SZWY/LmN1cnJlbnQ/LnBhcmVudEVsZW1lbnQ/LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEJ1dHRvbiA9IHBhcmVudEl0ZW0/LnByZXZpb3VzRWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEJ1dHRvbj8uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgS2V5QmluZGluZ0FjdGlvbi5FeHBhbmRSb29tTGlzdFNlY3Rpb246XG4gICAgICAgICAgICAgICAgaWYgKGhhc0NoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUNvbGxhcHNlKGV2KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTGV2ZWwgPSB0aGlzLmJ1dHRvblJlZj8uY3VycmVudD8ubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RTcGFjZUl0ZW1DaGlsZCA9IGNoaWxkTGV2ZWw/LnF1ZXJ5U2VsZWN0b3I8SFRNTExJRWxlbWVudD4oXCIubXhfU3BhY2VJdGVtXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RTcGFjZUl0ZW1DaGlsZD8ucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oXCIubXhfU3BhY2VCdXR0b25cIik/LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhbmRsZWQpIHtcbiAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgc3BhY2UsXG4gICAgICAgICAgICBhY3RpdmVTcGFjZXMsXG4gICAgICAgICAgICBpc05lc3RlZCxcbiAgICAgICAgICAgIGlzUGFuZWxDb2xsYXBzZWQsXG4gICAgICAgICAgICBvbkV4cGFuZCxcbiAgICAgICAgICAgIHBhcmVudHMsXG4gICAgICAgICAgICBpbm5lclJlZixcbiAgICAgICAgICAgIGRyYWdIYW5kbGVQcm9wcyxcbiAgICAgICAgICAgIC4uLm90aGVyUHJvcHNcbiAgICAgICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgICAgY29uc3QgY29sbGFwc2VkID0gdGhpcy5pc0NvbGxhcHNlZDtcblxuICAgICAgICBjb25zdCBpdGVtQ2xhc3NlcyA9IGNsYXNzTmFtZXModGhpcy5wcm9wcy5jbGFzc05hbWUsIHtcbiAgICAgICAgICAgIG14X1NwYWNlSXRlbTogdHJ1ZSxcbiAgICAgICAgICAgIG14X1NwYWNlSXRlbV9uYXJyb3c6IGlzUGFuZWxDb2xsYXBzZWQsXG4gICAgICAgICAgICBjb2xsYXBzZWQ6IGNvbGxhcHNlZCxcbiAgICAgICAgICAgIGhhc1N1YlNwYWNlczogdGhpcy5zdGF0ZS5jaGlsZFNwYWNlcz8ubGVuZ3RoLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBpc0ludml0ZSA9IHNwYWNlLmdldE15TWVtYmVyc2hpcCgpID09PSBLbm93bk1lbWJlcnNoaXAuSW52aXRlO1xuXG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvblN0YXRlID0gaXNJbnZpdGVcbiAgICAgICAgICAgID8gU3RhdGljTm90aWZpY2F0aW9uU3RhdGUuZm9yU3ltYm9sKFwiIVwiLCBOb3RpZmljYXRpb25MZXZlbC5IaWdobGlnaHQpXG4gICAgICAgICAgICA6IFNwYWNlU3RvcmUuaW5zdGFuY2UuZ2V0Tm90aWZpY2F0aW9uU3RhdGUoc3BhY2Uucm9vbUlkKTtcblxuICAgICAgICBjb25zdCBoYXNDaGlsZHJlbiA9IHRoaXMuc3RhdGUuY2hpbGRTcGFjZXM/Lmxlbmd0aDtcblxuICAgICAgICBsZXQgY2hpbGRJdGVtcztcbiAgICAgICAgaWYgKGhhc0NoaWxkcmVuICYmICFjb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIGNoaWxkSXRlbXMgPSAoXG4gICAgICAgICAgICAgICAgPFNwYWNlVHJlZUxldmVsXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlcz17dGhpcy5zdGF0ZS5jaGlsZFNwYWNlc31cbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlU3BhY2VzPXthY3RpdmVTcGFjZXN9XG4gICAgICAgICAgICAgICAgICAgIGlzTmVzdGVkPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRzPXtuZXcgU2V0KHBhcmVudHMpLmFkZChzcGFjZS5yb29tSWQpfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG9nZ2xlQ29sbGFwc2VCdXR0b24gPSBoYXNDaGlsZHJlbiA/IChcbiAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfU3BhY2VCdXR0b25fdG9nZ2xlQ29sbGFwc2VcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMudG9nZ2xlQ29sbGFwc2V9XG4gICAgICAgICAgICAgICAgdGFiSW5kZXg9ey0xfVxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e2NvbGxhcHNlZCA/IF90KFwiYWN0aW9ufGV4cGFuZFwiKSA6IF90KFwiYWN0aW9ufGNvbGxhcHNlXCIpfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgKSA6IG51bGw7XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICBjb25zdCB7IHRhYkluZGV4LCAuLi5yZXN0RHJhZ0hhbmRsZVByb3BzIH0gPSBkcmFnSGFuZGxlUHJvcHMgfHwge307XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gYWN0aXZlU3BhY2VzLmluY2x1ZGVzKHNwYWNlLnJvb21JZCk7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgIHsuLi5vdGhlclByb3BzfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17aXRlbUNsYXNzZXN9XG4gICAgICAgICAgICAgICAgcmVmPXtpbm5lclJlZn1cbiAgICAgICAgICAgICAgICBhcmlhLWV4cGFuZGVkPXtoYXNDaGlsZHJlbiA/ICFjb2xsYXBzZWQgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgYXJpYS1zZWxlY3RlZD17c2VsZWN0ZWR9XG4gICAgICAgICAgICAgICAgcm9sZT1cInRyZWVpdGVtXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8U3BhY2VCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgey4uLnJlc3REcmFnSGFuZGxlUHJvcHN9XG4gICAgICAgICAgICAgICAgICAgIHNwYWNlPXtzcGFjZX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtpc0ludml0ZSA/IFwibXhfU3BhY2VCdXR0b25faW52aXRlXCIgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkPXtzZWxlY3RlZH1cbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9e3RoaXMuc3RhdGUubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgY29udGV4dE1lbnVUb29sdGlwPXtfdChcInNwYWNlfGNvbnRleHRfbWVudXxvcHRpb25zXCIpfVxuICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25TdGF0ZT17bm90aWZpY2F0aW9uU3RhdGV9XG4gICAgICAgICAgICAgICAgICAgIGlzTmFycm93PXtpc1BhbmVsQ29sbGFwc2VkfVxuICAgICAgICAgICAgICAgICAgICBzaXplPXtpc05lc3RlZCA/IFwiMjRweFwiIDogXCIzMnB4XCJ9XG4gICAgICAgICAgICAgICAgICAgIG9uS2V5RG93bj17dGhpcy5vbktleURvd259XG4gICAgICAgICAgICAgICAgICAgIENvbnRleHRNZW51Q29tcG9uZW50PXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMuc3BhY2UuZ2V0TXlNZW1iZXJzaGlwKCkgPT09IEtub3duTWVtYmVyc2hpcC5Kb2luID8gU3BhY2VDb250ZXh0TWVudSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7dG9nZ2xlQ29sbGFwc2VCdXR0b259XG4gICAgICAgICAgICAgICAgPC9TcGFjZUJ1dHRvbj5cblxuICAgICAgICAgICAgICAgIHtjaGlsZEl0ZW1zfVxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmludGVyZmFjZSBJVHJlZUxldmVsUHJvcHMge1xuICAgIHNwYWNlczogUm9vbVtdO1xuICAgIGFjdGl2ZVNwYWNlczogU3BhY2VLZXlbXTtcbiAgICBpc05lc3RlZD86IGJvb2xlYW47XG4gICAgcGFyZW50czogU2V0PHN0cmluZz47XG59XG5cbmNvbnN0IFNwYWNlVHJlZUxldmVsOiBSZWFjdC5GQzxJVHJlZUxldmVsUHJvcHM+ID0gKHsgc3BhY2VzLCBhY3RpdmVTcGFjZXMsIGlzTmVzdGVkLCBwYXJlbnRzIH0pID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgICA8dWwgY2xhc3NOYW1lPVwibXhfU3BhY2VUcmVlTGV2ZWxcIiByb2xlPVwiZ3JvdXBcIj5cbiAgICAgICAgICAgIHtzcGFjZXMubWFwKChzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPFNwYWNlSXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtzLnJvb21JZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNwYWNlcz17YWN0aXZlU3BhY2VzfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2U9e3N9XG4gICAgICAgICAgICAgICAgICAgICAgICBpc05lc3RlZD17aXNOZXN0ZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRzPXtwYXJlbnRzfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KX1cbiAgICAgICAgPC91bD5cbiAgICApO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQVFBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQVNBLElBQUFDLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQUdBLElBQUFLLFdBQUEsR0FBQUgsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFNLFdBQUEsR0FBQUosc0JBQUEsQ0FBQUYsT0FBQTtBQUVBLElBQUFPLDBCQUFBLEdBQUFMLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUSxrQkFBQSxHQUFBTixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVMsZ0JBQUEsR0FBQVQsT0FBQTtBQUNBLElBQUFVLFdBQUEsR0FBQVIsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFXLFFBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLHlCQUFBLEdBQUFaLE9BQUE7QUFDQSxJQUFBYSxZQUFBLEdBQUFiLE9BQUE7QUFDQSxJQUFBYyxpQkFBQSxHQUFBWixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQWUsd0JBQUEsR0FBQWYsT0FBQTtBQUNBLElBQUFnQixrQkFBQSxHQUFBaEIsT0FBQTtBQUNBLElBQUFpQixtQkFBQSxHQUFBakIsT0FBQTtBQUVBLElBQUFrQixpQkFBQSxHQUFBaEIsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFtQixlQUFBLEdBQUFuQixPQUFB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