UNPKG

matrix-react-sdk

Version:
190 lines (187 loc) 28.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.StateEventEditor = exports.RoomStateExplorer = void 0; var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _languageHandler = require("../../../../languageHandler"); var _BaseTool = _interopRequireWildcard(require("./BaseTool")); var _MatrixClientContext = _interopRequireDefault(require("../../../../contexts/MatrixClientContext")); var _Event = require("./Event"); var _FilteredList = _interopRequireDefault(require("./FilteredList")); var _Spinner = _interopRequireDefault(require("../../elements/Spinner")); var _SyntaxHighlight = _interopRequireDefault(require("../../elements/SyntaxHighlight")); var _useAsyncMemo = require("../../../../hooks/useAsyncMemo"); 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 2023 The Matrix.org Foundation C.I.C. Copyright 2022 Michael Telatynski <7t3chguy@gmail.com> SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ const StateEventEditor = ({ mxEvent, onBack }) => { const context = (0, _react.useContext)(_BaseTool.DevtoolsContext); const cli = (0, _react.useContext)(_MatrixClientContext.default); const fields = (0, _react.useMemo)(() => [(0, _Event.eventTypeField)(mxEvent?.getType()), (0, _Event.stateKeyField)(mxEvent?.getStateKey())], [mxEvent]); const onSend = async ([eventType, stateKey], content) => { await cli.sendStateEvent(context.room.roomId, eventType, content, stateKey); }; const defaultContent = mxEvent ? (0, _Event.stringify)(mxEvent.getContent()) : undefined; return /*#__PURE__*/_react.default.createElement(_Event.EventEditor, { fieldDefs: fields, defaultContent: defaultContent, onSend: onSend, onBack: onBack }); }; exports.StateEventEditor = StateEventEditor; const RoomStateHistory = ({ mxEvent, onBack }) => { const cli = (0, _react.useContext)(_MatrixClientContext.default); const events = (0, _useAsyncMemo.useAsyncMemo)(async () => { const events = [mxEvent.event]; while (!!events[0].unsigned?.replaces_state) { try { events.unshift(await cli.fetchRoomEvent(mxEvent.getRoomId(), events[0].unsigned.replaces_state)); } catch (e) { events.unshift({ event_id: events[0].unsigned.replaces_state, unsigned: { error: e instanceof Error ? e.message : String(e) } }); } } return events; }, [cli, mxEvent], null); let body = /*#__PURE__*/_react.default.createElement(_Spinner.default, null); if (events !== null) { body = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, events.map(ev => /*#__PURE__*/_react.default.createElement(_SyntaxHighlight.default, { language: "json", key: ev.event_id }, (0, _Event.stringify)(ev)))); } return /*#__PURE__*/_react.default.createElement(_BaseTool.default, { onBack: onBack }, body); }; const StateEventButton = ({ label, onClick }) => { const trimmed = label.trim(); let content = label; if (!trimmed) { content = label.length > 0 ? (0, _languageHandler._t)("devtools|spaces", { count: label.length }) : (0, _languageHandler._t)("devtools|empty_string"); } return /*#__PURE__*/_react.default.createElement("button", { className: (0, _classnames.default)("mx_DevTools_button", { mx_DevTools_RoomStateExplorer_button_hasSpaces: trimmed.length !== label.length, mx_DevTools_RoomStateExplorer_button_emptyString: !trimmed }), onClick: onClick }, content); }; const RoomStateExplorerEventType = ({ eventType, onBack }) => { const context = (0, _react.useContext)(_BaseTool.DevtoolsContext); const [query, setQuery] = (0, _react.useState)(""); const [event, setEvent] = (0, _react.useState)(null); const [history, setHistory] = (0, _react.useState)(false); const events = context.room.currentState.events.get(eventType); (0, _react.useEffect)(() => { if (events.size === 1 && events.has("")) { setEvent(events.get("")); } else { setEvent(null); } }, [events]); if (event && history) { const _onBack = () => { setHistory(false); }; return /*#__PURE__*/_react.default.createElement(RoomStateHistory, { mxEvent: event, onBack: _onBack }); } if (event) { const _onBack = () => { if (events?.size === 1 && events.has("")) { onBack(); } else { setEvent(null); } }; const onHistoryClick = () => { setHistory(true); }; const extraButton = /*#__PURE__*/_react.default.createElement("button", { onClick: onHistoryClick }, (0, _languageHandler._t)("devtools|see_history")); return /*#__PURE__*/_react.default.createElement(_Event.EventViewer, { mxEvent: event, onBack: _onBack, Editor: StateEventEditor, extraButton: extraButton }); } return /*#__PURE__*/_react.default.createElement(_BaseTool.default, { onBack: onBack }, /*#__PURE__*/_react.default.createElement(_FilteredList.default, { query: query, onChange: setQuery }, Array.from(events.entries()).map(([stateKey, ev]) => /*#__PURE__*/_react.default.createElement(StateEventButton, { key: stateKey, label: stateKey, onClick: () => setEvent(ev) })))); }; const RoomStateExplorer = ({ onBack, setTool }) => { const context = (0, _react.useContext)(_BaseTool.DevtoolsContext); const [query, setQuery] = (0, _react.useState)(""); const [eventType, setEventType] = (0, _react.useState)(null); const events = context.room.currentState.events; if (eventType !== null) { const onBack = () => { setEventType(null); }; return /*#__PURE__*/_react.default.createElement(RoomStateExplorerEventType, { eventType: eventType, onBack: onBack }); } const onAction = async () => { setTool((0, _languageHandler._td)("devtools|send_custom_state_event"), StateEventEditor); }; return /*#__PURE__*/_react.default.createElement(_BaseTool.default, { onBack: onBack, actionLabel: (0, _languageHandler._td)("devtools|send_custom_state_event"), onAction: onAction }, /*#__PURE__*/_react.default.createElement(_FilteredList.default, { query: query, onChange: setQuery }, Array.from(events.keys()).map(eventType => /*#__PURE__*/_react.default.createElement(StateEventButton, { key: eventType, label: eventType, onClick: () => setEventType(eventType) })))); }; exports.RoomStateExplorer = RoomStateExplorer; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX0Jhc2VUb29sIiwiX01hdHJpeENsaWVudENvbnRleHQiLCJfRXZlbnQiLCJfRmlsdGVyZWRMaXN0IiwiX1NwaW5uZXIiLCJfU3ludGF4SGlnaGxpZ2h0IiwiX3VzZUFzeW5jTWVtbyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIlN0YXRlRXZlbnRFZGl0b3IiLCJteEV2ZW50Iiwib25CYWNrIiwiY29udGV4dCIsInVzZUNvbnRleHQiLCJEZXZ0b29sc0NvbnRleHQiLCJjbGkiLCJNYXRyaXhDbGllbnRDb250ZXh0IiwiZmllbGRzIiwidXNlTWVtbyIsImV2ZW50VHlwZUZpZWxkIiwiZ2V0VHlwZSIsInN0YXRlS2V5RmllbGQiLCJnZXRTdGF0ZUtleSIsIm9uU2VuZCIsImV2ZW50VHlwZSIsInN0YXRlS2V5IiwiY29udGVudCIsInNlbmRTdGF0ZUV2ZW50Iiwicm9vbSIsInJvb21JZCIsImRlZmF1bHRDb250ZW50Iiwic3RyaW5naWZ5IiwiZ2V0Q29udGVudCIsInVuZGVmaW5lZCIsImNyZWF0ZUVsZW1lbnQiLCJFdmVudEVkaXRvciIsImZpZWxkRGVmcyIsImV4cG9ydHMiLCJSb29tU3RhdGVIaXN0b3J5IiwiZXZlbnRzIiwidXNlQXN5bmNNZW1vIiwiZXZlbnQiLCJ1bnNpZ25lZCIsInJlcGxhY2VzX3N0YXRlIiwidW5zaGlmdCIsImZldGNoUm9vbUV2ZW50IiwiZ2V0Um9vbUlkIiwiZXZlbnRfaWQiLCJlcnJvciIsIkVycm9yIiwibWVzc2FnZSIsIlN0cmluZyIsImJvZHkiLCJGcmFnbWVudCIsIm1hcCIsImV2IiwibGFuZ3VhZ2UiLCJrZXkiLCJTdGF0ZUV2ZW50QnV0dG9uIiwibGFiZWwiLCJvbkNsaWNrIiwidHJpbW1lZCIsInRyaW0iLCJsZW5ndGgiLCJfdCIsImNvdW50IiwiY2xhc3NOYW1lIiwiY2xhc3NOYW1lcyIsIm14X0RldlRvb2xzX1Jvb21TdGF0ZUV4cGxvcmVyX2J1dHRvbl9oYXNTcGFjZXMiLCJteF9EZXZUb29sc19Sb29tU3RhdGVFeHBsb3Jlcl9idXR0b25fZW1wdHlTdHJpbmciLCJSb29tU3RhdGVFeHBsb3JlckV2ZW50VHlwZSIsInF1ZXJ5Iiwic2V0UXVlcnkiLCJ1c2VTdGF0ZSIsInNldEV2ZW50IiwiaGlzdG9yeSIsInNldEhpc3RvcnkiLCJjdXJyZW50U3RhdGUiLCJ1c2VFZmZlY3QiLCJzaXplIiwiX29uQmFjayIsIm9uSGlzdG9yeUNsaWNrIiwiZXh0cmFCdXR0b24iLCJFdmVudFZpZXdlciIsIkVkaXRvciIsIm9uQ2hhbmdlIiwiQXJyYXkiLCJmcm9tIiwiZW50cmllcyIsIlJvb21TdGF0ZUV4cGxvcmVyIiwic2V0VG9vbCIsInNldEV2ZW50VHlwZSIsIm9uQWN0aW9uIiwiX3RkIiwiYWN0aW9uTGFiZWwiLCJrZXlzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3MvZGlhbG9ncy9kZXZ0b29scy9Sb29tU3RhdGUudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIzIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5Db3B5cmlnaHQgMjAyMiBNaWNoYWVsIFRlbGF0eW5za2kgPDd0M2NoZ3V5QGdtYWlsLmNvbT5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IElDb250ZW50LCBNYXRyaXhFdmVudCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCI7XG5cbmltcG9ydCB7IF90LCBfdGQgfSBmcm9tIFwiLi4vLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgQmFzZVRvb2wsIHsgRGV2dG9vbHNDb250ZXh0LCBJRGV2dG9vbHNQcm9wcyB9IGZyb20gXCIuL0Jhc2VUb29sXCI7XG5pbXBvcnQgTWF0cml4Q2xpZW50Q29udGV4dCBmcm9tIFwiLi4vLi4vLi4vLi4vY29udGV4dHMvTWF0cml4Q2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IHsgRXZlbnRFZGl0b3IsIEV2ZW50Vmlld2VyLCBldmVudFR5cGVGaWVsZCwgc3RhdGVLZXlGaWVsZCwgSUVkaXRvclByb3BzLCBzdHJpbmdpZnkgfSBmcm9tIFwiLi9FdmVudFwiO1xuaW1wb3J0IEZpbHRlcmVkTGlzdCBmcm9tIFwiLi9GaWx0ZXJlZExpc3RcIjtcbmltcG9ydCBTcGlubmVyIGZyb20gXCIuLi8uLi9lbGVtZW50cy9TcGlubmVyXCI7XG5pbXBvcnQgU3ludGF4SGlnaGxpZ2h0IGZyb20gXCIuLi8uLi9lbGVtZW50cy9TeW50YXhIaWdobGlnaHRcIjtcbmltcG9ydCB7IHVzZUFzeW5jTWVtbyB9IGZyb20gXCIuLi8uLi8uLi8uLi9ob29rcy91c2VBc3luY01lbW9cIjtcblxuZXhwb3J0IGNvbnN0IFN0YXRlRXZlbnRFZGl0b3I6IFJlYWN0LkZDPElFZGl0b3JQcm9wcz4gPSAoeyBteEV2ZW50LCBvbkJhY2sgfSkgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KERldnRvb2xzQ29udGV4dCk7XG4gICAgY29uc3QgY2xpID0gdXNlQ29udGV4dChNYXRyaXhDbGllbnRDb250ZXh0KTtcblxuICAgIGNvbnN0IGZpZWxkcyA9IHVzZU1lbW8oXG4gICAgICAgICgpID0+IFtldmVudFR5cGVGaWVsZChteEV2ZW50Py5nZXRUeXBlKCkpLCBzdGF0ZUtleUZpZWxkKG14RXZlbnQ/LmdldFN0YXRlS2V5KCkpXSxcbiAgICAgICAgW214RXZlbnRdLFxuICAgICk7XG5cbiAgICBjb25zdCBvblNlbmQgPSBhc3luYyAoW2V2ZW50VHlwZSwgc3RhdGVLZXldOiBzdHJpbmdbXSwgY29udGVudDogSUNvbnRlbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgYXdhaXQgY2xpLnNlbmRTdGF0ZUV2ZW50KGNvbnRleHQucm9vbS5yb29tSWQsIGV2ZW50VHlwZSBhcyBhbnksIGNvbnRlbnQsIHN0YXRlS2V5KTtcbiAgICB9O1xuXG4gICAgY29uc3QgZGVmYXVsdENvbnRlbnQgPSBteEV2ZW50ID8gc3RyaW5naWZ5KG14RXZlbnQuZ2V0Q29udGVudCgpKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gPEV2ZW50RWRpdG9yIGZpZWxkRGVmcz17ZmllbGRzfSBkZWZhdWx0Q29udGVudD17ZGVmYXVsdENvbnRlbnR9IG9uU2VuZD17b25TZW5kfSBvbkJhY2s9e29uQmFja30gLz47XG59O1xuXG5pbnRlcmZhY2UgU3RhdGVFdmVudEJ1dHRvblByb3BzIHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIG9uQ2xpY2soKTogdm9pZDtcbn1cblxuY29uc3QgUm9vbVN0YXRlSGlzdG9yeTogUmVhY3QuRkM8e1xuICAgIG14RXZlbnQ6IE1hdHJpeEV2ZW50O1xuICAgIG9uQmFjaygpOiB2b2lkO1xufT4gPSAoeyBteEV2ZW50LCBvbkJhY2sgfSkgPT4ge1xuICAgIGNvbnN0IGNsaSA9IHVzZUNvbnRleHQoTWF0cml4Q2xpZW50Q29udGV4dCk7XG4gICAgY29uc3QgZXZlbnRzID0gdXNlQXN5bmNNZW1vKFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBldmVudHMgPSBbbXhFdmVudC5ldmVudF07XG4gICAgICAgICAgICB3aGlsZSAoISFldmVudHNbMF0udW5zaWduZWQ/LnJlcGxhY2VzX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRzLnVuc2hpZnQoYXdhaXQgY2xpLmZldGNoUm9vbUV2ZW50KG14RXZlbnQuZ2V0Um9vbUlkKCkhLCBldmVudHNbMF0udW5zaWduZWQucmVwbGFjZXNfc3RhdGUpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50cy51bnNoaWZ0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X2lkOiBldmVudHNbMF0udW5zaWduZWQucmVwbGFjZXNfc3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZXZlbnRzO1xuICAgICAgICB9LFxuICAgICAgICBbY2xpLCBteEV2ZW50XSxcbiAgICAgICAgbnVsbCxcbiAgICApO1xuXG4gICAgbGV0IGJvZHkgPSA8U3Bpbm5lciAvPjtcbiAgICBpZiAoZXZlbnRzICE9PSBudWxsKSB7XG4gICAgICAgIGJvZHkgPSAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgIHtldmVudHMubWFwKChldikgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8U3ludGF4SGlnaGxpZ2h0IGxhbmd1YWdlPVwianNvblwiIGtleT17ZXYuZXZlbnRfaWR9PlxuICAgICAgICAgICAgICAgICAgICAgICAge3N0cmluZ2lmeShldil9XG4gICAgICAgICAgICAgICAgICAgIDwvU3ludGF4SGlnaGxpZ2h0PlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC8+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDxCYXNlVG9vbCBvbkJhY2s9e29uQmFja30+e2JvZHl9PC9CYXNlVG9vbD47XG59O1xuXG5jb25zdCBTdGF0ZUV2ZW50QnV0dG9uOiBSZWFjdC5GQzxTdGF0ZUV2ZW50QnV0dG9uUHJvcHM+ID0gKHsgbGFiZWwsIG9uQ2xpY2sgfSkgPT4ge1xuICAgIGNvbnN0IHRyaW1tZWQgPSBsYWJlbC50cmltKCk7XG5cbiAgICBsZXQgY29udGVudCA9IGxhYmVsO1xuICAgIGlmICghdHJpbW1lZCkge1xuICAgICAgICBjb250ZW50ID0gbGFiZWwubGVuZ3RoID4gMCA/IF90KFwiZGV2dG9vbHN8c3BhY2VzXCIsIHsgY291bnQ6IGxhYmVsLmxlbmd0aCB9KSA6IF90KFwiZGV2dG9vbHN8ZW1wdHlfc3RyaW5nXCIpO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhcIm14X0RldlRvb2xzX2J1dHRvblwiLCB7XG4gICAgICAgICAgICAgICAgbXhfRGV2VG9vbHNfUm9vbVN0YXRlRXhwbG9yZXJfYnV0dG9uX2hhc1NwYWNlczogdHJpbW1lZC5sZW5ndGggIT09IGxhYmVsLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBteF9EZXZUb29sc19Sb29tU3RhdGVFeHBsb3Jlcl9idXR0b25fZW1wdHlTdHJpbmc6ICF0cmltbWVkLFxuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgICA+XG4gICAgICAgICAgICB7Y29udGVudH1cbiAgICAgICAgPC9idXR0b24+XG4gICAgKTtcbn07XG5cbmludGVyZmFjZSBJRXZlbnRUeXBlUHJvcHMgZXh0ZW5kcyBQaWNrPElEZXZ0b29sc1Byb3BzLCBcIm9uQmFja1wiPiB7XG4gICAgZXZlbnRUeXBlOiBzdHJpbmc7XG59XG5cbmNvbnN0IFJvb21TdGF0ZUV4cGxvcmVyRXZlbnRUeXBlOiBSZWFjdC5GQzxJRXZlbnRUeXBlUHJvcHM+ID0gKHsgZXZlbnRUeXBlLCBvbkJhY2sgfSkgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KERldnRvb2xzQ29udGV4dCk7XG4gICAgY29uc3QgW3F1ZXJ5LCBzZXRRdWVyeV0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgICBjb25zdCBbZXZlbnQsIHNldEV2ZW50XSA9IHVzZVN0YXRlPE1hdHJpeEV2ZW50IHwgbnVsbD4obnVsbCk7XG4gICAgY29uc3QgW2hpc3RvcnksIHNldEhpc3RvcnldID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gICAgY29uc3QgZXZlbnRzID0gY29udGV4dC5yb29tLmN1cnJlbnRTdGF0ZS5ldmVudHMuZ2V0KGV2ZW50VHlwZSkhO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50cy5zaXplID09PSAxICYmIGV2ZW50cy5oYXMoXCJcIikpIHtcbiAgICAgICAgICAgIHNldEV2ZW50KGV2ZW50cy5nZXQoXCJcIikhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldEV2ZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgfSwgW2V2ZW50c10pO1xuXG4gICAgaWYgKGV2ZW50ICYmIGhpc3RvcnkpIHtcbiAgICAgICAgY29uc3QgX29uQmFjayA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIHNldEhpc3RvcnkoZmFsc2UpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gPFJvb21TdGF0ZUhpc3RvcnkgbXhFdmVudD17ZXZlbnR9IG9uQmFjaz17X29uQmFja30gLz47XG4gICAgfVxuICAgIGlmIChldmVudCkge1xuICAgICAgICBjb25zdCBfb25CYWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50cz8uc2l6ZSA9PT0gMSAmJiBldmVudHMuaGFzKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgb25CYWNrKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldEV2ZW50KG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkhpc3RvcnlDbGljayA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIHNldEhpc3RvcnkodHJ1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGV4dHJhQnV0dG9uID0gPGJ1dHRvbiBvbkNsaWNrPXtvbkhpc3RvcnlDbGlja30+e190KFwiZGV2dG9vbHN8c2VlX2hpc3RvcnlcIil9PC9idXR0b24+O1xuICAgICAgICByZXR1cm4gPEV2ZW50Vmlld2VyIG14RXZlbnQ9e2V2ZW50fSBvbkJhY2s9e19vbkJhY2t9IEVkaXRvcj17U3RhdGVFdmVudEVkaXRvcn0gZXh0cmFCdXR0b249e2V4dHJhQnV0dG9ufSAvPjtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8QmFzZVRvb2wgb25CYWNrPXtvbkJhY2t9PlxuICAgICAgICAgICAgPEZpbHRlcmVkTGlzdCBxdWVyeT17cXVlcnl9IG9uQ2hhbmdlPXtzZXRRdWVyeX0+XG4gICAgICAgICAgICAgICAge0FycmF5LmZyb20oZXZlbnRzLmVudHJpZXMoKSkubWFwKChbc3RhdGVLZXksIGV2XSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8U3RhdGVFdmVudEJ1dHRvbiBrZXk9e3N0YXRlS2V5fSBsYWJlbD17c3RhdGVLZXl9IG9uQ2xpY2s9eygpID0+IHNldEV2ZW50KGV2KX0gLz5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvRmlsdGVyZWRMaXN0PlxuICAgICAgICA8L0Jhc2VUb29sPlxuICAgICk7XG59O1xuXG5leHBvcnQgY29uc3QgUm9vbVN0YXRlRXhwbG9yZXI6IFJlYWN0LkZDPElEZXZ0b29sc1Byb3BzPiA9ICh7IG9uQmFjaywgc2V0VG9vbCB9KSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoRGV2dG9vbHNDb250ZXh0KTtcbiAgICBjb25zdCBbcXVlcnksIHNldFF1ZXJ5XSA9IHVzZVN0YXRlKFwiXCIpO1xuICAgIGNvbnN0IFtldmVudFR5cGUsIHNldEV2ZW50VHlwZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAgIGNvbnN0IGV2ZW50cyA9IGNvbnRleHQucm9vbS5jdXJyZW50U3RhdGUuZXZlbnRzO1xuXG4gICAgaWYgKGV2ZW50VHlwZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBvbkJhY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBzZXRFdmVudFR5cGUobnVsbCk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiA8Um9vbVN0YXRlRXhwbG9yZXJFdmVudFR5cGUgZXZlbnRUeXBlPXtldmVudFR5cGV9IG9uQmFjaz17b25CYWNrfSAvPjtcbiAgICB9XG5cbiAgICBjb25zdCBvbkFjdGlvbiA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgc2V0VG9vbChfdGQoXCJkZXZ0b29sc3xzZW5kX2N1c3RvbV9zdGF0ZV9ldmVudFwiKSwgU3RhdGVFdmVudEVkaXRvcik7XG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxCYXNlVG9vbCBvbkJhY2s9e29uQmFja30gYWN0aW9uTGFiZWw9e190ZChcImRldnRvb2xzfHNlbmRfY3VzdG9tX3N0YXRlX2V2ZW50XCIpfSBvbkFjdGlvbj17b25BY3Rpb259PlxuICAgICAgICAgICAgPEZpbHRlcmVkTGlzdCBxdWVyeT17cXVlcnl9IG9uQ2hhbmdlPXtzZXRRdWVyeX0+XG4gICAgICAgICAgICAgICAge0FycmF5LmZyb20oZXZlbnRzLmtleXMoKSkubWFwKChldmVudFR5cGUpID0+IChcbiAgICAgICAgICAgICAgICAgICAgPFN0YXRlRXZlbnRCdXR0b24ga2V5PXtldmVudFR5cGV9IGxhYmVsPXtldmVudFR5cGV9IG9uQ2xpY2s9eygpID0+IHNldEV2ZW50VHlwZShldmVudFR5cGUpfSAvPlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9GaWx0ZXJlZExpc3Q+XG4gICAgICAgIDwvQmFzZVRvb2w+XG4gICAgKTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFTQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBQyxXQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksU0FBQSxHQUFBTCx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssb0JBQUEsR0FBQUgsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFNLE1BQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLGFBQUEsR0FBQUwsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFRLFFBQUEsR0FBQU4sc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFTLGdCQUFBLEdBQUFQLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBVSxhQUFBLEdBQUFWLE9BQUE7QUFBOEQsU0FBQVcseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQWIsd0JBQUFhLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FBQSxXQUFBSyxP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T0FBTyxHQUFHLElBQUFDLGlCQUFVLEVBQUNDLHlCQUFlLENBQUM7RUFDM0MsTUFBTSxDQUFDeUQsS0FBSyxFQUFFQyxRQUFRLENBQUMsR0FBRyxJQUFBQyxlQUFRLEVBQUMsRUFBRSxDQUFDO0VBQ3RDLE1BQU0sQ0FBQ2pELFNBQVMsRUFBRW1FLFlBQVksQ0FBQyxHQUFHLElBQUFsQixlQUFRLEVBQWdCLElBQUksQ0FBQztFQUUvRCxNQUFNbEMsTUFBTSxHQUFHM0IsT0FBTyxDQUFDZ0IsSUFBSSxDQUFDaUQsWUFBWSxDQUFDdEMsTUFBTTtFQUUvQyxJQUFJZixTQUFTLEtBQUssSUFBSSxFQUFFO0lBQ3BCLE1BQU1iLE1BQU0sR0FBR0EsQ0FBQSxLQUFZO01BQ3ZCZ0YsWUFBWSxDQUFDLElBQUksQ0FBQztJQUN0QixDQUFDO0lBQ0Qsb0JBQU9uSCxNQUFBLENBQUFtQixPQUFBLENBQUF1QyxhQUFBLENBQUNvQywwQkFBMEI7TUFBQzlDLFNBQVMsRUFBRUEsU0FBVTtNQUFDYixNQUFNLEVBQUVBO0lBQU8sQ0FBRSxDQUFDO0VBQy9FO0VBRUEsTUFBTWlGLFFBQVEsR0FBRyxNQUFBQSxDQUFBLEtBQTJCO0lBQ3hDRixPQUFPLENBQUMsSUFBQUcsb0JBQUcsRUFBQyxrQ0FBa0MsQ0FBQyxFQUFFcEYsZ0JBQWdCLENBQUM7RUFDdEUsQ0FBQztFQUVELG9CQUNJakMsTUFBQSxDQUFBbUIsT0FBQSxDQUFBdUMsYUFBQSxDQUFDcEQsU0FBQSxDQUFBYSxPQUFRO0lBQUNnQixNQUFNLEVBQUVBLE1BQU87SUFBQ21GLFdBQVcsRUFBRSxJQUFBRCxvQkFBRyxFQUFDLGtDQUFrQyxDQUFFO0lBQUNELFFBQVEsRUFBRUE7RUFBUyxnQkFDL0ZwSCxNQUFBLENBQUFtQixPQUFBLENBQUF1QyxhQUFBLENBQUNqRCxhQUFBLENBQUFVLE9BQVk7SUFBQzRFLEtBQUssRUFBRUEsS0FBTTtJQUFDYyxRQUFRLEVBQUViO0VBQVMsR0FDMUNjLEtBQUssQ0FBQ0MsSUFBSSxDQUFDaEQsTUFBTSxDQUFDd0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDekMsR0FBRyxDQUFFOUIsU0FBUyxpQkFDckNoRCxNQUFBLENBQUFtQixPQUFBLENBQUF1QyxhQUFBLENBQUN3QixnQkFBZ0I7SUFBQ0QsR0FBRyxFQUFFakMsU0FBVTtJQUFDbUMsS0FBSyxFQUFFbkMsU0FBVTtJQUFDb0MsT0FBTyxFQUFFQSxDQUFBLEtBQU0rQixZQUFZLENBQUNuRSxTQUFTO0VBQUUsQ0FBRSxDQUNoRyxDQUNTLENBQ1IsQ0FBQztBQUVuQixDQUFDO0FBQUNhLE9BQUEsQ0FBQW9ELGlCQUFBLEdBQUFBLGlCQUFBIiwiaWdub3JlTGlzdCI6W119