matrix-react-sdk
Version:
SDK for matrix.org using React
145 lines (140 loc) • 25.4 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.JoinRuleDialog = exports.CallGuestLinkButton = void 0;
var _link = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/link"));
var _compoundWeb = require("@vector-im/compound-web");
var _react = _interopRequireWildcard(require("react"));
var _logger = require("matrix-js-sdk/src/logger");
var _matrix = require("matrix-js-sdk/src/matrix");
var _Modal = _interopRequireDefault(require("../../../../Modal"));
var _ShareDialog = _interopRequireDefault(require("../../dialogs/ShareDialog"));
var _languageHandler = require("../../../../languageHandler");
var _SettingsStore = _interopRequireDefault(require("../../../../settings/SettingsStore"));
var _Permalinks = require("../../../../utils/permalinks/Permalinks");
var _BaseDialog = _interopRequireDefault(require("../../dialogs/BaseDialog"));
var _useGuestAccessInformation = require("../../../../hooks/room/useGuestAccessInformation");
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.
*/
/**
* Display a button to open a dialog to share a link to the call using a element call guest spa url (`element_call:guest_spa_url` in the EW config).
* @param room
* @returns Nothing if there is not the option to share a link (No guest_spa_url is set) or a button to open a dialog to share the link.
*/
const CallGuestLinkButton = ({
room
}) => {
const {
canInviteGuests,
guestSpaUrl,
isRoomJoinable,
canInvite
} = (0, _useGuestAccessInformation.useGuestAccessInformation)(room);
const generateCallLink = (0, _react.useCallback)(() => {
if (!isRoomJoinable()) throw new Error("Cannot create link for room that users can not join without invite.");
if (!guestSpaUrl) throw new Error("No guest SPA url for external links provided.");
const url = new URL(guestSpaUrl);
url.pathname = "/room/";
// Set params for the sharable url
url.searchParams.set("roomId", room.roomId);
if (room.hasEncryptionStateEvent()) url.searchParams.set("perParticipantE2EE", "true");
for (const server of (0, _Permalinks.calculateRoomVia)(room)) {
url.searchParams.set("viaServers", server);
}
// Move params into hash
url.hash = "/" + room.name + url.search;
url.search = "";
_logger.logger.info("Generated element call external url:", url);
return url;
}, [guestSpaUrl, isRoomJoinable, room]);
const showLinkModal = (0, _react.useCallback)(() => {
try {
// generateCallLink throws if the invite rules are not met
const target = generateCallLink();
_Modal.default.createDialog(_ShareDialog.default, {
target,
customTitle: (0, _languageHandler._t)("share|share_call"),
subtitle: (0, _languageHandler._t)("share|share_call_subtitle")
});
} catch (e) {
_logger.logger.error("Could not generate call link.", e);
}
}, [generateCallLink]);
const shareClick = (0, _react.useCallback)(() => {
if (isRoomJoinable()) {
showLinkModal();
} else {
// the room needs to be set to public or knock to generate a link
_Modal.default.createDialog(JoinRuleDialog, {
room,
// If the user cannot invite the Knocking is not given as an option.
canInvite
}).finished.then(() => {
if (isRoomJoinable()) showLinkModal();
});
}
}, [isRoomJoinable, showLinkModal, room, canInvite]);
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, canInviteGuests && /*#__PURE__*/_react.default.createElement(_compoundWeb.Tooltip, {
label: (0, _languageHandler._t)("voip|get_call_link")
}, /*#__PURE__*/_react.default.createElement(_compoundWeb.IconButton, {
onClick: shareClick
}, /*#__PURE__*/_react.default.createElement(_link.default, null))));
};
/**
* A dialog to change the join rule of a room to public or knock.
* @param room The room to change the join rule of.
* @param onFinished Callback that is getting called if the dialog wants to close.
*/
exports.CallGuestLinkButton = CallGuestLinkButton;
const JoinRuleDialog = ({
onFinished,
room,
canInvite
}) => {
const askToJoinEnabled = _SettingsStore.default.getValue("feature_ask_to_join");
const [isUpdating, setIsUpdating] = _react.default.useState(undefined);
const changeJoinRule = (0, _react.useCallback)(async newRule => {
if (isUpdating !== undefined) return;
setIsUpdating(newRule);
await room.client.sendStateEvent(room.roomId, _matrix.EventType.RoomJoinRules, {
join_rule: newRule
}, "");
// Show the dialog for a bit to give the user feedback
setTimeout(() => onFinished(), 500);
}, [isUpdating, onFinished, room.client, room.roomId]);
return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, {
title: (0, _languageHandler._t)("update_room_access_modal|title"),
onFinished: onFinished,
className: "mx_JoinRuleDialog"
}, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("update_room_access_modal|description")), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_JoinRuleDialogButtons"
}, askToJoinEnabled && canInvite && /*#__PURE__*/_react.default.createElement(_compoundWeb.Button, {
kind: "secondary",
className: "mx_Dialog_nonDialogButton",
disabled: isUpdating === _matrix.JoinRule.Knock,
onClick: () => changeJoinRule(_matrix.JoinRule.Knock)
}, (0, _languageHandler._t)("action|ask_to_join")), /*#__PURE__*/_react.default.createElement(_compoundWeb.Button, {
className: "mx_Dialog_nonDialogButton",
kind: "destructive",
disabled: isUpdating === _matrix.JoinRule.Public,
onClick: () => changeJoinRule(_matrix.JoinRule.Public)
}, (0, _languageHandler._t)("common|public"))), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("update_room_access_modal|dont_change_description")), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_JoinRuleDialogButtons"
}, /*#__PURE__*/_react.default.createElement(_compoundWeb.Button, {
kind: "tertiary",
className: "mx_Dialog_nonDialogButton",
onClick: () => {
if (isUpdating === undefined) onFinished();
}
}, (0, _languageHandler._t)("update_room_access_modal|no_change"))));
};
exports.JoinRuleDialog = JoinRuleDialog;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbGluayIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2NvbXBvdW5kV2ViIiwiX3JlYWN0IiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfbG9nZ2VyIiwiX21hdHJpeCIsIl9Nb2RhbCIsIl9TaGFyZURpYWxvZyIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfU2V0dGluZ3NTdG9yZSIsIl9QZXJtYWxpbmtzIiwiX0Jhc2VEaWFsb2ciLCJfdXNlR3Vlc3RBY2Nlc3NJbmZvcm1hdGlvbiIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIkNhbGxHdWVzdExpbmtCdXR0b24iLCJyb29tIiwiY2FuSW52aXRlR3Vlc3RzIiwiZ3Vlc3RTcGFVcmwiLCJpc1Jvb21Kb2luYWJsZSIsImNhbkludml0ZSIsInVzZUd1ZXN0QWNjZXNzSW5mb3JtYXRpb24iLCJnZW5lcmF0ZUNhbGxMaW5rIiwidXNlQ2FsbGJhY2siLCJFcnJvciIsInVybCIsIlVSTCIsInBhdGhuYW1lIiwic2VhcmNoUGFyYW1zIiwicm9vbUlkIiwiaGFzRW5jcnlwdGlvblN0YXRlRXZlbnQiLCJzZXJ2ZXIiLCJjYWxjdWxhdGVSb29tVmlhIiwiaGFzaCIsIm5hbWUiLCJzZWFyY2giLCJsb2dnZXIiLCJpbmZvIiwic2hvd0xpbmtNb2RhbCIsInRhcmdldCIsIk1vZGFsIiwiY3JlYXRlRGlhbG9nIiwiU2hhcmVEaWFsb2ciLCJjdXN0b21UaXRsZSIsIl90Iiwic3VidGl0bGUiLCJlcnJvciIsInNoYXJlQ2xpY2siLCJKb2luUnVsZURpYWxvZyIsImZpbmlzaGVkIiwidGhlbiIsImNyZWF0ZUVsZW1lbnQiLCJGcmFnbWVudCIsIlRvb2x0aXAiLCJsYWJlbCIsIkljb25CdXR0b24iLCJvbkNsaWNrIiwiZXhwb3J0cyIsIm9uRmluaXNoZWQiLCJhc2tUb0pvaW5FbmFibGVkIiwiU2V0dGluZ3NTdG9yZSIsImdldFZhbHVlIiwiaXNVcGRhdGluZyIsInNldElzVXBkYXRpbmciLCJSZWFjdCIsInVzZVN0YXRlIiwidW5kZWZpbmVkIiwiY2hhbmdlSm9pblJ1bGUiLCJuZXdSdWxlIiwiY2xpZW50Iiwic2VuZFN0YXRlRXZlbnQiLCJFdmVudFR5cGUiLCJSb29tSm9pblJ1bGVzIiwiam9pbl9ydWxlIiwic2V0VGltZW91dCIsInRpdGxlIiwiY2xhc3NOYW1lIiwiQnV0dG9uIiwia2luZCIsImRpc2FibGVkIiwiSm9pblJ1bGUiLCJLbm9jayIsIlB1YmxpYyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3Jvb21zL1Jvb21IZWFkZXIvQ2FsbEd1ZXN0TGlua0J1dHRvbi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjQgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cbmltcG9ydCBFeHRlcm5hbExpbmtJY29uIGZyb20gXCJAdmVjdG9yLWltL2NvbXBvdW5kLWRlc2lnbi10b2tlbnMvYXNzZXRzL3dlYi9pY29ucy9saW5rXCI7XG5pbXBvcnQgeyBCdXR0b24sIEljb25CdXR0b24sIFRvb2x0aXAgfSBmcm9tIFwiQHZlY3Rvci1pbS9jb21wb3VuZC13ZWJcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjayB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuaW1wb3J0IHsgRXZlbnRUeXBlLCBKb2luUnVsZSwgUm9vbSB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcblxuaW1wb3J0IE1vZGFsIGZyb20gXCIuLi8uLi8uLi8uLi9Nb2RhbFwiO1xuaW1wb3J0IFNoYXJlRGlhbG9nIGZyb20gXCIuLi8uLi9kaWFsb2dzL1NoYXJlRGlhbG9nXCI7XG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuLi8uLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVSb29tVmlhIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3V0aWxzL3Blcm1hbGlua3MvUGVybWFsaW5rc1wiO1xuaW1wb3J0IEJhc2VEaWFsb2cgZnJvbSBcIi4uLy4uL2RpYWxvZ3MvQmFzZURpYWxvZ1wiO1xuaW1wb3J0IHsgdXNlR3Vlc3RBY2Nlc3NJbmZvcm1hdGlvbiB9IGZyb20gXCIuLi8uLi8uLi8uLi9ob29rcy9yb29tL3VzZUd1ZXN0QWNjZXNzSW5mb3JtYXRpb25cIjtcblxuLyoqXG4gKiBEaXNwbGF5IGEgYnV0dG9uIHRvIG9wZW4gYSBkaWFsb2cgdG8gc2hhcmUgYSBsaW5rIHRvIHRoZSBjYWxsIHVzaW5nIGEgZWxlbWVudCBjYWxsIGd1ZXN0IHNwYSB1cmwgKGBlbGVtZW50X2NhbGw6Z3Vlc3Rfc3BhX3VybGAgaW4gdGhlIEVXIGNvbmZpZykuXG4gKiBAcGFyYW0gcm9vbVxuICogQHJldHVybnMgTm90aGluZyBpZiB0aGVyZSBpcyBub3QgdGhlIG9wdGlvbiB0byBzaGFyZSBhIGxpbmsgKE5vIGd1ZXN0X3NwYV91cmwgaXMgc2V0KSBvciBhIGJ1dHRvbiB0byBvcGVuIGEgZGlhbG9nIHRvIHNoYXJlIHRoZSBsaW5rLlxuICovXG5leHBvcnQgY29uc3QgQ2FsbEd1ZXN0TGlua0J1dHRvbjogUmVhY3QuRkM8eyByb29tOiBSb29tIH0+ID0gKHsgcm9vbSB9KSA9PiB7XG4gICAgY29uc3QgeyBjYW5JbnZpdGVHdWVzdHMsIGd1ZXN0U3BhVXJsLCBpc1Jvb21Kb2luYWJsZSwgY2FuSW52aXRlIH0gPSB1c2VHdWVzdEFjY2Vzc0luZm9ybWF0aW9uKHJvb20pO1xuXG4gICAgY29uc3QgZ2VuZXJhdGVDYWxsTGluayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgaWYgKCFpc1Jvb21Kb2luYWJsZSgpKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY3JlYXRlIGxpbmsgZm9yIHJvb20gdGhhdCB1c2VycyBjYW4gbm90IGpvaW4gd2l0aG91dCBpbnZpdGUuXCIpO1xuICAgICAgICBpZiAoIWd1ZXN0U3BhVXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBndWVzdCBTUEEgdXJsIGZvciBleHRlcm5hbCBsaW5rcyBwcm92aWRlZC5cIik7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoZ3Vlc3RTcGFVcmwpO1xuICAgICAgICB1cmwucGF0aG5hbWUgPSBcIi9yb29tL1wiO1xuICAgICAgICAvLyBTZXQgcGFyYW1zIGZvciB0aGUgc2hhcmFibGUgdXJsXG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KFwicm9vbUlkXCIsIHJvb20ucm9vbUlkKTtcbiAgICAgICAgaWYgKHJvb20uaGFzRW5jcnlwdGlvblN0YXRlRXZlbnQoKSkgdXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJwZXJQYXJ0aWNpcGFudEUyRUVcIiwgXCJ0cnVlXCIpO1xuICAgICAgICBmb3IgKGNvbnN0IHNlcnZlciBvZiBjYWxjdWxhdGVSb29tVmlhKHJvb20pKSB7XG4gICAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChcInZpYVNlcnZlcnNcIiwgc2VydmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1vdmUgcGFyYW1zIGludG8gaGFzaFxuICAgICAgICB1cmwuaGFzaCA9IFwiL1wiICsgcm9vbS5uYW1lICsgdXJsLnNlYXJjaDtcbiAgICAgICAgdXJsLnNlYXJjaCA9IFwiXCI7XG5cbiAgICAgICAgbG9nZ2VyLmluZm8oXCJHZW5lcmF0ZWQgZWxlbWVudCBjYWxsIGV4dGVybmFsIHVybDpcIiwgdXJsKTtcbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9LCBbZ3Vlc3RTcGFVcmwsIGlzUm9vbUpvaW5hYmxlLCByb29tXSk7XG5cbiAgICBjb25zdCBzaG93TGlua01vZGFsID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gZ2VuZXJhdGVDYWxsTGluayB0aHJvd3MgaWYgdGhlIGludml0ZSBydWxlcyBhcmUgbm90IG1ldFxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZ2VuZXJhdGVDYWxsTGluaygpO1xuICAgICAgICAgICAgTW9kYWwuY3JlYXRlRGlhbG9nKFNoYXJlRGlhbG9nLCB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICAgIGN1c3RvbVRpdGxlOiBfdChcInNoYXJlfHNoYXJlX2NhbGxcIiksXG4gICAgICAgICAgICAgICAgc3VidGl0bGU6IF90KFwic2hhcmV8c2hhcmVfY2FsbF9zdWJ0aXRsZVwiKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJDb3VsZCBub3QgZ2VuZXJhdGUgY2FsbCBsaW5rLlwiLCBlKTtcbiAgICAgICAgfVxuICAgIH0sIFtnZW5lcmF0ZUNhbGxMaW5rXSk7XG5cbiAgICBjb25zdCBzaGFyZUNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICBpZiAoaXNSb29tSm9pbmFibGUoKSkge1xuICAgICAgICAgICAgc2hvd0xpbmtNb2RhbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdGhlIHJvb20gbmVlZHMgdG8gYmUgc2V0IHRvIHB1YmxpYyBvciBrbm9jayB0byBnZW5lcmF0ZSBhIGxpbmtcbiAgICAgICAgICAgIE1vZGFsLmNyZWF0ZURpYWxvZyhKb2luUnVsZURpYWxvZywge1xuICAgICAgICAgICAgICAgIHJvb20sXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHVzZXIgY2Fubm90IGludml0ZSB0aGUgS25vY2tpbmcgaXMgbm90IGdpdmVuIGFzIGFuIG9wdGlvbi5cbiAgICAgICAgICAgICAgICBjYW5JbnZpdGUsXG4gICAgICAgICAgICB9KS5maW5pc2hlZC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNSb29tSm9pbmFibGUoKSkgc2hvd0xpbmtNb2RhbCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LCBbaXNSb29tSm9pbmFibGUsIHNob3dMaW5rTW9kYWwsIHJvb20sIGNhbkludml0ZV0pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPD5cbiAgICAgICAgICAgIHtjYW5JbnZpdGVHdWVzdHMgJiYgKFxuICAgICAgICAgICAgICAgIDxUb29sdGlwIGxhYmVsPXtfdChcInZvaXB8Z2V0X2NhbGxfbGlua1wiKX0+XG4gICAgICAgICAgICAgICAgICAgIDxJY29uQnV0dG9uIG9uQ2xpY2s9e3NoYXJlQ2xpY2t9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPEV4dGVybmFsTGlua0ljb24gLz5cbiAgICAgICAgICAgICAgICAgICAgPC9JY29uQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICl9XG4gICAgICAgIDwvPlxuICAgICk7XG59O1xuXG4vKipcbiAqIEEgZGlhbG9nIHRvIGNoYW5nZSB0aGUgam9pbiBydWxlIG9mIGEgcm9vbSB0byBwdWJsaWMgb3Iga25vY2suXG4gKiBAcGFyYW0gcm9vbSBUaGUgcm9vbSB0byBjaGFuZ2UgdGhlIGpvaW4gcnVsZSBvZi5cbiAqIEBwYXJhbSBvbkZpbmlzaGVkIENhbGxiYWNrIHRoYXQgaXMgZ2V0dGluZyBjYWxsZWQgaWYgdGhlIGRpYWxvZyB3YW50cyB0byBjbG9zZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEpvaW5SdWxlRGlhbG9nOiBSZWFjdC5GQzx7XG4gICAgb25GaW5pc2hlZCgpOiB2b2lkO1xuICAgIHJvb206IFJvb207XG4gICAgY2FuSW52aXRlOiBib29sZWFuO1xufT4gPSAoeyBvbkZpbmlzaGVkLCByb29tLCBjYW5JbnZpdGUgfSkgPT4ge1xuICAgIGNvbnN0IGFza1RvSm9pbkVuYWJsZWQgPSBTZXR0aW5nc1N0b3JlLmdldFZhbHVlKFwiZmVhdHVyZV9hc2tfdG9fam9pblwiKTtcbiAgICBjb25zdCBbaXNVcGRhdGluZywgc2V0SXNVcGRhdGluZ10gPSBSZWFjdC51c2VTdGF0ZTx1bmRlZmluZWQgfCBKb2luUnVsZT4odW5kZWZpbmVkKTtcbiAgICBjb25zdCBjaGFuZ2VKb2luUnVsZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgICBhc3luYyAobmV3UnVsZTogSm9pblJ1bGUpID0+IHtcbiAgICAgICAgICAgIGlmIChpc1VwZGF0aW5nICE9PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgICAgIHNldElzVXBkYXRpbmcobmV3UnVsZSk7XG4gICAgICAgICAgICBhd2FpdCByb29tLmNsaWVudC5zZW5kU3RhdGVFdmVudChcbiAgICAgICAgICAgICAgICByb29tLnJvb21JZCxcbiAgICAgICAgICAgICAgICBFdmVudFR5cGUuUm9vbUpvaW5SdWxlcyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGpvaW5fcnVsZTogbmV3UnVsZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gU2hvdyB0aGUgZGlhbG9nIGZvciBhIGJpdCB0byBnaXZlIHRoZSB1c2VyIGZlZWRiYWNrXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IG9uRmluaXNoZWQoKSwgNTAwKTtcbiAgICAgICAgfSxcbiAgICAgICAgW2lzVXBkYXRpbmcsIG9uRmluaXNoZWQsIHJvb20uY2xpZW50LCByb29tLnJvb21JZF0sXG4gICAgKTtcbiAgICByZXR1cm4gKFxuICAgICAgICA8QmFzZURpYWxvZyB0aXRsZT17X3QoXCJ1cGRhdGVfcm9vbV9hY2Nlc3NfbW9kYWx8dGl0bGVcIil9IG9uRmluaXNoZWQ9e29uRmluaXNoZWR9IGNsYXNzTmFtZT1cIm14X0pvaW5SdWxlRGlhbG9nXCI+XG4gICAgICAgICAgICA8cD57X3QoXCJ1cGRhdGVfcm9vbV9hY2Nlc3NfbW9kYWx8ZGVzY3JpcHRpb25cIil9PC9wPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9Kb2luUnVsZURpYWxvZ0J1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICB7YXNrVG9Kb2luRW5hYmxlZCAmJiBjYW5JbnZpdGUgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBraW5kPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0RpYWxvZ19ub25EaWFsb2dCdXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzVXBkYXRpbmcgPT09IEpvaW5SdWxlLktub2NrfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gY2hhbmdlSm9pblJ1bGUoSm9pblJ1bGUuS25vY2spfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJhY3Rpb258YXNrX3RvX2pvaW5cIil9XG4gICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9EaWFsb2dfbm9uRGlhbG9nQnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAga2luZD1cImRlc3RydWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzVXBkYXRpbmcgPT09IEpvaW5SdWxlLlB1YmxpY31cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gY2hhbmdlSm9pblJ1bGUoSm9pblJ1bGUuUHVibGljKX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHtfdChcImNvbW1vbnxwdWJsaWNcIil9XG4gICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxwPntfdChcInVwZGF0ZV9yb29tX2FjY2Vzc19tb2RhbHxkb250X2NoYW5nZV9kZXNjcmlwdGlvblwiKX08L3A+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0pvaW5SdWxlRGlhbG9nQnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAga2luZD1cInRlcnRpYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfRGlhbG9nX25vbkRpYWxvZ0J1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1VwZGF0aW5nID09PSB1bmRlZmluZWQpIG9uRmluaXNoZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHtfdChcInVwZGF0ZV9yb29tX2FjY2Vzc19tb2RhbHxub19jaGFuZ2VcIil9XG4gICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9CYXNlRGlhbG9nPlxuICAgICk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBT0EsSUFBQUEsS0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0Es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