UNPKG

matrix-react-sdk

Version:
177 lines (173 loc) 30.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _compoundWeb = require("@vector-im/compound-web"); var _plus = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/plus")); var _extensions = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/extensions")); var _BaseCard = _interopRequireDefault(require("./BaseCard")); var _WidgetUtils = _interopRequireWildcard(require("../../../utils/WidgetUtils")); var _languageHandler = require("../../../languageHandler"); var _ContextMenu = require("../../structures/ContextMenu"); var _WidgetContextMenu = require("../context_menus/WidgetContextMenu"); var _UIStore = _interopRequireDefault(require("../../../stores/UIStore")); var _RightPanelStore = _interopRequireDefault(require("../../../stores/right-panel/RightPanelStore")); var _RightPanelStorePhases = require("../../../stores/right-panel/RightPanelStorePhases"); var _WidgetLayoutStore = require("../../../stores/widgets/WidgetLayoutStore"); var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton")); var _WidgetAvatar = _interopRequireDefault(require("../avatars/WidgetAvatar")); var _IntegrationManagers = require("../../../integrations/IntegrationManagers"); var _EmptyState = _interopRequireDefault(require("./EmptyState")); 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 2024 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 AppRow = ({ app, room }) => { const name = _WidgetUtils.default.getWidgetName(app); const [canModifyWidget, setCanModifyWidget] = (0, _react.useState)(); (0, _react.useEffect)(() => { setCanModifyWidget(_WidgetUtils.default.canUserModifyWidgets(room.client, room.roomId)); }, [room.client, room.roomId]); const onOpenWidgetClick = () => { _RightPanelStore.default.instance.pushCard({ phase: _RightPanelStorePhases.RightPanelPhases.Widget, state: { widgetId: app.id } }); }; const isPinned = _WidgetLayoutStore.WidgetLayoutStore.instance.isInContainer(room, app, _WidgetLayoutStore.Container.Top); const togglePin = isPinned ? () => { _WidgetLayoutStore.WidgetLayoutStore.instance.moveToContainer(room, app, _WidgetLayoutStore.Container.Right); } : () => { _WidgetLayoutStore.WidgetLayoutStore.instance.moveToContainer(room, app, _WidgetLayoutStore.Container.Top); }; const [menuDisplayed, handle, openMenu, closeMenu] = (0, _ContextMenu.useContextMenu)(); let contextMenu; if (menuDisplayed) { const rect = handle.current?.getBoundingClientRect(); const rightMargin = rect?.right ?? 0; const topMargin = rect?.top ?? 0; contextMenu = /*#__PURE__*/_react.default.createElement(_WidgetContextMenu.WidgetContextMenu, { chevronFace: _ContextMenu.ChevronFace.None, right: _UIStore.default.instance.windowWidth - rightMargin, bottom: _UIStore.default.instance.windowHeight - topMargin, onFinished: closeMenu, app: app }); } const cannotPin = !isPinned && !_WidgetLayoutStore.WidgetLayoutStore.instance.canAddToContainer(room, _WidgetLayoutStore.Container.Top); let pinTitle; if (cannotPin) { pinTitle = (0, _languageHandler._t)("right_panel|pinned_messages|limits", { count: _WidgetLayoutStore.MAX_PINNED }); } else { pinTitle = isPinned ? (0, _languageHandler._t)("action|unpin") : (0, _languageHandler._t)("action|pin"); } const isMaximised = _WidgetLayoutStore.WidgetLayoutStore.instance.isInContainer(room, app, _WidgetLayoutStore.Container.Center); let openTitle = ""; if (isPinned) { openTitle = (0, _languageHandler._t)("widget|unpin_to_view_right_panel"); } else if (isMaximised) { openTitle = (0, _languageHandler._t)("widget|close_to_view_right_panel"); } const classes = (0, _classnames.default)("mx_BaseCard_Button mx_ExtensionsCard_Button", { mx_ExtensionsCard_Button_pinned: isPinned }); return /*#__PURE__*/_react.default.createElement("div", { className: classes, ref: handle }, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: "mx_ExtensionsCard_icon_app", onClick: onOpenWidgetClick // only show a tooltip if the widget is pinned , title: !(isPinned || isMaximised) ? undefined : openTitle, disabled: isPinned || isMaximised }, /*#__PURE__*/_react.default.createElement(_WidgetAvatar.default, { app: app, size: "24px" }), /*#__PURE__*/_react.default.createElement(_compoundWeb.Text, { size: "md", weight: "medium", className: "mx_lineClamp" }, name)), canModifyWidget && /*#__PURE__*/_react.default.createElement(_ContextMenu.ContextMenuTooltipButton, { className: "mx_ExtensionsCard_app_options", isExpanded: menuDisplayed, onClick: openMenu, title: (0, _languageHandler._t)("common|options") }), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: "mx_ExtensionsCard_app_pinToggle", onClick: togglePin, title: pinTitle, disabled: cannotPin }), contextMenu); }; /** * A right panel card displaying a list of widgets in the room and allowing the user to manage them. * @param room the room to manage widgets for * @param onClose callback when the card is closed */ const ExtensionsCard = ({ room, onClose }) => { const apps = (0, _WidgetUtils.useWidgets)(room); // Filter out virtual widgets const realApps = (0, _react.useMemo)(() => apps.filter(app => app.eventId !== undefined), [apps]); const onManageIntegrations = () => { const managers = _IntegrationManagers.IntegrationManagers.sharedInstance(); if (!managers.hasManager()) { managers.openNoManagerDialog(); } else { // noinspection JSIgnoredPromiseFromCall managers.getPrimaryManager()?.open(room); } }; let body; if (realApps.length < 1) { body = /*#__PURE__*/_react.default.createElement(_EmptyState.default, { Icon: _extensions.default, title: (0, _languageHandler._t)("right_panel|extensions_empty_title"), description: (0, _languageHandler._t)("right_panel|extensions_empty_description", { addIntegrations: (0, _languageHandler._t)("right_panel|add_integrations") }) }); } else { let copyLayoutBtn = null; if (_WidgetLayoutStore.WidgetLayoutStore.instance.canCopyLayoutToRoom(room)) { copyLayoutBtn = /*#__PURE__*/_react.default.createElement(_compoundWeb.Link, { onClick: () => _WidgetLayoutStore.WidgetLayoutStore.instance.copyLayoutToRoom(room) }, (0, _languageHandler._t)("widget|set_room_layout")); } body = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_compoundWeb.Separator, null), realApps.map(app => /*#__PURE__*/_react.default.createElement(AppRow, { key: app.id, app: app, room: room })), copyLayoutBtn); } return /*#__PURE__*/_react.default.createElement(_BaseCard.default, { header: (0, _languageHandler._t)("right_panel|extensions_button"), className: "mx_ExtensionsCard", onClose: onClose }, /*#__PURE__*/_react.default.createElement(_compoundWeb.Button, { size: "sm", onClick: onManageIntegrations, kind: "secondary", Icon: _plus.default }, (0, _languageHandler._t)("right_panel|add_integrations")), body); }; var _default = exports.default = ExtensionsCard; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY29tcG91bmRXZWIiLCJfcGx1cyIsIl9leHRlbnNpb25zIiwiX0Jhc2VDYXJkIiwiX1dpZGdldFV0aWxzIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9Db250ZXh0TWVudSIsIl9XaWRnZXRDb250ZXh0TWVudSIsIl9VSVN0b3JlIiwiX1JpZ2h0UGFuZWxTdG9yZSIsIl9SaWdodFBhbmVsU3RvcmVQaGFzZXMiLCJfV2lkZ2V0TGF5b3V0U3RvcmUiLCJfQWNjZXNzaWJsZUJ1dHRvbiIsIl9XaWRnZXRBdmF0YXIiLCJfSW50ZWdyYXRpb25NYW5hZ2VycyIsIl9FbXB0eVN0YXRlIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiQXBwUm93IiwiYXBwIiwicm9vbSIsIm5hbWUiLCJXaWRnZXRVdGlscyIsImdldFdpZGdldE5hbWUiLCJjYW5Nb2RpZnlXaWRnZXQiLCJzZXRDYW5Nb2RpZnlXaWRnZXQiLCJ1c2VTdGF0ZSIsInVzZUVmZmVjdCIsImNhblVzZXJNb2RpZnlXaWRnZXRzIiwiY2xpZW50Iiwicm9vbUlkIiwib25PcGVuV2lkZ2V0Q2xpY2siLCJSaWdodFBhbmVsU3RvcmUiLCJpbnN0YW5jZSIsInB1c2hDYXJkIiwicGhhc2UiLCJSaWdodFBhbmVsUGhhc2VzIiwiV2lkZ2V0Iiwic3RhdGUiLCJ3aWRnZXRJZCIsImlkIiwiaXNQaW5uZWQiLCJXaWRnZXRMYXlvdXRTdG9yZSIsImlzSW5Db250YWluZXIiLCJDb250YWluZXIiLCJUb3AiLCJ0b2dnbGVQaW4iLCJtb3ZlVG9Db250YWluZXIiLCJSaWdodCIsIm1lbnVEaXNwbGF5ZWQiLCJoYW5kbGUiLCJvcGVuTWVudSIsImNsb3NlTWVudSIsInVzZUNvbnRleHRNZW51IiwiY29udGV4dE1lbnUiLCJyZWN0IiwiY3VycmVudCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInJpZ2h0TWFyZ2luIiwicmlnaHQiLCJ0b3BNYXJnaW4iLCJ0b3AiLCJjcmVhdGVFbGVtZW50IiwiV2lkZ2V0Q29udGV4dE1lbnUiLCJjaGV2cm9uRmFjZSIsIkNoZXZyb25GYWNlIiwiTm9uZSIsIlVJU3RvcmUiLCJ3aW5kb3dXaWR0aCIsImJvdHRvbSIsIndpbmRvd0hlaWdodCIsIm9uRmluaXNoZWQiLCJjYW5ub3RQaW4iLCJjYW5BZGRUb0NvbnRhaW5lciIsInBpblRpdGxlIiwiX3QiLCJjb3VudCIsIk1BWF9QSU5ORUQiLCJpc01heGltaXNlZCIsIkNlbnRlciIsIm9wZW5UaXRsZSIsImNsYXNzZXMiLCJjbGFzc05hbWVzIiwibXhfRXh0ZW5zaW9uc0NhcmRfQnV0dG9uX3Bpbm5lZCIsImNsYXNzTmFtZSIsInJlZiIsIm9uQ2xpY2siLCJ0aXRsZSIsInVuZGVmaW5lZCIsImRpc2FibGVkIiwic2l6ZSIsIlRleHQiLCJ3ZWlnaHQiLCJDb250ZXh0TWVudVRvb2x0aXBCdXR0b24iLCJpc0V4cGFuZGVkIiwiRXh0ZW5zaW9uc0NhcmQiLCJvbkNsb3NlIiwiYXBwcyIsInVzZVdpZGdldHMiLCJyZWFsQXBwcyIsInVzZU1lbW8iLCJmaWx0ZXIiLCJldmVudElkIiwib25NYW5hZ2VJbnRlZ3JhdGlvbnMiLCJtYW5hZ2VycyIsIkludGVncmF0aW9uTWFuYWdlcnMiLCJzaGFyZWRJbnN0YW5jZSIsImhhc01hbmFnZXIiLCJvcGVuTm9NYW5hZ2VyRGlhbG9nIiwiZ2V0UHJpbWFyeU1hbmFnZXIiLCJvcGVuIiwiYm9keSIsImxlbmd0aCIsIkljb24iLCJFeHRlbnNpb25zSWNvbiIsImRlc2NyaXB0aW9uIiwiYWRkSW50ZWdyYXRpb25zIiwiY29weUxheW91dEJ0biIsImNhbkNvcHlMYXlvdXRUb1Jvb20iLCJMaW5rIiwiY29weUxheW91dFRvUm9vbSIsIkZyYWdtZW50IiwiU2VwYXJhdG9yIiwibWFwIiwia2V5IiwiaGVhZGVyIiwiQnV0dG9uIiwia2luZCIsIlBsdXNJY29uIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3MvcmlnaHRfcGFuZWwvRXh0ZW5zaW9uc0NhcmQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDI0IFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBSb29tIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSBcImNsYXNzbmFtZXNcIjtcbmltcG9ydCB7IEJ1dHRvbiwgTGluaywgU2VwYXJhdG9yLCBUZXh0IH0gZnJvbSBcIkB2ZWN0b3ItaW0vY29tcG91bmQtd2ViXCI7XG5pbXBvcnQgUGx1c0ljb24gZnJvbSBcIkB2ZWN0b3ItaW0vY29tcG91bmQtZGVzaWduLXRva2Vucy9hc3NldHMvd2ViL2ljb25zL3BsdXNcIjtcbmltcG9ydCBFeHRlbnNpb25zSWNvbiBmcm9tIFwiQHZlY3Rvci1pbS9jb21wb3VuZC1kZXNpZ24tdG9rZW5zL2Fzc2V0cy93ZWIvaWNvbnMvZXh0ZW5zaW9uc1wiO1xuXG5pbXBvcnQgQmFzZUNhcmQgZnJvbSBcIi4vQmFzZUNhcmRcIjtcbmltcG9ydCBXaWRnZXRVdGlscywgeyB1c2VXaWRnZXRzIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL1dpZGdldFV0aWxzXCI7XG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7IENoZXZyb25GYWNlLCBDb250ZXh0TWVudVRvb2x0aXBCdXR0b24sIHVzZUNvbnRleHRNZW51IH0gZnJvbSBcIi4uLy4uL3N0cnVjdHVyZXMvQ29udGV4dE1lbnVcIjtcbmltcG9ydCB7IFdpZGdldENvbnRleHRNZW51IH0gZnJvbSBcIi4uL2NvbnRleHRfbWVudXMvV2lkZ2V0Q29udGV4dE1lbnVcIjtcbmltcG9ydCBVSVN0b3JlIGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvVUlTdG9yZVwiO1xuaW1wb3J0IFJpZ2h0UGFuZWxTdG9yZSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL3JpZ2h0LXBhbmVsL1JpZ2h0UGFuZWxTdG9yZVwiO1xuaW1wb3J0IHsgSUFwcCB9IGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvV2lkZ2V0U3RvcmVcIjtcbmltcG9ydCB7IFJpZ2h0UGFuZWxQaGFzZXMgfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL3JpZ2h0LXBhbmVsL1JpZ2h0UGFuZWxTdG9yZVBoYXNlc1wiO1xuaW1wb3J0IHsgQ29udGFpbmVyLCBNQVhfUElOTkVELCBXaWRnZXRMYXlvdXRTdG9yZSB9IGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvd2lkZ2V0cy9XaWRnZXRMYXlvdXRTdG9yZVwiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24gZnJvbSBcIi4uL2VsZW1lbnRzL0FjY2Vzc2libGVCdXR0b25cIjtcbmltcG9ydCBXaWRnZXRBdmF0YXIgZnJvbSBcIi4uL2F2YXRhcnMvV2lkZ2V0QXZhdGFyXCI7XG5pbXBvcnQgeyBJbnRlZ3JhdGlvbk1hbmFnZXJzIH0gZnJvbSBcIi4uLy4uLy4uL2ludGVncmF0aW9ucy9JbnRlZ3JhdGlvbk1hbmFnZXJzXCI7XG5pbXBvcnQgRW1wdHlTdGF0ZSBmcm9tIFwiLi9FbXB0eVN0YXRlXCI7XG5cbmludGVyZmFjZSBQcm9wcyB7XG4gICAgcm9vbTogUm9vbTtcbiAgICBvbkNsb3NlKCk6IHZvaWQ7XG59XG5cbmludGVyZmFjZSBJQXBwUm93UHJvcHMge1xuICAgIGFwcDogSUFwcDtcbiAgICByb29tOiBSb29tO1xufVxuXG5jb25zdCBBcHBSb3c6IFJlYWN0LkZDPElBcHBSb3dQcm9wcz4gPSAoeyBhcHAsIHJvb20gfSkgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSBXaWRnZXRVdGlscy5nZXRXaWRnZXROYW1lKGFwcCk7XG4gICAgY29uc3QgW2Nhbk1vZGlmeVdpZGdldCwgc2V0Q2FuTW9kaWZ5V2lkZ2V0XSA9IHVzZVN0YXRlPGJvb2xlYW4+KCk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBzZXRDYW5Nb2RpZnlXaWRnZXQoV2lkZ2V0VXRpbHMuY2FuVXNlck1vZGlmeVdpZGdldHMocm9vbS5jbGllbnQsIHJvb20ucm9vbUlkKSk7XG4gICAgfSwgW3Jvb20uY2xpZW50LCByb29tLnJvb21JZF0pO1xuXG4gICAgY29uc3Qgb25PcGVuV2lkZ2V0Q2xpY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIFJpZ2h0UGFuZWxTdG9yZS5pbnN0YW5jZS5wdXNoQ2FyZCh7XG4gICAgICAgICAgICBwaGFzZTogUmlnaHRQYW5lbFBoYXNlcy5XaWRnZXQsXG4gICAgICAgICAgICBzdGF0ZTogeyB3aWRnZXRJZDogYXBwLmlkIH0sXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBpc1Bpbm5lZCA9IFdpZGdldExheW91dFN0b3JlLmluc3RhbmNlLmlzSW5Db250YWluZXIocm9vbSwgYXBwLCBDb250YWluZXIuVG9wKTtcbiAgICBjb25zdCB0b2dnbGVQaW4gPSBpc1Bpbm5lZFxuICAgICAgICA/ICgpID0+IHtcbiAgICAgICAgICAgICAgV2lkZ2V0TGF5b3V0U3RvcmUuaW5zdGFuY2UubW92ZVRvQ29udGFpbmVyKHJvb20sIGFwcCwgQ29udGFpbmVyLlJpZ2h0KTtcbiAgICAgICAgICB9XG4gICAgICAgIDogKCkgPT4ge1xuICAgICAgICAgICAgICBXaWRnZXRMYXlvdXRTdG9yZS5pbnN0YW5jZS5tb3ZlVG9Db250YWluZXIocm9vbSwgYXBwLCBDb250YWluZXIuVG9wKTtcbiAgICAgICAgICB9O1xuXG4gICAgY29uc3QgW21lbnVEaXNwbGF5ZWQsIGhhbmRsZSwgb3Blbk1lbnUsIGNsb3NlTWVudV0gPSB1c2VDb250ZXh0TWVudTxIVE1MRGl2RWxlbWVudD4oKTtcbiAgICBsZXQgY29udGV4dE1lbnU7XG4gICAgaWYgKG1lbnVEaXNwbGF5ZWQpIHtcbiAgICAgICAgY29uc3QgcmVjdCA9IGhhbmRsZS5jdXJyZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgcmlnaHRNYXJnaW4gPSByZWN0Py5yaWdodCA/PyAwO1xuICAgICAgICBjb25zdCB0b3BNYXJnaW4gPSByZWN0Py50b3AgPz8gMDtcbiAgICAgICAgY29udGV4dE1lbnUgPSAoXG4gICAgICAgICAgICA8V2lkZ2V0Q29udGV4dE1lbnVcbiAgICAgICAgICAgICAgICBjaGV2cm9uRmFjZT17Q2hldnJvbkZhY2UuTm9uZX1cbiAgICAgICAgICAgICAgICByaWdodD17VUlTdG9yZS5pbnN0YW5jZS53aW5kb3dXaWR0aCAtIHJpZ2h0TWFyZ2lufVxuICAgICAgICAgICAgICAgIGJvdHRvbT17VUlTdG9yZS5pbnN0YW5jZS53aW5kb3dIZWlnaHQgLSB0b3BNYXJnaW59XG4gICAgICAgICAgICAgICAgb25GaW5pc2hlZD17Y2xvc2VNZW51fVxuICAgICAgICAgICAgICAgIGFwcD17YXBwfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjYW5ub3RQaW4gPSAhaXNQaW5uZWQgJiYgIVdpZGdldExheW91dFN0b3JlLmluc3RhbmNlLmNhbkFkZFRvQ29udGFpbmVyKHJvb20sIENvbnRhaW5lci5Ub3ApO1xuXG4gICAgbGV0IHBpblRpdGxlOiBzdHJpbmc7XG4gICAgaWYgKGNhbm5vdFBpbikge1xuICAgICAgICBwaW5UaXRsZSA9IF90KFwicmlnaHRfcGFuZWx8cGlubmVkX21lc3NhZ2VzfGxpbWl0c1wiLCB7IGNvdW50OiBNQVhfUElOTkVEIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHBpblRpdGxlID0gaXNQaW5uZWQgPyBfdChcImFjdGlvbnx1bnBpblwiKSA6IF90KFwiYWN0aW9ufHBpblwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc01heGltaXNlZCA9IFdpZGdldExheW91dFN0b3JlLmluc3RhbmNlLmlzSW5Db250YWluZXIocm9vbSwgYXBwLCBDb250YWluZXIuQ2VudGVyKTtcblxuICAgIGxldCBvcGVuVGl0bGUgPSBcIlwiO1xuICAgIGlmIChpc1Bpbm5lZCkge1xuICAgICAgICBvcGVuVGl0bGUgPSBfdChcIndpZGdldHx1bnBpbl90b192aWV3X3JpZ2h0X3BhbmVsXCIpO1xuICAgIH0gZWxzZSBpZiAoaXNNYXhpbWlzZWQpIHtcbiAgICAgICAgb3BlblRpdGxlID0gX3QoXCJ3aWRnZXR8Y2xvc2VfdG9fdmlld19yaWdodF9wYW5lbFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbGFzc2VzID0gY2xhc3NOYW1lcyhcIm14X0Jhc2VDYXJkX0J1dHRvbiBteF9FeHRlbnNpb25zQ2FyZF9CdXR0b25cIiwge1xuICAgICAgICBteF9FeHRlbnNpb25zQ2FyZF9CdXR0b25fcGlubmVkOiBpc1Bpbm5lZCxcbiAgICB9KTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc2VzfSByZWY9e2hhbmRsZX0+XG4gICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0V4dGVuc2lvbnNDYXJkX2ljb25fYXBwXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtvbk9wZW5XaWRnZXRDbGlja31cbiAgICAgICAgICAgICAgICAvLyBvbmx5IHNob3cgYSB0b29sdGlwIGlmIHRoZSB3aWRnZXQgaXMgcGlubmVkXG4gICAgICAgICAgICAgICAgdGl0bGU9eyEoaXNQaW5uZWQgfHwgaXNNYXhpbWlzZWQpID8gdW5kZWZpbmVkIDogb3BlblRpdGxlfVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc1Bpbm5lZCB8fCBpc01heGltaXNlZH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8V2lkZ2V0QXZhdGFyIGFwcD17YXBwfSBzaXplPVwiMjRweFwiIC8+XG4gICAgICAgICAgICAgICAgPFRleHQgc2l6ZT1cIm1kXCIgd2VpZ2h0PVwibWVkaXVtXCIgY2xhc3NOYW1lPVwibXhfbGluZUNsYW1wXCI+XG4gICAgICAgICAgICAgICAgICAgIHtuYW1lfVxuICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cblxuICAgICAgICAgICAge2Nhbk1vZGlmeVdpZGdldCAmJiAoXG4gICAgICAgICAgICAgICAgPENvbnRleHRNZW51VG9vbHRpcEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9FeHRlbnNpb25zQ2FyZF9hcHBfb3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgIGlzRXhwYW5kZWQ9e21lbnVEaXNwbGF5ZWR9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29wZW5NZW51fVxuICAgICAgICAgICAgICAgICAgICB0aXRsZT17X3QoXCJjb21tb258b3B0aW9uc1wiKX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b25cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9FeHRlbnNpb25zQ2FyZF9hcHBfcGluVG9nZ2xlXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0b2dnbGVQaW59XG4gICAgICAgICAgICAgICAgdGl0bGU9e3BpblRpdGxlfVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXtjYW5ub3RQaW59XG4gICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICB7Y29udGV4dE1lbnV9XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59O1xuXG4vKipcbiAqIEEgcmlnaHQgcGFuZWwgY2FyZCBkaXNwbGF5aW5nIGEgbGlzdCBvZiB3aWRnZXRzIGluIHRoZSByb29tIGFuZCBhbGxvd2luZyB0aGUgdXNlciB0byBtYW5hZ2UgdGhlbS5cbiAqIEBwYXJhbSByb29tIHRoZSByb29tIHRvIG1hbmFnZSB3aWRnZXRzIGZvclxuICogQHBhcmFtIG9uQ2xvc2UgY2FsbGJhY2sgd2hlbiB0aGUgY2FyZCBpcyBjbG9zZWRcbiAqL1xuY29uc3QgRXh0ZW5zaW9uc0NhcmQ6IFJlYWN0LkZDPFByb3BzPiA9ICh7IHJvb20sIG9uQ2xvc2UgfSkgPT4ge1xuICAgIGNvbnN0IGFwcHMgPSB1c2VXaWRnZXRzKHJvb20pO1xuICAgIC8vIEZpbHRlciBvdXQgdmlydHVhbCB3aWRnZXRzXG4gICAgY29uc3QgcmVhbEFwcHMgPSB1c2VNZW1vKCgpID0+IGFwcHMuZmlsdGVyKChhcHApID0+IGFwcC5ldmVudElkICE9PSB1bmRlZmluZWQpLCBbYXBwc10pO1xuXG4gICAgY29uc3Qgb25NYW5hZ2VJbnRlZ3JhdGlvbnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IG1hbmFnZXJzID0gSW50ZWdyYXRpb25NYW5hZ2Vycy5zaGFyZWRJbnN0YW5jZSgpO1xuICAgICAgICBpZiAoIW1hbmFnZXJzLmhhc01hbmFnZXIoKSkge1xuICAgICAgICAgICAgbWFuYWdlcnMub3Blbk5vTWFuYWdlckRpYWxvZygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEpTSWdub3JlZFByb21pc2VGcm9tQ2FsbFxuICAgICAgICAgICAgbWFuYWdlcnMuZ2V0UHJpbWFyeU1hbmFnZXIoKT8ub3Blbihyb29tKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBsZXQgYm9keTogSlNYLkVsZW1lbnQ7XG4gICAgaWYgKHJlYWxBcHBzLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgYm9keSA9IChcbiAgICAgICAgICAgIDxFbXB0eVN0YXRlXG4gICAgICAgICAgICAgICAgSWNvbj17RXh0ZW5zaW9uc0ljb259XG4gICAgICAgICAgICAgICAgdGl0bGU9e190KFwicmlnaHRfcGFuZWx8ZXh0ZW5zaW9uc19lbXB0eV90aXRsZVwiKX1cbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj17X3QoXCJyaWdodF9wYW5lbHxleHRlbnNpb25zX2VtcHR5X2Rlc2NyaXB0aW9uXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkSW50ZWdyYXRpb25zOiBfdChcInJpZ2h0X3BhbmVsfGFkZF9pbnRlZ3JhdGlvbnNcIiksXG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjb3B5TGF5b3V0QnRuOiBKU1guRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgICAgICBpZiAoV2lkZ2V0TGF5b3V0U3RvcmUuaW5zdGFuY2UuY2FuQ29weUxheW91dFRvUm9vbShyb29tKSkge1xuICAgICAgICAgICAgY29weUxheW91dEJ0biA9IChcbiAgICAgICAgICAgICAgICA8TGluayBvbkNsaWNrPXsoKSA9PiBXaWRnZXRMYXlvdXRTdG9yZS5pbnN0YW5jZS5jb3B5TGF5b3V0VG9Sb29tKHJvb20pfT5cbiAgICAgICAgICAgICAgICAgICAge190KFwid2lkZ2V0fHNldF9yb29tX2xheW91dFwiKX1cbiAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgYm9keSA9IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgPFNlcGFyYXRvciAvPlxuICAgICAgICAgICAgICAgIHtyZWFsQXBwcy5tYXAoKGFwcCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8QXBwUm93IGtleT17YXBwLmlkfSBhcHA9e2FwcH0gcm9vbT17cm9vbX0gLz5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICB7Y29weUxheW91dEJ0bn1cbiAgICAgICAgICAgIDwvPlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAgIDxCYXNlQ2FyZCBoZWFkZXI9e190KFwicmlnaHRfcGFuZWx8ZXh0ZW5zaW9uc19idXR0b25cIil9IGNsYXNzTmFtZT1cIm14X0V4dGVuc2lvbnNDYXJkXCIgb25DbG9zZT17b25DbG9zZX0+XG4gICAgICAgICAgICA8QnV0dG9uIHNpemU9XCJzbVwiIG9uQ2xpY2s9e29uTWFuYWdlSW50ZWdyYXRpb25zfSBraW5kPVwic2Vjb25kYXJ5XCIgSWNvbj17UGx1c0ljb259PlxuICAgICAgICAgICAgICAgIHtfdChcInJpZ2h0X3BhbmVsfGFkZF9pbnRlZ3JhdGlvbnNcIil9XG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgIHtib2R5fVxuICAgICAgICA8L0Jhc2VDYXJkPlxuICAgICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBFeHRlbnNpb25zQ2FyZDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQVFBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLFlBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLEtBQUEsR0FBQUYsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFLLFdBQUEsR0FBQUgsc0JBQUEsQ0FBQUYsT0FBQTtBQUVBLElBQUFNLFNBQUEsR0FBQUosc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFPLFlBQUEsR0FBQVIsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFRLGdCQUFBLEdBQUFSLE9B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