UNPKG

matrix-react-sdk

Version:
152 lines (142 loc) 19.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.join = exports.goto = void 0; var _languageHandler = require("../languageHandler"); var _utils = require("./utils"); var _Permalinks = require("../utils/permalinks/Permalinks"); var _dispatcher = _interopRequireDefault(require("../dispatcher/dispatcher")); var _actions = require("../dispatcher/actions"); var _RoomContext = require("../contexts/RoomContext"); var _command = require("./command"); var _interface = require("./interface"); /* Copyright 2024 New Vector Ltd. Copyright 2020 The Matrix.org Foundation C.I.C. Copyright 2019 Michael Telatynski <7t3chguy@gmail.com> Copyright 2018 New Vector Ltd Copyright 2015, 2016 OpenMarket Ltd SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ // A return of undefined here signals a usage error, where the command should return `reject(this.getUsage());` function openRoom(cli, args, autoJoin) { if (!args) return; const params = args.split(" "); if (params.length < 1) return; let isPermalink = false; if (params[0].startsWith("http:") || params[0].startsWith("https:")) { // It's at least a URL - try and pull out a hostname to check against the // permalink handler const parsedUrl = new URL(params[0]); const hostname = parsedUrl.host || parsedUrl.hostname; // takes first non-falsey value // if we're using a Element permalink handler, this will catch it before we get much further. // see below where we make assumptions about parsing the URL. if ((0, _Permalinks.isPermalinkHost)(hostname)) { isPermalink = true; } } if (params[0][0] === "#") { let roomAlias = params[0]; if (!roomAlias.includes(":")) { roomAlias += ":" + cli.getDomain(); } _dispatcher.default.dispatch({ action: _actions.Action.ViewRoom, room_alias: roomAlias, auto_join: autoJoin, metricsTrigger: "SlashCommand", metricsViaKeyboard: true }); return (0, _utils.success)(); } if (params[0][0] === "!") { const [roomId, ...viaServers] = params; _dispatcher.default.dispatch({ action: _actions.Action.ViewRoom, room_id: roomId, via_servers: viaServers, // for the rejoin button auto_join: autoJoin, metricsTrigger: "SlashCommand", metricsViaKeyboard: true }); return (0, _utils.success)(); } if (isPermalink) { const permalinkParts = (0, _Permalinks.parsePermalink)(params[0]); // This check technically isn't needed because we already did our // safety checks up above. However, for good measure, let's be sure. if (!permalinkParts) { return; } // If for some reason someone wanted to join a user, we should // stop them now. if (!permalinkParts.roomIdOrAlias) { return; } const entity = permalinkParts.roomIdOrAlias; const viaServers = permalinkParts.viaServers; const eventId = permalinkParts.eventId; const dispatch = { action: _actions.Action.ViewRoom, auto_join: autoJoin, metricsTrigger: "SlashCommand", metricsViaKeyboard: true }; if (entity[0] === "!") dispatch["room_id"] = entity;else dispatch["room_alias"] = entity; if (eventId) { dispatch["event_id"] = eventId; dispatch["highlighted"] = true; } if (viaServers) { // For the join, these are passed down to the js-sdk's /join call dispatch["opts"] = { viaServers }; // For if the join fails (rejoin button) dispatch["via_servers"] = viaServers; } _dispatcher.default.dispatch(dispatch); return (0, _utils.success)(); } // Otherwise, it's a usage error. Return `undefined`. } // Note: we support 2 versions of this command. The first is // the public-facing one for most users and the other is a // power-user edition where someone may join via permalink or // room ID with optional servers. Practically, this results // in the following variations: // /join #example:example.org // /join !example:example.org // /join !example:example.org altserver.com elsewhere.ca // /join https://matrix.to/#/!example:example.org?via=altserver.com // The command also supports event permalinks transparently: // /join https://matrix.to/#/!example:example.org/$something:example.org // /join https://matrix.to/#/!example:example.org/$something:example.org?via=altserver.com const join = exports.join = new _command.Command({ command: "join", aliases: ["j"], args: "<room-address>", description: (0, _languageHandler._td)("slash_command|join"), runFn: function (cli, roomId, threadId, args) { return openRoom(cli, args, true) ?? (0, _utils.reject)(this.getUsage()); }, category: _interface.CommandCategories.actions, renderingTypes: [_RoomContext.TimelineRenderingType.Room] }); // Similar to join but doesn't auto join the room if you aren't already joined to it const goto = exports.goto = new _command.Command({ command: "goto", aliases: ["view"], args: "<room-address>", description: (0, _languageHandler._td)("slash_command|view"), runFn: function (cli, roomId, threadId, args) { return openRoom(cli, args, false) ?? (0, _utils.reject)(this.getUsage()); }, category: _interface.CommandCategories.actions, renderingTypes: [_RoomContext.TimelineRenderingType.Room] }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbGFuZ3VhZ2VIYW5kbGVyIiwicmVxdWlyZSIsIl91dGlscyIsIl9QZXJtYWxpbmtzIiwiX2Rpc3BhdGNoZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2FjdGlvbnMiLCJfUm9vbUNvbnRleHQiLCJfY29tbWFuZCIsIl9pbnRlcmZhY2UiLCJvcGVuUm9vbSIsImNsaSIsImFyZ3MiLCJhdXRvSm9pbiIsInBhcmFtcyIsInNwbGl0IiwibGVuZ3RoIiwiaXNQZXJtYWxpbmsiLCJzdGFydHNXaXRoIiwicGFyc2VkVXJsIiwiVVJMIiwiaG9zdG5hbWUiLCJob3N0IiwiaXNQZXJtYWxpbmtIb3N0Iiwicm9vbUFsaWFzIiwiaW5jbHVkZXMiLCJnZXREb21haW4iLCJkaXMiLCJkaXNwYXRjaCIsImFjdGlvbiIsIkFjdGlvbiIsIlZpZXdSb29tIiwicm9vbV9hbGlhcyIsImF1dG9fam9pbiIsIm1ldHJpY3NUcmlnZ2VyIiwibWV0cmljc1ZpYUtleWJvYXJkIiwic3VjY2VzcyIsInJvb21JZCIsInZpYVNlcnZlcnMiLCJyb29tX2lkIiwidmlhX3NlcnZlcnMiLCJwZXJtYWxpbmtQYXJ0cyIsInBhcnNlUGVybWFsaW5rIiwicm9vbUlkT3JBbGlhcyIsImVudGl0eSIsImV2ZW50SWQiLCJqb2luIiwiZXhwb3J0cyIsIkNvbW1hbmQiLCJjb21tYW5kIiwiYWxpYXNlcyIsImRlc2NyaXB0aW9uIiwiX3RkIiwicnVuRm4iLCJ0aHJlYWRJZCIsInJlamVjdCIsImdldFVzYWdlIiwiY2F0ZWdvcnkiLCJDb21tYW5kQ2F0ZWdvcmllcyIsImFjdGlvbnMiLCJyZW5kZXJpbmdUeXBlcyIsIlRpbWVsaW5lUmVuZGVyaW5nVHlwZSIsIlJvb20iLCJnb3RvIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NsYXNoLWNvbW1hbmRzL2pvaW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjAgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cbkNvcHlyaWdodCAyMDE5IE1pY2hhZWwgVGVsYXR5bnNraSA8N3QzY2hndXlAZ21haWwuY29tPlxuQ29weXJpZ2h0IDIwMTggTmV3IFZlY3RvciBMdGRcbkNvcHlyaWdodCAyMDE1LCAyMDE2IE9wZW5NYXJrZXQgTHRkXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCB7IE1hdHJpeENsaWVudCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcblxuaW1wb3J0IHsgX3RkIH0gZnJvbSBcIi4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IHsgcmVqZWN0LCBzdWNjZXNzIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IGlzUGVybWFsaW5rSG9zdCwgcGFyc2VQZXJtYWxpbmsgfSBmcm9tIFwiLi4vdXRpbHMvcGVybWFsaW5rcy9QZXJtYWxpbmtzXCI7XG5pbXBvcnQgZGlzIGZyb20gXCIuLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCB7IFZpZXdSb29tUGF5bG9hZCB9IGZyb20gXCIuLi9kaXNwYXRjaGVyL3BheWxvYWRzL1ZpZXdSb29tUGF5bG9hZFwiO1xuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcIi4uL2Rpc3BhdGNoZXIvYWN0aW9uc1wiO1xuaW1wb3J0IHsgVGltZWxpbmVSZW5kZXJpbmdUeXBlIH0gZnJvbSBcIi4uL2NvbnRleHRzL1Jvb21Db250ZXh0XCI7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcIi4vY29tbWFuZFwiO1xuaW1wb3J0IHsgQ29tbWFuZENhdGVnb3JpZXMsIFJ1blJlc3VsdCB9IGZyb20gXCIuL2ludGVyZmFjZVwiO1xuXG4vLyBBIHJldHVybiBvZiB1bmRlZmluZWQgaGVyZSBzaWduYWxzIGEgdXNhZ2UgZXJyb3IsIHdoZXJlIHRoZSBjb21tYW5kIHNob3VsZCByZXR1cm4gYHJlamVjdCh0aGlzLmdldFVzYWdlKCkpO2BcbmZ1bmN0aW9uIG9wZW5Sb29tKGNsaTogTWF0cml4Q2xpZW50LCBhcmdzOiBzdHJpbmcgfCB1bmRlZmluZWQsIGF1dG9Kb2luOiBib29sZWFuKTogUnVuUmVzdWx0IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWFyZ3MpIHJldHVybjtcbiAgICBjb25zdCBwYXJhbXMgPSBhcmdzLnNwbGl0KFwiIFwiKTtcbiAgICBpZiAocGFyYW1zLmxlbmd0aCA8IDEpIHJldHVybjtcblxuICAgIGxldCBpc1Blcm1hbGluayA9IGZhbHNlO1xuICAgIGlmIChwYXJhbXNbMF0uc3RhcnRzV2l0aChcImh0dHA6XCIpIHx8IHBhcmFtc1swXS5zdGFydHNXaXRoKFwiaHR0cHM6XCIpKSB7XG4gICAgICAgIC8vIEl0J3MgYXQgbGVhc3QgYSBVUkwgLSB0cnkgYW5kIHB1bGwgb3V0IGEgaG9zdG5hbWUgdG8gY2hlY2sgYWdhaW5zdCB0aGVcbiAgICAgICAgLy8gcGVybWFsaW5rIGhhbmRsZXJcbiAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTChwYXJhbXNbMF0pO1xuICAgICAgICBjb25zdCBob3N0bmFtZSA9IHBhcnNlZFVybC5ob3N0IHx8IHBhcnNlZFVybC5ob3N0bmFtZTsgLy8gdGFrZXMgZmlyc3Qgbm9uLWZhbHNleSB2YWx1ZVxuXG4gICAgICAgIC8vIGlmIHdlJ3JlIHVzaW5nIGEgRWxlbWVudCBwZXJtYWxpbmsgaGFuZGxlciwgdGhpcyB3aWxsIGNhdGNoIGl0IGJlZm9yZSB3ZSBnZXQgbXVjaCBmdXJ0aGVyLlxuICAgICAgICAvLyBzZWUgYmVsb3cgd2hlcmUgd2UgbWFrZSBhc3N1bXB0aW9ucyBhYm91dCBwYXJzaW5nIHRoZSBVUkwuXG4gICAgICAgIGlmIChpc1Blcm1hbGlua0hvc3QoaG9zdG5hbWUpKSB7XG4gICAgICAgICAgICBpc1Blcm1hbGluayA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zWzBdWzBdID09PSBcIiNcIikge1xuICAgICAgICBsZXQgcm9vbUFsaWFzID0gcGFyYW1zWzBdO1xuICAgICAgICBpZiAoIXJvb21BbGlhcy5pbmNsdWRlcyhcIjpcIikpIHtcbiAgICAgICAgICAgIHJvb21BbGlhcyArPSBcIjpcIiArIGNsaS5nZXREb21haW4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpcy5kaXNwYXRjaDxWaWV3Um9vbVBheWxvYWQ+KHtcbiAgICAgICAgICAgIGFjdGlvbjogQWN0aW9uLlZpZXdSb29tLFxuICAgICAgICAgICAgcm9vbV9hbGlhczogcm9vbUFsaWFzLFxuICAgICAgICAgICAgYXV0b19qb2luOiBhdXRvSm9pbixcbiAgICAgICAgICAgIG1ldHJpY3NUcmlnZ2VyOiBcIlNsYXNoQ29tbWFuZFwiLFxuICAgICAgICAgICAgbWV0cmljc1ZpYUtleWJvYXJkOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zWzBdWzBdID09PSBcIiFcIikge1xuICAgICAgICBjb25zdCBbcm9vbUlkLCAuLi52aWFTZXJ2ZXJzXSA9IHBhcmFtcztcblxuICAgICAgICBkaXMuZGlzcGF0Y2g8Vmlld1Jvb21QYXlsb2FkPih7XG4gICAgICAgICAgICBhY3Rpb246IEFjdGlvbi5WaWV3Um9vbSxcbiAgICAgICAgICAgIHJvb21faWQ6IHJvb21JZCxcbiAgICAgICAgICAgIHZpYV9zZXJ2ZXJzOiB2aWFTZXJ2ZXJzLCAvLyBmb3IgdGhlIHJlam9pbiBidXR0b25cbiAgICAgICAgICAgIGF1dG9fam9pbjogYXV0b0pvaW4sXG4gICAgICAgICAgICBtZXRyaWNzVHJpZ2dlcjogXCJTbGFzaENvbW1hbmRcIixcbiAgICAgICAgICAgIG1ldHJpY3NWaWFLZXlib2FyZDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzdWNjZXNzKCk7XG4gICAgfVxuXG4gICAgaWYgKGlzUGVybWFsaW5rKSB7XG4gICAgICAgIGNvbnN0IHBlcm1hbGlua1BhcnRzID0gcGFyc2VQZXJtYWxpbmsocGFyYW1zWzBdKTtcblxuICAgICAgICAvLyBUaGlzIGNoZWNrIHRlY2huaWNhbGx5IGlzbid0IG5lZWRlZCBiZWNhdXNlIHdlIGFscmVhZHkgZGlkIG91clxuICAgICAgICAvLyBzYWZldHkgY2hlY2tzIHVwIGFib3ZlLiBIb3dldmVyLCBmb3IgZ29vZCBtZWFzdXJlLCBsZXQncyBiZSBzdXJlLlxuICAgICAgICBpZiAoIXBlcm1hbGlua1BhcnRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBmb3Igc29tZSByZWFzb24gc29tZW9uZSB3YW50ZWQgdG8gam9pbiBhIHVzZXIsIHdlIHNob3VsZFxuICAgICAgICAvLyBzdG9wIHRoZW0gbm93LlxuICAgICAgICBpZiAoIXBlcm1hbGlua1BhcnRzLnJvb21JZE9yQWxpYXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudGl0eSA9IHBlcm1hbGlua1BhcnRzLnJvb21JZE9yQWxpYXM7XG4gICAgICAgIGNvbnN0IHZpYVNlcnZlcnMgPSBwZXJtYWxpbmtQYXJ0cy52aWFTZXJ2ZXJzO1xuICAgICAgICBjb25zdCBldmVudElkID0gcGVybWFsaW5rUGFydHMuZXZlbnRJZDtcblxuICAgICAgICBjb25zdCBkaXNwYXRjaDogVmlld1Jvb21QYXlsb2FkID0ge1xuICAgICAgICAgICAgYWN0aW9uOiBBY3Rpb24uVmlld1Jvb20sXG4gICAgICAgICAgICBhdXRvX2pvaW46IGF1dG9Kb2luLFxuICAgICAgICAgICAgbWV0cmljc1RyaWdnZXI6IFwiU2xhc2hDb21tYW5kXCIsXG4gICAgICAgICAgICBtZXRyaWNzVmlhS2V5Ym9hcmQ6IHRydWUsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGVudGl0eVswXSA9PT0gXCIhXCIpIGRpc3BhdGNoW1wicm9vbV9pZFwiXSA9IGVudGl0eTtcbiAgICAgICAgZWxzZSBkaXNwYXRjaFtcInJvb21fYWxpYXNcIl0gPSBlbnRpdHk7XG5cbiAgICAgICAgaWYgKGV2ZW50SWQpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoW1wiZXZlbnRfaWRcIl0gPSBldmVudElkO1xuICAgICAgICAgICAgZGlzcGF0Y2hbXCJoaWdobGlnaHRlZFwiXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmlhU2VydmVycykge1xuICAgICAgICAgICAgLy8gRm9yIHRoZSBqb2luLCB0aGVzZSBhcmUgcGFzc2VkIGRvd24gdG8gdGhlIGpzLXNkaydzIC9qb2luIGNhbGxcbiAgICAgICAgICAgIGRpc3BhdGNoW1wib3B0c1wiXSA9IHsgdmlhU2VydmVycyB9O1xuXG4gICAgICAgICAgICAvLyBGb3IgaWYgdGhlIGpvaW4gZmFpbHMgKHJlam9pbiBidXR0b24pXG4gICAgICAgICAgICBkaXNwYXRjaFtcInZpYV9zZXJ2ZXJzXCJdID0gdmlhU2VydmVycztcbiAgICAgICAgfVxuXG4gICAgICAgIGRpcy5kaXNwYXRjaChkaXNwYXRjaCk7XG4gICAgICAgIHJldHVybiBzdWNjZXNzKCk7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlLCBpdCdzIGEgdXNhZ2UgZXJyb3IuIFJldHVybiBgdW5kZWZpbmVkYC5cbn1cblxuLy8gTm90ZTogd2Ugc3VwcG9ydCAyIHZlcnNpb25zIG9mIHRoaXMgY29tbWFuZC4gVGhlIGZpcnN0IGlzXG4vLyB0aGUgcHVibGljLWZhY2luZyBvbmUgZm9yIG1vc3QgdXNlcnMgYW5kIHRoZSBvdGhlciBpcyBhXG4vLyBwb3dlci11c2VyIGVkaXRpb24gd2hlcmUgc29tZW9uZSBtYXkgam9pbiB2aWEgcGVybWFsaW5rIG9yXG4vLyByb29tIElEIHdpdGggb3B0aW9uYWwgc2VydmVycy4gUHJhY3RpY2FsbHksIHRoaXMgcmVzdWx0c1xuLy8gaW4gdGhlIGZvbGxvd2luZyB2YXJpYXRpb25zOlxuLy8gICAvam9pbiAjZXhhbXBsZTpleGFtcGxlLm9yZ1xuLy8gICAvam9pbiAhZXhhbXBsZTpleGFtcGxlLm9yZ1xuLy8gICAvam9pbiAhZXhhbXBsZTpleGFtcGxlLm9yZyBhbHRzZXJ2ZXIuY29tIGVsc2V3aGVyZS5jYVxuLy8gICAvam9pbiBodHRwczovL21hdHJpeC50by8jLyFleGFtcGxlOmV4YW1wbGUub3JnP3ZpYT1hbHRzZXJ2ZXIuY29tXG4vLyBUaGUgY29tbWFuZCBhbHNvIHN1cHBvcnRzIGV2ZW50IHBlcm1hbGlua3MgdHJhbnNwYXJlbnRseTpcbi8vICAgL2pvaW4gaHR0cHM6Ly9tYXRyaXgudG8vIy8hZXhhbXBsZTpleGFtcGxlLm9yZy8kc29tZXRoaW5nOmV4YW1wbGUub3JnXG4vLyAgIC9qb2luIGh0dHBzOi8vbWF0cml4LnRvLyMvIWV4YW1wbGU6ZXhhbXBsZS5vcmcvJHNvbWV0aGluZzpleGFtcGxlLm9yZz92aWE9YWx0c2VydmVyLmNvbVxuZXhwb3J0IGNvbnN0IGpvaW4gPSBuZXcgQ29tbWFuZCh7XG4gICAgY29tbWFuZDogXCJqb2luXCIsXG4gICAgYWxpYXNlczogW1wialwiXSxcbiAgICBhcmdzOiBcIjxyb29tLWFkZHJlc3M+XCIsXG4gICAgZGVzY3JpcHRpb246IF90ZChcInNsYXNoX2NvbW1hbmR8am9pblwiKSxcbiAgICBydW5GbjogZnVuY3Rpb24gKGNsaSwgcm9vbUlkLCB0aHJlYWRJZCwgYXJncykge1xuICAgICAgICByZXR1cm4gb3BlblJvb20oY2xpLCBhcmdzLCB0cnVlKSA/PyByZWplY3QodGhpcy5nZXRVc2FnZSgpKTtcbiAgICB9LFxuICAgIGNhdGVnb3J5OiBDb21tYW5kQ2F0ZWdvcmllcy5hY3Rpb25zLFxuICAgIHJlbmRlcmluZ1R5cGVzOiBbVGltZWxpbmVSZW5kZXJpbmdUeXBlLlJvb21dLFxufSk7XG5cbi8vIFNpbWlsYXIgdG8gam9pbiBidXQgZG9lc24ndCBhdXRvIGpvaW4gdGhlIHJvb20gaWYgeW91IGFyZW4ndCBhbHJlYWR5IGpvaW5lZCB0byBpdFxuZXhwb3J0IGNvbnN0IGdvdG8gPSBuZXcgQ29tbWFuZCh7XG4gICAgY29tbWFuZDogXCJnb3RvXCIsXG4gICAgYWxpYXNlczogW1widmlld1wiXSxcbiAgICBhcmdzOiBcIjxyb29tLWFkZHJlc3M+XCIsXG4gICAgZGVzY3JpcHRpb246IF90ZChcInNsYXNoX2NvbW1hbmR8dmlld1wiKSxcbiAgICBydW5GbjogZnVuY3Rpb24gKGNsaSwgcm9vbUlkLCB0aHJlYWRJZCwgYXJncykge1xuICAgICAgICByZXR1cm4gb3BlblJvb20oY2xpLCBhcmdzLCBmYWxzZSkgPz8gcmVqZWN0KHRoaXMuZ2V0VXNhZ2UoKSk7XG4gICAgfSxcbiAgICBjYXRlZ29yeTogQ29tbWFuZENhdGVnb3JpZXMuYWN0aW9ucyxcbiAgICByZW5kZXJpbmdUeXBlczogW1RpbWVsaW5lUmVuZGVyaW5nVHlwZS5Sb29tXSxcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBYUEsSUFBQUEsZ0JBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFdBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUosT0FBQTtBQUVBLElBQUFLLFFBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFlBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFFBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLFVBQUEsR0FBQVIsT0FBQTtBQXJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFjQTtBQUNBLFNBQVNTLFFBQVFBLENBQUNDLEdBQWlCLEVBQUVDLElBQXdCLEVBQUVDLFFBQWlCLEVBQXlCO0VBQ3JHLElBQUksQ0FBQ0QsSUFBSSxFQUFFO0VBQ1gsTUFBTUUsTUFBTSxHQUFHRixJQUFJLENBQUNHLEtBQUssQ0FBQyxHQUFHLENBQUM7RUFDOUIsSUFBSUQsTUFBTSxDQUFDRSxNQUFNLEdBQUcsQ0FBQyxF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