UNPKG

matrix-react-sdk

Version:
522 lines (519 loc) 98.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.TAG_ORDER = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _matrix = require("matrix-js-sdk/src/matrix"); var _react = _interopRequireWildcard(require("react")); var _RovingTabIndex = require("../../../accessibility/RovingTabIndex"); var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext")); var _UIComponents = require("../../../customisations/helpers/UIComponents"); var _actions = require("../../../dispatcher/actions"); var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher")); var _useEventEmitter = require("../../../hooks/useEventEmitter"); var _languageHandler = require("../../../languageHandler"); var _MatrixClientPeg = require("../../../MatrixClientPeg"); var _PosthogTrackers = _interopRequireDefault(require("../../../PosthogTrackers")); var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore")); var _useSettings = require("../../../hooks/useSettings"); var _UIFeature = require("../../../settings/UIFeature"); var _RoomNotificationStateStore = require("../../../stores/notifications/RoomNotificationStateStore"); var _models = require("../../../stores/room-list/models"); var _AsyncStore = require("../../../stores/AsyncStore"); var _RoomListStore = _interopRequireWildcard(require("../../../stores/room-list/RoomListStore")); var _spaces = require("../../../stores/spaces"); var _SpaceStore = _interopRequireDefault(require("../../../stores/spaces/SpaceStore")); var _arrays = require("../../../utils/arrays"); var _objects = require("../../../utils/objects"); var _space = require("../../../utils/space"); var _ContextMenu = require("../../structures/ContextMenu"); var _RoomAvatar = _interopRequireDefault(require("../avatars/RoomAvatar")); var _BetaCard = require("../beta/BetaCard"); var _IconizedContextMenu = _interopRequireWildcard(require("../context_menus/IconizedContextMenu")); var _ExtraTile = _interopRequireDefault(require("./ExtraTile")); var _RoomSublist = _interopRequireDefault(require("./RoomSublist")); var _SDKContext = require("../../../contexts/SDKContext"); var _KeyboardShortcuts = require("../../../accessibility/KeyboardShortcuts"); var _KeyBindingsManager = require("../../../KeyBindingsManager"); var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton")); var _LandmarkNavigation = require("../../../accessibility/LandmarkNavigation"); 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; } /* Copyright 2024 New Vector Ltd. Copyright 2015-2018 , 2020, 2021 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. */ const TAG_ORDER = exports.TAG_ORDER = [_models.DefaultTagID.Invite, _models.DefaultTagID.Favourite, _models.DefaultTagID.DM, _models.DefaultTagID.Untagged, _models.DefaultTagID.Conference, _models.DefaultTagID.LowPriority, _models.DefaultTagID.ServerNotice, _models.DefaultTagID.Suggested // DefaultTagID.Archived isn't here any more: we don't show it at all. // The section still exists in the code as a place for rooms that we know // about but aren't joined. At some point it could be removed entirely // but we'd have to make sure that rooms you weren't in were hidden. ]; const ALWAYS_VISIBLE_TAGS = [_models.DefaultTagID.DM, _models.DefaultTagID.Untagged]; const auxButtonContextMenuPosition = handle => { const rect = handle.getBoundingClientRect(); return { chevronFace: _ContextMenu.ChevronFace.None, left: rect.left - 7, top: rect.top + rect.height }; }; const DmAuxButton = ({ tabIndex, dispatcher = _dispatcher.default }) => { const [menuDisplayed, handle, openMenu, closeMenu] = (0, _ContextMenu.useContextMenu)(); const activeSpace = (0, _useEventEmitter.useEventEmitterState)(_SpaceStore.default.instance, _spaces.UPDATE_SELECTED_SPACE, () => { return _SpaceStore.default.instance.activeSpaceRoom; }); const showCreateRooms = (0, _UIComponents.shouldShowComponent)(_UIFeature.UIComponent.CreateRooms); const showInviteUsers = (0, _UIComponents.shouldShowComponent)(_UIFeature.UIComponent.InviteUsers); if (activeSpace && (showCreateRooms || showInviteUsers)) { let contextMenu; if (menuDisplayed && handle.current) { const canInvite = (0, _space.shouldShowSpaceInvite)(activeSpace); contextMenu = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.default, (0, _extends2.default)({}, auxButtonContextMenuPosition(handle.current), { onFinished: closeMenu, compact: true }), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, { first: true }, showCreateRooms && /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { label: (0, _languageHandler._t)("action|start_new_chat"), iconClassName: "mx_RoomList_iconStartChat", onClick: e => { e.preventDefault(); e.stopPropagation(); closeMenu(); _dispatcher.default.dispatch({ action: "view_create_chat" }); _PosthogTrackers.default.trackInteraction("WebRoomListRoomsSublistPlusMenuCreateChatItem", e); } }), showInviteUsers && /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { label: (0, _languageHandler._t)("action|invite_to_space"), iconClassName: "mx_RoomList_iconInvite", onClick: e => { e.preventDefault(); e.stopPropagation(); closeMenu(); (0, _space.showSpaceInvite)(activeSpace); }, disabled: !canInvite, title: canInvite ? undefined : (0, _languageHandler._t)("spaces|error_no_permission_invite") }))); } return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_ContextMenu.ContextMenuTooltipButton, { tabIndex: tabIndex, onClick: openMenu, className: "mx_RoomSublist_auxButton", "aria-label": (0, _languageHandler._t)("action|add_people"), title: (0, _languageHandler._t)("action|add_people"), isExpanded: menuDisplayed, ref: handle }), contextMenu); } else if (!activeSpace && showCreateRooms) { return /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { tabIndex: tabIndex, onClick: e => { dispatcher.dispatch({ action: "view_create_chat" }); _PosthogTrackers.default.trackInteraction("WebRoomListRoomsSublistPlusMenuCreateChatItem", e); }, className: "mx_RoomSublist_auxButton", "aria-label": (0, _languageHandler._t)("action|start_chat"), title: (0, _languageHandler._t)("action|start_chat") }); } return null; }; const UntaggedAuxButton = ({ tabIndex }) => { const [menuDisplayed, handle, openMenu, closeMenu] = (0, _ContextMenu.useContextMenu)(); const activeSpace = (0, _useEventEmitter.useEventEmitterState)(_SpaceStore.default.instance, _spaces.UPDATE_SELECTED_SPACE, () => { return _SpaceStore.default.instance.activeSpaceRoom; }); const showCreateRoom = (0, _UIComponents.shouldShowComponent)(_UIFeature.UIComponent.CreateRooms); const showExploreRooms = (0, _UIComponents.shouldShowComponent)(_UIFeature.UIComponent.ExploreRooms); const videoRoomsEnabled = (0, _useSettings.useFeatureEnabled)("feature_video_rooms"); const elementCallVideoRoomsEnabled = (0, _useSettings.useFeatureEnabled)("feature_element_call_video_rooms"); let contextMenuContent; if (menuDisplayed && activeSpace) { const canAddRooms = activeSpace.currentState.maySendStateEvent(_matrix.EventType.SpaceChild, _MatrixClientPeg.MatrixClientPeg.safeGet().getSafeUserId()); contextMenuContent = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, { first: true }, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { label: (0, _languageHandler._t)("action|explore_rooms"), iconClassName: "mx_RoomList_iconExplore", onClick: e => { e.preventDefault(); e.stopPropagation(); closeMenu(); _dispatcher.default.dispatch({ action: _actions.Action.ViewRoom, room_id: activeSpace.roomId, metricsTrigger: undefined // other }); _PosthogTrackers.default.trackInteraction("WebRoomListRoomsSublistPlusMenuExploreRoomsItem", e); } }), showCreateRoom ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { label: (0, _languageHandler._t)("action|new_room"), iconClassName: "mx_RoomList_iconNewRoom", onClick: e => { e.preventDefault(); e.stopPropagation(); closeMenu(); (0, _space.showCreateNewRoom)(activeSpace); _PosthogTrackers.default.trackInteraction("WebRoomListRoomsSublistPlusMenuCreateRoomItem", e); }, disabled: !canAddRooms, title: canAddRooms ? undefined : (0, _languageHandler._t)("spaces|error_no_permission_create_room") }), videoRoomsEnabled && /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { label: (0, _languageHandler._t)("action|new_video_room"), iconClassName: "mx_RoomList_iconNewVideoRoom", onClick: e => { e.preventDefault(); e.stopPropagation(); closeMenu(); (0, _space.showCreateNewRoom)(activeSpace, elementCallVideoRoomsEnabled ? _matrix.RoomType.UnstableCall : _matrix.RoomType.ElementVideo); }, disabled: !canAddRooms, title: canAddRooms ? undefined : (0, _languageHandler._t)("spaces|error_no_permission_create_room") }, /*#__PURE__*/_react.default.createElement(_BetaCard.BetaPill, null)), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { label: (0, _languageHandler._t)("action|add_existing_room"), iconClassName: "mx_RoomList_iconAddExistingRoom", onClick: e => { e.preventDefault(); e.stopPropagation(); closeMenu(); (0, _space.showAddExistingRooms)(activeSpace); }, disabled: !canAddRooms, title: canAddRooms ? undefined : (0, _languageHandler._t)("spaces|error_no_permission_add_room") })) : null); } else if (menuDisplayed) { contextMenuContent = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, { first: true }, showCreateRoom && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { label: (0, _languageHandler._t)("action|new_room"), iconClassName: "mx_RoomList_iconNewRoom", onClick: e => { e.preventDefault(); e.stopPropagation(); closeMenu(); _dispatcher.default.dispatch({ action: "view_create_room" }); _PosthogTrackers.default.trackInteraction("WebRoomListRoomsSublistPlusMenuCreateRoomItem", e); } }), videoRoomsEnabled && /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { label: (0, _languageHandler._t)("action|new_video_room"), iconClassName: "mx_RoomList_iconNewVideoRoom", onClick: e => { e.preventDefault(); e.stopPropagation(); closeMenu(); _dispatcher.default.dispatch({ action: "view_create_room", type: elementCallVideoRoomsEnabled ? _matrix.RoomType.UnstableCall : _matrix.RoomType.ElementVideo }); } }, /*#__PURE__*/_react.default.createElement(_BetaCard.BetaPill, null))), showExploreRooms ? /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { label: (0, _languageHandler._t)("action|explore_public_rooms"), iconClassName: "mx_RoomList_iconExplore", onClick: e => { e.preventDefault(); e.stopPropagation(); closeMenu(); _PosthogTrackers.default.trackInteraction("WebRoomListRoomsSublistPlusMenuExploreRoomsItem", e); _dispatcher.default.fire(_actions.Action.ViewRoomDirectory); } }) : null); } let contextMenu = null; if (menuDisplayed && handle.current) { contextMenu = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.default, (0, _extends2.default)({}, auxButtonContextMenuPosition(handle.current), { onFinished: closeMenu, compact: true }), contextMenuContent); } if (showCreateRoom || showExploreRooms) { return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_ContextMenu.ContextMenuTooltipButton, { tabIndex: tabIndex, onClick: openMenu, className: "mx_RoomSublist_auxButton", "aria-label": (0, _languageHandler._t)("room_list|add_room_label"), title: (0, _languageHandler._t)("room_list|add_room_label"), isExpanded: menuDisplayed, ref: handle }), contextMenu); } return null; }; const TAG_AESTHETICS = { [_models.DefaultTagID.Invite]: { sectionLabel: (0, _languageHandler._td)("action|invites_list"), isInvite: true, defaultHidden: false }, [_models.DefaultTagID.Favourite]: { sectionLabel: (0, _languageHandler._td)("common|favourites"), isInvite: false, defaultHidden: false }, [_models.DefaultTagID.DM]: { sectionLabel: (0, _languageHandler._td)("common|people"), isInvite: false, defaultHidden: false, AuxButtonComponent: DmAuxButton }, [_models.DefaultTagID.Conference]: { sectionLabel: (0, _languageHandler._td)("voip|metaspace_video_rooms|conference_room_section"), isInvite: false, defaultHidden: false }, [_models.DefaultTagID.Untagged]: { sectionLabel: (0, _languageHandler._td)("common|rooms"), isInvite: false, defaultHidden: false, AuxButtonComponent: UntaggedAuxButton }, [_models.DefaultTagID.LowPriority]: { sectionLabel: (0, _languageHandler._td)("common|low_priority"), isInvite: false, defaultHidden: false }, [_models.DefaultTagID.ServerNotice]: { sectionLabel: (0, _languageHandler._td)("common|system_alerts"), isInvite: false, defaultHidden: false }, // TODO: Replace with archived view: https://github.com/vector-im/element-web/issues/14038 [_models.DefaultTagID.Archived]: { sectionLabel: (0, _languageHandler._td)("common|historical"), isInvite: false, defaultHidden: true }, [_models.DefaultTagID.Suggested]: { sectionLabel: (0, _languageHandler._td)("room_list|suggested_rooms_heading"), isInvite: false, defaultHidden: false } }; class RoomList extends _react.default.PureComponent { constructor(props, context) { super(props, context); (0, _defineProperty2.default)(this, "dispatcherRef", void 0); (0, _defineProperty2.default)(this, "treeRef", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2.default)(this, "onRoomViewStoreUpdate", () => { this.setState({ currentRoomId: _SDKContext.SdkContextClass.instance.roomViewStore.getRoomId() ?? undefined }); }); (0, _defineProperty2.default)(this, "onAction", payload => { if (payload.action === _actions.Action.ViewRoomDelta) { const viewRoomDeltaPayload = payload; const currentRoomId = _SDKContext.SdkContextClass.instance.roomViewStore.getRoomId(); if (!currentRoomId) return; const room = this.getRoomDelta(currentRoomId, viewRoomDeltaPayload.delta, viewRoomDeltaPayload.unread); if (room) { _dispatcher.default.dispatch({ action: _actions.Action.ViewRoom, room_id: room.roomId, show_room_tile: true, // to make sure the room gets scrolled into view metricsTrigger: "WebKeyboardShortcut", metricsViaKeyboard: true }); } } else if (payload.action === _actions.Action.PstnSupportUpdated) { this.updateLists(); } }); (0, _defineProperty2.default)(this, "getRoomDelta", (roomId, delta, unread = false) => { const lists = _RoomListStore.default.instance.orderedLists; const rooms = []; TAG_ORDER.forEach(t => { let listRooms = lists[t]; if (unread) { // filter to only notification rooms (and our current active room so we can index properly) listRooms = listRooms.filter(r => { const state = _RoomNotificationStateStore.RoomNotificationStateStore.instance.getRoomState(r); return state.room.roomId === roomId || state.isUnread; }); } rooms.push(...listRooms); }); const currentIndex = rooms.findIndex(r => r.roomId === roomId); // use slice to account for looping around the start const [room] = rooms.slice((currentIndex + delta) % rooms.length); return room; }); (0, _defineProperty2.default)(this, "updateSuggestedRooms", suggestedRooms => { this.setState({ suggestedRooms }); }); (0, _defineProperty2.default)(this, "updateLists", () => { const newLists = _RoomListStore.default.instance.orderedLists; const previousListIds = Object.keys(this.state.sublists); const newListIds = Object.keys(newLists); let doUpdate = (0, _arrays.arrayHasDiff)(previousListIds, newListIds); if (!doUpdate) { // so we didn't have the visible sublists change, but did the contents of those // sublists change significantly enough to break the sticky headers? Probably, so // let's check the length of each. for (const tagId of newListIds) { const oldRooms = this.state.sublists[tagId]; const newRooms = newLists[tagId]; if (oldRooms.length !== newRooms.length) { doUpdate = true; break; } } } if (doUpdate) { // We have to break our reference to the room list store if we want to be able to // diff the object for changes, so do that. // @ts-ignore - ITagMap is ts-ignored so this will have to be too const newSublists = (0, _objects.objectWithOnly)(newLists, newListIds); const sublists = (0, _objects.objectShallowClone)(newSublists, (k, v) => (0, _arrays.arrayFastClone)(v)); this.setState({ sublists }, () => { this.props.onResize(); }); } }); this.state = { sublists: {}, suggestedRooms: _SpaceStore.default.instance.suggestedRooms }; } componentDidMount() { this.dispatcherRef = _dispatcher.default.register(this.onAction); _SDKContext.SdkContextClass.instance.roomViewStore.on(_AsyncStore.UPDATE_EVENT, this.onRoomViewStoreUpdate); _SpaceStore.default.instance.on(_spaces.UPDATE_SUGGESTED_ROOMS, this.updateSuggestedRooms); _RoomListStore.default.instance.on(_RoomListStore.LISTS_UPDATE_EVENT, this.updateLists); this.updateLists(); // trigger the first update } componentWillUnmount() { _SpaceStore.default.instance.off(_spaces.UPDATE_SUGGESTED_ROOMS, this.updateSuggestedRooms); _RoomListStore.default.instance.off(_RoomListStore.LISTS_UPDATE_EVENT, this.updateLists); if (this.dispatcherRef) _dispatcher.default.unregister(this.dispatcherRef); _SDKContext.SdkContextClass.instance.roomViewStore.off(_AsyncStore.UPDATE_EVENT, this.onRoomViewStoreUpdate); } renderSuggestedRooms() { return this.state.suggestedRooms.map(room => { const name = room.name || room.canonical_alias || room.aliases?.[0] || (0, _languageHandler._t)("empty_room"); const avatar = /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, { oobData: { name, avatarUrl: room.avatar_url }, size: "32px" }); const viewRoom = ev => { _dispatcher.default.dispatch({ action: _actions.Action.ViewRoom, room_alias: room.canonical_alias || room.aliases?.[0], room_id: room.room_id, via_servers: room.viaServers, oob_data: { avatarUrl: room.avatar_url, name }, metricsTrigger: "RoomList", metricsViaKeyboard: ev.type !== "click" }); }; return /*#__PURE__*/_react.default.createElement(_ExtraTile.default, { isMinimized: this.props.isMinimized, isSelected: this.state.currentRoomId === room.room_id, displayName: name, avatar: avatar, onClick: viewRoom, key: `suggestedRoomTile_${room.room_id}` }); }); } renderSublists() { // show a skeleton UI if the user is in no rooms and they are not filtering and have no suggested rooms const showSkeleton = !this.state.suggestedRooms?.length && Object.values(_RoomListStore.default.instance.orderedLists).every(list => !list?.length); return TAG_ORDER.map(orderedTagId => { let extraTiles; if (orderedTagId === _models.DefaultTagID.Suggested) { extraTiles = this.renderSuggestedRooms(); } const aesthetics = TAG_AESTHETICS[orderedTagId]; if (!aesthetics) throw new Error(`Tag ${orderedTagId} does not have aesthetics`); let alwaysVisible = ALWAYS_VISIBLE_TAGS.includes(orderedTagId); if (this.props.activeSpace === _spaces.MetaSpace.Favourites && orderedTagId !== _models.DefaultTagID.Favourite || this.props.activeSpace === _spaces.MetaSpace.People && orderedTagId !== _models.DefaultTagID.DM || this.props.activeSpace === _spaces.MetaSpace.Orphans && orderedTagId === _models.DefaultTagID.DM || this.props.activeSpace === _spaces.MetaSpace.VideoRooms && orderedTagId === _models.DefaultTagID.DM || !(0, _spaces.isMetaSpace)(this.props.activeSpace) && orderedTagId === _models.DefaultTagID.DM && !_SettingsStore.default.getValue("Spaces.showPeopleInSpace", this.props.activeSpace)) { alwaysVisible = false; } let forceExpanded = false; if (this.props.activeSpace === _spaces.MetaSpace.Favourites && orderedTagId === _models.DefaultTagID.Favourite || this.props.activeSpace === _spaces.MetaSpace.People && orderedTagId === _models.DefaultTagID.DM) { forceExpanded = true; } // The cost of mounting/unmounting this component offsets the cost // of keeping it in the DOM and hiding it when it is not required return /*#__PURE__*/_react.default.createElement(_RoomSublist.default, { key: `sublist-${orderedTagId}`, tagId: orderedTagId, forRooms: true, startAsHidden: aesthetics.defaultHidden, label: aesthetics.sectionLabelRaw ? aesthetics.sectionLabelRaw : (0, _languageHandler._t)(aesthetics.sectionLabel), AuxButtonComponent: aesthetics.AuxButtonComponent, isMinimized: this.props.isMinimized, showSkeleton: showSkeleton, extraTiles: extraTiles, resizeNotifier: this.props.resizeNotifier, alwaysVisible: alwaysVisible, onListCollapse: this.props.onListCollapse, forceExpanded: forceExpanded }); }); } focus() { // focus the first focusable element in this aria treeview widget const treeItems = this.treeRef.current?.querySelectorAll('[role="treeitem"]'); if (!treeItems) return; [...treeItems].find(e => e.offsetParent !== null)?.focus(); } render() { const sublists = this.renderSublists(); return /*#__PURE__*/_react.default.createElement(_RovingTabIndex.RovingTabIndexProvider, { handleHomeEnd: true, handleUpDown: true, onKeyDown: this.props.onKeyDown }, ({ onKeyDownHandler }) => /*#__PURE__*/_react.default.createElement("div", { onFocus: this.props.onFocus, onBlur: this.props.onBlur, onKeyDown: ev => { const navAction = (0, _KeyBindingsManager.getKeyBindingsManager)().getNavigationAction(ev); if (navAction === _KeyboardShortcuts.KeyBindingAction.NextLandmark || navAction === _KeyboardShortcuts.KeyBindingAction.PreviousLandmark) { _LandmarkNavigation.LandmarkNavigation.findAndFocusNextLandmark(_LandmarkNavigation.Landmark.ROOM_LIST, navAction === _KeyboardShortcuts.KeyBindingAction.PreviousLandmark); ev.stopPropagation(); ev.preventDefault(); return; } onKeyDownHandler(ev); }, className: "mx_RoomList", role: "tree", "aria-label": (0, _languageHandler._t)("common|rooms"), ref: this.treeRef }, sublists)); } } exports.default = RoomList; (0, _defineProperty2.default)(RoomList, "contextType", _MatrixClientContext.default); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX1JvdmluZ1RhYkluZGV4IiwiX01hdHJpeENsaWVudENvbnRleHQiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX1VJQ29tcG9uZW50cyIsIl9hY3Rpb25zIiwiX2Rpc3BhdGNoZXIiLCJfdXNlRXZlbnRFbWl0dGVyIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9NYXRyaXhDbGllbnRQZWciLCJfUG9zdGhvZ1RyYWNrZXJzIiwiX1NldHRpbmdzU3RvcmUiLCJfdXNlU2V0dGluZ3MiLCJfVUlGZWF0dXJlIiwiX1Jvb21Ob3RpZmljYXRpb25TdGF0ZVN0b3JlIiwiX21vZGVscyIsIl9Bc3luY1N0b3JlIiwiX1Jvb21MaXN0U3RvcmUiLCJfc3BhY2VzIiwiX1NwYWNlU3RvcmUiLCJfYXJyYXlzIiwiX29iamVjdHMiLCJfc3BhY2UiLCJfQ29udGV4dE1lbnUiLCJfUm9vbUF2YXRhciIsIl9CZXRhQ2FyZCIsIl9JY29uaXplZENvbnRleHRNZW51IiwiX0V4dHJhVGlsZSIsIl9Sb29tU3VibGlzdCIsIl9TREtDb250ZXh0IiwiX0tleWJvYXJkU2hvcnRjdXRzIiwiX0tleUJpbmRpbmdzTWFuYWdlciIsIl9BY2Nlc3NpYmxlQnV0dG9uIiwiX0xhbmRtYXJrTmF2aWdhdGlvbiIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIlRBR19PUkRFUiIsImV4cG9ydHMiLCJEZWZhdWx0VGFnSUQiLCJJbnZpdGUiLCJGYXZvdXJpdGUiLCJETSIsIlVudGFnZ2VkIiwiQ29uZmVyZW5jZSIsIkxvd1ByaW9yaXR5IiwiU2VydmVyTm90aWNlIiwiU3VnZ2VzdGVkIiwiQUxXQVlTX1ZJU0lCTEVfVEFHUyIsImF1eEJ1dHRvbkNvbnRleHRNZW51UG9zaXRpb24iLCJoYW5kbGUiLCJyZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiY2hldnJvbkZhY2UiLCJDaGV2cm9uRmFjZSIsIk5vbmUiLCJsZWZ0IiwidG9wIiwiaGVpZ2h0IiwiRG1BdXhCdXR0b24iLCJ0YWJJbmRleCIsImRpc3BhdGNoZXIiLCJkZWZhdWx0RGlzcGF0Y2hlciIsIm1lbnVEaXNwbGF5ZWQiLCJvcGVuTWVudSIsImNsb3NlTWVudSIsInVzZUNvbnRleHRNZW51IiwiYWN0aXZlU3BhY2UiLCJ1c2VFdmVudEVtaXR0ZXJTdGF0ZSIsIlNwYWNlU3RvcmUiLCJpbnN0YW5jZSIsIlVQREFURV9TRUxFQ1RFRF9TUEFDRSIsImFjdGl2ZVNwYWNlUm9vbSIsInNob3dDcmVhdGVSb29tcyIsInNob3VsZFNob3dDb21wb25lbnQiLCJVSUNvbXBvbmVudCIsIkNyZWF0ZVJvb21zIiwic2hvd0ludml0ZVVzZXJzIiwiSW52aXRlVXNlcnMiLCJjb250ZXh0TWVudSIsImN1cnJlbnQiLCJjYW5JbnZpdGUiLCJzaG91bGRTaG93U3BhY2VJbnZpdGUiLCJjcmVhdGVFbGVtZW50IiwiX2V4dGVuZHMyIiwib25GaW5pc2hlZCIsImNvbXBhY3QiLCJJY29uaXplZENvbnRleHRNZW51T3B0aW9uTGlzdCIsImZpcnN0IiwiSWNvbml6ZWRDb250ZXh0TWVudU9wdGlvbiIsImxhYmVsIiwiX3QiLCJpY29uQ2xhc3NOYW1lIiwib25DbGljayIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwiZGlzcGF0Y2giLCJhY3Rpb24iLCJQb3N0aG9nVHJhY2tlcnMiLCJ0cmFja0ludGVyYWN0aW9uIiwic2hvd1NwYWNlSW52aXRlIiwiZGlzYWJsZWQiLCJ0aXRsZSIsInVuZGVmaW5lZCIsIkZyYWdtZW50IiwiQ29udGV4dE1lbnVUb29sdGlwQnV0dG9uIiwiY2xhc3NOYW1lIiwiaXNFeHBhbmRlZCIsInJlZiIsIlVudGFnZ2VkQXV4QnV0dG9uIiwic2hvd0NyZWF0ZVJvb20iLCJzaG93RXhwbG9yZVJvb21zIiwiRXhwbG9yZVJvb21zIiwidmlkZW9Sb29tc0VuYWJsZWQiLCJ1c2VGZWF0dXJlRW5hYmxlZCIsImVsZW1lbnRDYWxsVmlkZW9Sb29tc0VuYWJsZWQiLCJjb250ZXh0TWVudUNvbnRlbnQiLCJjYW5BZGRSb29tcyIsImN1cnJlbnRTdGF0ZSIsIm1heVNlbmRTdGF0ZUV2ZW50IiwiRXZlbnRUeXBlIiwiU3BhY2VDaGlsZCIsIk1hdHJpeENsaWVudFBlZyIsInNhZmVHZXQiLCJnZXRTYWZlVXNlcklkIiwiQWN0aW9uIiwiVmlld1Jvb20iLCJyb29tX2lkIiwicm9vbUlkIiwibWV0cmljc1RyaWdnZXIiLCJzaG93Q3JlYXRlTmV3Um9vbSIsIlJvb21UeXBlIiwiVW5zdGFibGVDYWxsIiwiRWxlbWVudFZpZGVvIiwiQmV0YVBpbGwiLCJzaG93QWRkRXhpc3RpbmdSb29tcyIsInR5cGUiLCJmaXJlIiwiVmlld1Jvb21EaXJlY3RvcnkiLCJUQUdfQUVTVEhFVElDUyIsInNlY3Rpb25MYWJlbCIsIl90ZCIsImlzSW52aXRlIiwiZGVmYXVsdEhpZGRlbiIsIkF1eEJ1dHRvbkNvbXBvbmVudCIsIkFyY2hpdmVkIiwiUm9vbUxpc3QiLCJSZWFjdCIsIlB1cmVDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiY29udGV4dCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJjcmVhdGVSZWYiLCJzZXRTdGF0ZSIsImN1cnJlbnRSb29tSWQiLCJTZGtDb250ZXh0Q2xhc3MiLCJyb29tVmlld1N0b3JlIiwiZ2V0Um9vbUlkIiwicGF5bG9hZCIsIlZpZXdSb29tRGVsdGEiLCJ2aWV3Um9vbURlbHRhUGF5bG9hZCIsInJvb20iLCJnZXRSb29tRGVsdGEiLCJkZWx0YSIsInVucmVhZCIsInNob3dfcm9vbV90aWxlIiwibWV0cmljc1ZpYUtleWJvYXJkIiwiUHN0blN1cHBvcnRVcGRhdGVkIiwidXBkYXRlTGlzdHMiLCJsaXN0cyIsIlJvb21MaXN0U3RvcmUiLCJvcmRlcmVkTGlzdHMiLCJyb29tcyIsImZvckVhY2giLCJsaXN0Um9vbXMiLCJmaWx0ZXIiLCJzdGF0ZSIsIlJvb21Ob3RpZmljYXRpb25TdGF0ZVN0b3JlIiwiZ2V0Um9vbVN0YXRlIiwiaXNVbnJlYWQiLCJwdXNoIiwiY3VycmVudEluZGV4IiwiZmluZEluZGV4Iiwic2xpY2UiLCJsZW5ndGgiLCJzdWdnZXN0ZWRSb29tcyIsIm5ld0xpc3RzIiwicHJldmlvdXNMaXN0SWRzIiwia2V5cyIsInN1Ymxpc3RzIiwibmV3TGlzdElkcyIsImRvVXBkYXRlIiwiYXJyYXlIYXNEaWZmIiwidGFnSWQiLCJvbGRSb29tcyIsIm5ld1Jvb21zIiwibmV3U3VibGlzdHMiLCJvYmplY3RXaXRoT25seSIsIm9iamVjdFNoYWxsb3dDbG9uZSIsImsiLCJ2IiwiYXJyYXlGYXN0Q2xvbmUiLCJvblJlc2l6ZSIsImNvbXBvbmVudERpZE1vdW50IiwiZGlzcGF0Y2hlclJlZiIsInJlZ2lzdGVyIiwib25BY3Rpb24iLCJvbiIsIlVQREFURV9FVkVOVCIsIm9uUm9vbVZpZXdTdG9yZVVwZGF0ZSIsIlVQREFURV9TVUdHRVNURURfUk9PTVMiLCJ1cGRhdGVTdWdnZXN0ZWRSb29tcyIsIkxJU1RTX1VQREFURV9FVkVOVCIsImNvbXBvbmVudFdpbGxVbm1vdW50Iiwib2ZmIiwidW5yZWdpc3RlciIsInJlbmRlclN1Z2dlc3RlZFJvb21zIiwibWFwIiwibmFtZSIsImNhbm9uaWNhbF9hbGlhcyIsImFsaWFzZXMiLCJhdmF0YXIiLCJvb2JEYXRhIiwiYXZhdGFyVXJsIiwiYXZhdGFyX3VybCIsInNpemUiLCJ2aWV3Um9vbSIsImV2Iiwicm9vbV9hbGlhcyIsInZpYV9zZXJ2ZXJzIiwidmlhU2VydmVycyIsIm9vYl9kYXRhIiwiaXNNaW5pbWl6ZWQiLCJpc1NlbGVjdGVkIiwiZGlzcGxheU5hbWUiLCJrZXkiLCJyZW5kZXJTdWJsaXN0cyIsInNob3dTa2VsZXRvbiIsInZhbHVlcyIsImV2ZXJ5IiwibGlzdCIsIm9yZGVyZWRUYWdJZCIsImV4dHJhVGlsZXMiLCJhZXN0aGV0aWNzIiwiRXJyb3IiLCJhbHdheXNWaXNpYmxlIiwiaW5jbHVkZXMiLCJNZXRhU3BhY2UiLCJGYXZvdXJpdGVzIiwiUGVvcGxlIiwiT3JwaGFucyIsIlZpZGVvUm9vbXMiLCJpc01ldGFTcGFjZSIsIlNldHRpbmdzU3RvcmUiLCJnZXRWYWx1ZSIsImZvcmNlRXhwYW5kZWQiLCJmb3JSb29tcyIsInN0YXJ0QXNIaWRkZW4iLCJzZWN0aW9uTGFiZWxSYXciLCJyZXNpemVOb3RpZmllciIsIm9uTGlzdENvbGxhcHNlIiwiZm9jdXMiLCJ0cmVlSXRlbXMiLCJ0cmVlUmVmIiwicXVlcnlTZWxlY3RvckFsbCIsImZpbmQiLCJvZmZzZXRQYXJlbnQiLCJyZW5kZXIiLCJSb3ZpbmdUYWJJbmRleFByb3ZpZGVyIiwiaGFuZGxlSG9tZUVuZCIsImhhbmRsZVVwRG93biIsIm9uS2V5RG93biIsIm9uS2V5RG93bkhhbmRsZXIiLCJvbkZvY3VzIiwib25CbHVyIiwibmF2QWN0aW9uIiwiZ2V0S2V5QmluZGluZ3NNYW5hZ2VyIiwiZ2V0TmF2aWdhdGlvbkFjdGlvbiIsIktleUJpbmRpbmdBY3Rpb24iLCJOZXh0TGFuZG1hcmsiLCJQcmV2aW91c0xhbmRtYXJrIiwiTGFuZG1hcmtOYXZpZ2F0aW9uIiwiZmluZEFuZEZvY3VzTmV4dExhbmRtYXJrIiwiTGFuZG1hcmsiLCJST09NX0xJU1QiLCJyb2xlIiwiTWF0cml4Q2xpZW50Q29udGV4dCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3Jvb21zL1Jvb21MaXN0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxNS0yMDE4ICwgMjAyMCwgMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgeyBFdmVudFR5cGUsIFJvb21UeXBlLCBSb29tIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudFR5cGUsIGNyZWF0ZVJlZiwgUmVhY3RDb21wb25lbnRFbGVtZW50LCBTeW50aGV0aWNFdmVudCB9IGZyb20gXCJyZWFjdFwiO1xuXG5pbXBvcnQgeyBJU3RhdGUgYXMgSVJvdmluZ1RhYkluZGV4U3RhdGUsIFJvdmluZ1RhYkluZGV4UHJvdmlkZXIgfSBmcm9tIFwiLi4vLi4vLi4vYWNjZXNzaWJpbGl0eS9Sb3ZpbmdUYWJJbmRleFwiO1xuaW1wb3J0IE1hdHJpeENsaWVudENvbnRleHQgZnJvbSBcIi4uLy4uLy4uL2NvbnRleHRzL01hdHJpeENsaWVudENvbnRleHRcIjtcbmltcG9ydCB7IHNob3VsZFNob3dDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vLi4vY3VzdG9taXNhdGlvbnMvaGVscGVycy9VSUNvbXBvbmVudHNcIjtcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2FjdGlvbnNcIjtcbmltcG9ydCBkZWZhdWx0RGlzcGF0Y2hlciBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBBY3Rpb25QYXlsb2FkIH0gZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvcGF5bG9hZHNcIjtcbmltcG9ydCB7IFZpZXdSb29tRGVsdGFQYXlsb2FkIH0gZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvcGF5bG9hZHMvVmlld1Jvb21EZWx0YVBheWxvYWRcIjtcbmltcG9ydCB7IFZpZXdSb29tUGF5bG9hZCB9IGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL3BheWxvYWRzL1ZpZXdSb29tUGF5bG9hZFwiO1xuaW1wb3J0IHsgdXNlRXZlbnRFbWl0dGVyU3RhdGUgfSBmcm9tIFwiLi4vLi4vLi4vaG9va3MvdXNlRXZlbnRFbWl0dGVyXCI7XG5pbXBvcnQgeyBfdCwgX3RkLCBUcmFuc2xhdGlvbktleSB9IGZyb20gXCIuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7IE1hdHJpeENsaWVudFBlZyB9IGZyb20gXCIuLi8uLi8uLi9NYXRyaXhDbGllbnRQZWdcIjtcbmltcG9ydCBQb3N0aG9nVHJhY2tlcnMgZnJvbSBcIi4uLy4uLy4uL1Bvc3Rob2dUcmFja2Vyc1wiO1xuaW1wb3J0IFNldHRpbmdzU3RvcmUgZnJvbSBcIi4uLy4uLy4uL3NldHRpbmdzL1NldHRpbmdzU3RvcmVcIjtcbmltcG9ydCB7IHVzZUZlYXR1cmVFbmFibGVkIH0gZnJvbSBcIi4uLy4uLy4uL2hvb2tzL3VzZVNldHRpbmdzXCI7XG5pbXBvcnQgeyBVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi8uLi9zZXR0aW5ncy9VSUZlYXR1cmVcIjtcbmltcG9ydCB7IFJvb21Ob3RpZmljYXRpb25TdGF0ZVN0b3JlIH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9ub3RpZmljYXRpb25zL1Jvb21Ob3RpZmljYXRpb25TdGF0ZVN0b3JlXCI7XG5pbXBvcnQgeyBJVGFnTWFwIH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9yb29tLWxpc3QvYWxnb3JpdGhtcy9tb2RlbHNcIjtcbmltcG9ydCB7IERlZmF1bHRUYWdJRCwgVGFnSUQgfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL3Jvb20tbGlzdC9tb2RlbHNcIjtcbmltcG9ydCB7IFVQREFURV9FVkVOVCB9IGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvQXN5bmNTdG9yZVwiO1xuaW1wb3J0IFJvb21MaXN0U3RvcmUsIHsgTElTVFNfVVBEQVRFX0VWRU5UIH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9yb29tLWxpc3QvUm9vbUxpc3RTdG9yZVwiO1xuaW1wb3J0IHtcbiAgICBpc01ldGFTcGFjZSxcbiAgICBJU3VnZ2VzdGVkUm9vbSxcbiAgICBNZXRhU3BhY2UsXG4gICAgU3BhY2VLZXksXG4gICAgVVBEQVRFX1NFTEVDVEVEX1NQQUNFLFxuICAgIFVQREFURV9TVUdHRVNURURfUk9PTVMsXG59IGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvc3BhY2VzXCI7XG5pbXBvcnQgU3BhY2VTdG9yZSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL3NwYWNlcy9TcGFjZVN0b3JlXCI7XG5pbXBvcnQgeyBhcnJheUZhc3RDbG9uZSwgYXJyYXlIYXNEaWZmIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2FycmF5c1wiO1xuaW1wb3J0IHsgb2JqZWN0U2hhbGxvd0Nsb25lLCBvYmplY3RXaXRoT25seSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9vYmplY3RzXCI7XG5pbXBvcnQgUmVzaXplTm90aWZpZXIgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL1Jlc2l6ZU5vdGlmaWVyXCI7XG5pbXBvcnQgeyBzaG91bGRTaG93U3BhY2VJbnZpdGUsIHNob3dBZGRFeGlzdGluZ1Jvb21zLCBzaG93Q3JlYXRlTmV3Um9vbSwgc2hvd1NwYWNlSW52aXRlIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3NwYWNlXCI7XG5pbXBvcnQgeyBDaGV2cm9uRmFjZSwgQ29udGV4dE1lbnVUb29sdGlwQnV0dG9uLCBNZW51UHJvcHMsIHVzZUNvbnRleHRNZW51IH0gZnJvbSBcIi4uLy4uL3N0cnVjdHVyZXMvQ29udGV4dE1lbnVcIjtcbmltcG9ydCBSb29tQXZhdGFyIGZyb20gXCIuLi9hdmF0YXJzL1Jvb21BdmF0YXJcIjtcbmltcG9ydCB7IEJldGFQaWxsIH0gZnJvbSBcIi4uL2JldGEvQmV0YUNhcmRcIjtcbmltcG9ydCBJY29uaXplZENvbnRleHRNZW51LCB7XG4gICAgSWNvbml6ZWRDb250ZXh0TWVudU9wdGlvbixcbiAgICBJY29uaXplZENvbnRleHRNZW51T3B0aW9uTGlzdCxcbn0gZnJvbSBcIi4uL2NvbnRleHRfbWVudXMvSWNvbml6ZWRDb250ZXh0TWVudVwiO1xuaW1wb3J0IEV4dHJhVGlsZSBmcm9tIFwiLi9FeHRyYVRpbGVcIjtcbmltcG9ydCBSb29tU3VibGlzdCwgeyBJQXV4QnV0dG9uUHJvcHMgfSBmcm9tIFwiLi9Sb29tU3VibGlzdFwiO1xuaW1wb3J0IHsgU2RrQ29udGV4dENsYXNzIH0gZnJvbSBcIi4uLy4uLy4uL2NvbnRleHRzL1NES0NvbnRleHRcIjtcbmltcG9ydCB7IEtleUJpbmRpbmdBY3Rpb24gfSBmcm9tIFwiLi4vLi4vLi4vYWNjZXNzaWJpbGl0eS9LZXlib2FyZFNob3J0Y3V0c1wiO1xuaW1wb3J0IHsgZ2V0S2V5QmluZGluZ3NNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uLy4uL0tleUJpbmRpbmdzTWFuYWdlclwiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24gZnJvbSBcIi4uL2VsZW1lbnRzL0FjY2Vzc2libGVCdXR0b25cIjtcbmltcG9ydCB7IExhbmRtYXJrLCBMYW5kbWFya05hdmlnYXRpb24gfSBmcm9tIFwiLi4vLi4vLi4vYWNjZXNzaWJpbGl0eS9MYW5kbWFya05hdmlnYXRpb25cIjtcblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgb25LZXlEb3duOiAoZXY6IFJlYWN0LktleWJvYXJkRXZlbnQsIHN0YXRlOiBJUm92aW5nVGFiSW5kZXhTdGF0ZSkgPT4gdm9pZDtcbiAgICBvbkZvY3VzOiAoZXY6IFJlYWN0LkZvY3VzRXZlbnQpID0+IHZvaWQ7XG4gICAgb25CbHVyOiAoZXY6IFJlYWN0LkZvY3VzRXZlbnQpID0+IHZvaWQ7XG4gICAgb25SZXNpemU6ICgpID0+IHZvaWQ7XG4gICAgb25MaXN0Q29sbGFwc2U/OiAoaXNFeHBhbmRlZDogYm9vbGVhbikgPT4gdm9pZDtcbiAgICByZXNpemVOb3RpZmllcjogUmVzaXplTm90aWZpZXI7XG4gICAgaXNNaW5pbWl6ZWQ6IGJvb2xlYW47XG4gICAgYWN0aXZlU3BhY2U6IFNwYWNlS2V5O1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBzdWJsaXN0czogSVRhZ01hcDtcbiAgICBjdXJyZW50Um9vbUlkPzogc3RyaW5nO1xuICAgIHN1Z2dlc3RlZFJvb21zOiBJU3VnZ2VzdGVkUm9vbVtdO1xufVxuXG5leHBvcnQgY29uc3QgVEFHX09SREVSOiBUYWdJRFtdID0gW1xuICAgIERlZmF1bHRUYWdJRC5JbnZpdGUsXG4gICAgRGVmYXVsdFRhZ0lELkZhdm91cml0ZSxcbiAgICBEZWZhdWx0VGFnSUQuRE0sXG4gICAgRGVmYXVsdFRhZ0lELlVudGFnZ2VkLFxuICAgIERlZmF1bHRUYWdJRC5Db25mZXJlbmNlLFxuICAgIERlZmF1bHRUYWdJRC5Mb3dQcmlvcml0eSxcbiAgICBEZWZhdWx0VGFnSUQuU2VydmVyTm90aWNlLFxuICAgIERlZmF1bHRUYWdJRC5TdWdnZXN0ZWQsXG4gICAgLy8gRGVmYXVsdFRhZ0lELkFyY2hpdmVkIGlzbid0IGhlcmUgYW55IG1vcmU6IHdlIGRvbid0IHNob3cgaXQgYXQgYWxsLlxuICAgIC8vIFRoZSBzZWN0aW9uIHN0aWxsIGV4aXN0cyBpbiB0aGUgY29kZSBhcyBhIHBsYWNlIGZvciByb29tcyB0aGF0IHdlIGtub3dcbiAgICAvLyBhYm91dCBidXQgYXJlbid0IGpvaW5lZC4gQXQgc29tZSBwb2ludCBpdCBjb3VsZCBiZSByZW1vdmVkIGVudGlyZWx5XG4gICAgLy8gYnV0IHdlJ2QgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCByb29tcyB5b3Ugd2VyZW4ndCBpbiB3ZXJlIGhpZGRlbi5cbl07XG5jb25zdCBBTFdBWVNfVklTSUJMRV9UQUdTOiBUYWdJRFtdID0gW0RlZmF1bHRUYWdJRC5ETSwgRGVmYXVsdFRhZ0lELlVudGFnZ2VkXTtcblxuaW50ZXJmYWNlIElUYWdBZXN0aGV0aWNzIHtcbiAgICBzZWN0aW9uTGFiZWw6IFRyYW5zbGF0aW9uS2V5O1xuICAgIHNlY3Rpb25MYWJlbFJhdz86IHN0cmluZztcbiAgICBBdXhCdXR0b25Db21wb25lbnQ/OiBDb21wb25lbnRUeXBlPElBdXhCdXR0b25Qcm9wcz47XG4gICAgaXNJbnZpdGU6IGJvb2xlYW47XG4gICAgZGVmYXVsdEhpZGRlbjogYm9vbGVhbjtcbn1cblxudHlwZSBUYWdBZXN0aGV0aWNzTWFwID0gUGFydGlhbDx7XG4gICAgW3RhZ0lkIGluIFRhZ0lEXTogSVRhZ0Flc3RoZXRpY3M7XG59PjtcblxuY29uc3QgYXV4QnV0dG9uQ29udGV4dE1lbnVQb3NpdGlvbiA9IChoYW5kbGU6IEhUTUxEaXZFbGVtZW50KTogTWVudVByb3BzID0+IHtcbiAgICBjb25zdCByZWN0ID0gaGFuZGxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNoZXZyb25GYWNlOiBDaGV2cm9uRmFjZS5Ob25lLFxuICAgICAgICBsZWZ0OiByZWN0LmxlZnQgLSA3LFxuICAgICAgICB0b3A6IHJlY3QudG9wICsgcmVjdC5oZWlnaHQsXG4gICAgfTtcbn07XG5cbmNvbnN0IERtQXV4QnV0dG9uOiBSZWFjdC5GQzxJQXV4QnV0dG9uUHJvcHM+ID0gKHsgdGFiSW5kZXgsIGRpc3BhdGNoZXIgPSBkZWZhdWx0RGlzcGF0Y2hlciB9KSA9PiB7XG4gICAgY29uc3QgW21lbnVEaXNwbGF5ZWQsIGhhbmRsZSwgb3Blbk1lbnUsIGNsb3NlTWVudV0gPSB1c2VDb250ZXh0TWVudTxIVE1MRGl2RWxlbWVudD4oKTtcbiAgICBjb25zdCBhY3RpdmVTcGFjZSA9IHVzZUV2ZW50RW1pdHRlclN0YXRlKFNwYWNlU3RvcmUuaW5zdGFuY2UsIFVQREFURV9TRUxFQ1RFRF9TUEFDRSwgKCkgPT4ge1xuICAgICAgICByZXR1cm4gU3BhY2VTdG9yZS5pbnN0YW5jZS5hY3RpdmVTcGFjZVJvb207XG4gICAgfSk7XG5cbiAgICBjb25zdCBzaG93Q3JlYXRlUm9vbXMgPSBzaG91bGRTaG93Q29tcG9uZW50KFVJQ29tcG9uZW50LkNyZWF0ZVJvb21zKTtcbiAgICBjb25zdCBzaG93SW52aXRlVXNlcnMgPSBzaG91bGRTaG93Q29tcG9uZW50KFVJQ29tcG9uZW50Lkludml0ZVVzZXJzKTtcblxuICAgIGlmIChhY3RpdmVTcGFjZSAmJiAoc2hvd0NyZWF0ZVJvb21zIHx8IHNob3dJbnZpdGVVc2VycykpIHtcbiAgICAgICAgbGV0IGNvbnRleHRNZW51OiBKU1guRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKG1lbnVEaXNwbGF5ZWQgJiYgaGFuZGxlLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbkludml0ZSA9IHNob3VsZFNob3dTcGFjZUludml0ZShhY3RpdmVTcGFjZSk7XG5cbiAgICAgICAgICAgIGNvbnRleHRNZW51ID0gKFxuICAgICAgICAgICAgICAgIDxJY29uaXplZENvbnRleHRNZW51IHsuLi5hdXhCdXR0b25Db250ZXh0TWVudVBvc2l0aW9uKGhhbmRsZS5jdXJyZW50KX0gb25GaW5pc2hlZD17Y2xvc2VNZW51fSBjb21wYWN0PlxuICAgICAgICAgICAgICAgICAgICA8SWNvbml6ZWRDb250ZXh0TWVudU9wdGlvbkxpc3QgZmlyc3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICB7c2hvd0NyZWF0ZVJvb21zICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SWNvbml6ZWRDb250ZXh0TWVudU9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJhY3Rpb258c3RhcnRfbmV3X2NoYXRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25DbGFzc05hbWU9XCJteF9Sb29tTGlzdF9pY29uU3RhcnRDaGF0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZU1lbnUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHREaXNwYXRjaGVyLmRpc3BhdGNoKHsgYWN0aW9uOiBcInZpZXdfY3JlYXRlX2NoYXRcIiB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3Rob2dUcmFja2Vycy50cmFja0ludGVyYWN0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiV2ViUm9vbUxpc3RSb29tc1N1Ymxpc3RQbHVzTWVudUNyZWF0ZUNoYXRJdGVtXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICB7c2hvd0ludml0ZVVzZXJzICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SWNvbml6ZWRDb250ZXh0TWVudU9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJhY3Rpb258aW52aXRlX3RvX3NwYWNlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uQ2xhc3NOYW1lPVwibXhfUm9vbUxpc3RfaWNvbkludml0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VNZW51KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93U3BhY2VJbnZpdGUoYWN0aXZlU3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWNhbkludml0ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9e2Nhbkludml0ZSA/IHVuZGVmaW5lZCA6IF90KFwic3BhY2VzfGVycm9yX25vX3Blcm1pc3Npb25faW52aXRlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA8L0ljb25pemVkQ29udGV4dE1lbnVPcHRpb25MaXN0PlxuICAgICAgICAgICAgICAgIDwvSWNvbml6ZWRDb250ZXh0TWVudT5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICA8Q29udGV4dE1lbnVUb29sdGlwQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHRhYkluZGV4PXt0YWJJbmRleH1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17b3Blbk1lbnV9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X1Jvb21TdWJsaXN0X2F1eEJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e190KFwiYWN0aW9ufGFkZF9wZW9wbGVcIil9XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPXtfdChcImFjdGlvbnxhZGRfcGVvcGxlXCIpfVxuICAgICAgICAgICAgICAgICAgICBpc0V4cGFuZGVkPXttZW51RGlzcGxheWVkfVxuICAgICAgICAgICAgICAgICAgICByZWY9e2hhbmRsZX1cbiAgICAgICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICAgICAge2NvbnRleHRNZW51fVxuICAgICAgICAgICAgPC8+XG4gICAgICAgICk7XG4gICAgfSBlbHNlIGlmICghYWN0aXZlU3BhY2UgJiYgc2hvd0NyZWF0ZVJvb21zKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvblxuICAgICAgICAgICAgICAgIHRhYkluZGV4PXt0YWJJbmRleH1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVyLmRpc3BhdGNoKHsgYWN0aW9uOiBcInZpZXdfY3JlYXRlX2NoYXRcIiB9KTtcbiAgICAgICAgICAgICAgICAgICAgUG9zdGhvZ1RyYWNrZXJzLnRyYWNrSW50ZXJhY3Rpb24oXCJXZWJSb29tTGlzdFJvb21zU3VibGlzdFBsdXNNZW51Q3JlYXRlQ2hhdEl0ZW1cIiwgZSk7XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9Sb29tU3VibGlzdF9hdXhCdXR0b25cIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e190KFwiYWN0aW9ufHN0YXJ0X2NoYXRcIil9XG4gICAgICAgICAgICAgICAgdGl0bGU9e190KFwiYWN0aW9ufHN0YXJ0X2NoYXRcIil9XG4gICAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufTtcblxuY29uc3QgVW50YWdnZWRBdXhCdXR0b246IFJlYWN0LkZDPElBdXhCdXR0b25Qcm9wcz4gPSAoeyB0YWJJbmRleCB9KSA9PiB7XG4gICAgY29uc3QgW21lbnVEaXNwbGF5ZWQsIGhhbmRsZSwgb3Blbk1lbnUsIGNsb3NlTWVudV0gPSB1c2VDb250ZXh0TWVudTxIVE1MRGl2RWxlbWVudD4oKTtcbiAgICBjb25zdCBhY3RpdmVTcGFjZSA9IHVzZUV2ZW50RW1pdHRlclN0YXRlPFJvb20gfCBudWxsPihTcGFjZVN0b3JlLmluc3RhbmNlLCBVUERBVEVfU0VMRUNURURfU1BBQ0UsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIFNwYWNlU3RvcmUuaW5zdGFuY2UuYWN0aXZlU3BhY2VSb29tO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2hvd0NyZWF0ZVJvb20gPSBzaG91bGRTaG93Q29tcG9uZW50KFVJQ29tcG9uZW50LkNyZWF0ZVJvb21zKTtcbiAgICBjb25zdCBzaG93RXhwbG9yZVJvb21zID0gc2hvdWxkU2hvd0NvbXBvbmVudChVSUNvbXBvbmVudC5FeHBsb3JlUm9vbXMpO1xuXG4gICAgY29uc3QgdmlkZW9Sb29tc0VuYWJsZWQgPSB1c2VGZWF0dXJlRW5hYmxlZChcImZlYXR1cmVfdmlkZW9fcm9vbXNcIik7XG4gICAgY29uc3QgZWxlbWVudENhbGxWaWRlb1Jvb21zRW5hYmxlZCA9IHVzZUZlYXR1cmVFbmFibGVkKFwiZmVhdHVyZV9lbGVtZW50X2NhbGxfdmlkZW9fcm9vbXNcIik7XG5cbiAgICBsZXQgY29udGV4dE1lbnVDb250ZW50OiBKU1guRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICBpZiAobWVudURpc3BsYXllZCAmJiBhY3RpdmVTcGFjZSkge1xuICAgICAgICBjb25zdCBjYW5BZGRSb29tcyA9IGFjdGl2ZVNwYWNlLmN1cnJlbnRTdGF0ZS5tYXlTZW5kU3RhdGVFdmVudChcbiAgICAgICAgICAgIEV2ZW50VHlwZS5TcGFjZUNoaWxkLFxuICAgICAgICAgICAgTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5nZXRTYWZlVXNlcklkKCksXG4gICAgICAgICk7XG5cbiAgICAgICAgY29udGV4dE1lbnVDb250ZW50ID0gKFxuICAgICAgICAgICAgPEljb25pemVkQ29udGV4dE1lbnVPcHRpb25MaXN0IGZpcnN0PlxuICAgICAgICAgICAgICAgIDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcImFjdGlvbnxleHBsb3JlX3Jvb21zXCIpfVxuICAgICAgICAgICAgICAgICAgICBpY29uQ2xhc3NOYW1lPVwibXhfUm9vbUxpc3RfaWNvbkV4cGxvcmVcIlxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlTWVudSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdERpc3BhdGNoZXIuZGlzcGF0Y2g8Vmlld1Jvb21QYXlsb2FkPih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBBY3Rpb24uVmlld1Jvb20sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vbV9pZDogYWN0aXZlU3BhY2Uucm9vbUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3NUcmlnZ2VyOiB1bmRlZmluZWQsIC8vIG90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFBvc3Rob2dUcmFja2Vycy50cmFja0ludGVyYWN0aW9uKFwiV2ViUm9vbUxpc3RSb29tc1N1Ymxpc3RQbHVzTWVudUV4cGxvcmVSb29tc0l0ZW1cIiwgZSk7XG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB7c2hvd0NyZWF0ZVJvb20gPyAoXG4gICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8SWNvbml6ZWRDb250ZXh0TWVudU9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcImFjdGlvbnxuZXdfcm9vbVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uQ2xhc3NOYW1lPVwibXhfUm9vbUxpc3RfaWNvbk5ld1Jvb21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VNZW51KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDcmVhdGVOZXdSb29tKGFjdGl2ZVNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zdGhvZ1RyYWNrZXJzLnRyYWNrSW50ZXJhY3Rpb24oXCJXZWJSb29tTGlzdFJvb21zU3VibGlzdFBsdXNNZW51Q3JlYXRlUm9vbUl0ZW1cIiwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWNhbkFkZFJvb21zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXtjYW5BZGRSb29tcyA/IHVuZGVmaW5lZCA6IF90KFwic3BhY2VzfGVycm9yX25vX3Blcm1pc3Npb25fY3JlYXRlX3Jvb21cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAge3ZpZGVvUm9vbXNFbmFibGVkICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SWNvbml6ZWRDb250ZXh0TWVudU9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJhY3Rpb258bmV3X3ZpZGVvX3Jvb21cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25DbGFzc05hbWU9XCJteF9Sb29tTGlzdF9pY29uTmV3VmlkZW9Sb29tXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZU1lbnUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDcmVhdGVOZXdSb29tKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNwYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRDYWxsVmlkZW9Sb29tc0VuYWJsZWQgPyBSb29tVHlwZS5VbnN0YWJsZUNhbGwgOiBSb29tVHlwZS5FbGVtZW50VmlkZW8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWNhbkFkZFJvb21zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT17Y2FuQWRkUm9vbXMgPyB1bmRlZmluZWQgOiBfdChcInNwYWNlc3xlcnJvcl9ub19wZXJtaXNzaW9uX2NyZWF0ZV9yb29tXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJldGFQaWxsIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9JY29uaXplZENvbnRleHRNZW51T3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwiYWN0aW9ufGFkZF9leGlzdGluZ19yb29tXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25DbGFzc05hbWU9XCJteF9Sb29tTGlzdF9pY29uQWRkRXhpc3RpbmdSb29tXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlTWVudSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWRkRXhpc3RpbmdSb29tcyhhY3RpdmVTcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWNhbkFkZFJvb21zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXtjYW5BZGRSb29tcyA/IHVuZGVmaW5lZCA6IF90KFwic3BhY2VzfGVycm9yX25vX3Blcm1pc3Npb25fYWRkX3Jvb21cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIDwvSWNvbml6ZWRDb250ZXh0TWVudU9wdGlvbkxpc3Q+XG4gICAgICAgICk7XG4gICAgfSBlbHNlIGlmIChtZW51RGlzcGxheWVkKSB7XG4gICAgICAgIGNvbnRleHRNZW51Q29udGVudCA9IChcbiAgICAgICAgICAgIDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uTGlzdCBmaXJzdD5cbiAgICAgICAgICAgICAgICB7c2hvd0NyZWF0ZVJvb20gJiYgKFxuICAgICA