UNPKG

matrix-react-sdk

Version:
172 lines (163 loc) 22.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.ThreepidMember = exports.Member = exports.DirectoryMember = void 0; exports.createRoomFromLocalRoom = createRoomFromLocalRoom; exports.determineCreateRoomEncryptionOption = determineCreateRoomEncryptionOption; exports.startDmOnFirstMessage = startDmOnFirstMessage; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _matrix = require("matrix-js-sdk/src/matrix"); var _logger = require("matrix-js-sdk/src/logger"); var _createRoom = require("../createRoom"); var _actions = require("../dispatcher/actions"); var _dispatcher = _interopRequireDefault(require("../dispatcher/dispatcher")); var _LocalRoom = require("../models/LocalRoom"); var _localRoom = require("./local-room"); var _findDMRoom = require("./dm/findDMRoom"); var _rooms = require("./rooms"); var _createDmLocalRoom = require("./dm/createDmLocalRoom"); var _startDm = require("./dm/startDm"); var _threepids = require("./threepids"); /* Copyright 2024 New Vector Ltd. Copyright 2022 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. */ async function startDmOnFirstMessage(client, targets) { let resolvedTargets = targets; try { resolvedTargets = await (0, _threepids.resolveThreePids)(targets, client); } catch (e) { _logger.logger.warn("Error resolving 3rd-party members", e); } const existingRoom = (0, _findDMRoom.findDMRoom)(client, resolvedTargets); if (existingRoom) { _dispatcher.default.dispatch({ action: _actions.Action.ViewRoom, room_id: existingRoom.roomId, should_peek: false, joining: false, metricsTrigger: "MessageUser" }); return existingRoom.roomId; } if (targets.length === 1 && targets[0] instanceof ThreepidMember && (0, _rooms.privateShouldBeEncrypted)(client)) { // Single 3rd-party invite and well-known promotes encryption: // Directly create a room and invite the other. return await (0, _startDm.startDm)(client, targets); } const room = await (0, _createDmLocalRoom.createDmLocalRoom)(client, resolvedTargets); _dispatcher.default.dispatch({ action: _actions.Action.ViewRoom, room_id: room.roomId, joining: false, targets: resolvedTargets }); return room.roomId; } /** * Starts a DM based on a local room. * * @async * @param {MatrixClient} client * @param {LocalRoom} localRoom * @returns {Promise<string | void>} Resolves to the created room id */ async function createRoomFromLocalRoom(client, localRoom) { if (!localRoom.isNew) { // This action only makes sense for new local rooms. return; } localRoom.state = _LocalRoom.LocalRoomState.CREATING; client.emit(_matrix.ClientEvent.Room, localRoom); return (0, _startDm.startDm)(client, localRoom.targets, false).then(roomId => { if (!roomId) throw new Error(`startDm for local room ${localRoom.roomId} didn't return a room Id`); localRoom.actualRoomId = roomId; return (0, _localRoom.waitForRoomReadyAndApplyAfterCreateCallbacks)(client, localRoom, roomId); }, () => { _logger.logger.warn(`Error creating DM for local room ${localRoom.roomId}`); localRoom.state = _LocalRoom.LocalRoomState.ERROR; client.emit(_matrix.ClientEvent.Room, localRoom); }); } // This is the interface that is expected by various components in the Invite Dialog and RoomInvite. // It is a bit awkward because it also matches the RoomMember class from the js-sdk with some extra support // for 3PIDs/email addresses. class Member {} exports.Member = Member; class DirectoryMember extends Member { // eslint-disable-next-line camelcase constructor(userDirResult) { super(); (0, _defineProperty2.default)(this, "_userId", void 0); (0, _defineProperty2.default)(this, "displayName", void 0); (0, _defineProperty2.default)(this, "avatarUrl", void 0); this._userId = userDirResult.user_id; this.displayName = userDirResult.display_name; this.avatarUrl = userDirResult.avatar_url; } // These next class members are for the Member interface get name() { return this.displayName || this._userId; } get userId() { return this._userId; } getMxcAvatarUrl() { return this.avatarUrl; } } exports.DirectoryMember = DirectoryMember; class ThreepidMember extends Member { constructor(id) { super(); (0, _defineProperty2.default)(this, "id", void 0); this.id = id; } // This is a getter that would be falsy on all other implementations. Until we have // better type support in the react-sdk we can use this trick to determine the kind // of 3PID we're dealing with, if any. get isEmail() { return this.id.includes("@"); } // These next class members are for the Member interface get name() { return this.id; } get userId() { return this.id; } getMxcAvatarUrl() { return undefined; } } exports.ThreepidMember = ThreepidMember; /** * Detects whether a room should be encrypted. * * @async * @param {MatrixClient} client * @param {Member[]} targets The members to which run the check against * @returns {Promise<boolean>} */ async function determineCreateRoomEncryptionOption(client, targets) { if ((0, _rooms.privateShouldBeEncrypted)(client)) { // Enable encryption for a single 3rd party invite. if (targets.length === 1 && targets[0] instanceof ThreepidMember) return true; // Check whether all users have uploaded device keys before. // If so, enable encryption in the new room. const has3PidMembers = targets.some(t => t instanceof ThreepidMember); if (!has3PidMembers) { const targetIds = targets.map(t => t.userId); const allHaveDeviceKeys = await (0, _createRoom.canEncryptToAllUsers)(client, targetIds); if (allHaveDeviceKeys) { return true; } } } return false; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl9sb2dnZXIiLCJfY3JlYXRlUm9vbSIsIl9hY3Rpb25zIiwiX2Rpc3BhdGNoZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX0xvY2FsUm9vbSIsIl9sb2NhbFJvb20iLCJfZmluZERNUm9vbSIsIl9yb29tcyIsIl9jcmVhdGVEbUxvY2FsUm9vbSIsIl9zdGFydERtIiwiX3RocmVlcGlkcyIsInN0YXJ0RG1PbkZpcnN0TWVzc2FnZSIsImNsaWVudCIsInRhcmdldHMiLCJyZXNvbHZlZFRhcmdldHMiLCJyZXNvbHZlVGhyZWVQaWRzIiwiZSIsImxvZ2dlciIsIndhcm4iLCJleGlzdGluZ1Jvb20iLCJmaW5kRE1Sb29tIiwiZGlzIiwiZGlzcGF0Y2giLCJhY3Rpb24iLCJBY3Rpb24iLCJWaWV3Um9vbSIsInJvb21faWQiLCJyb29tSWQiLCJzaG91bGRfcGVlayIsImpvaW5pbmciLCJtZXRyaWNzVHJpZ2dlciIsImxlbmd0aCIsIlRocmVlcGlkTWVtYmVyIiwicHJpdmF0ZVNob3VsZEJlRW5jcnlwdGVkIiwic3RhcnREbSIsInJvb20iLCJjcmVhdGVEbUxvY2FsUm9vbSIsImNyZWF0ZVJvb21Gcm9tTG9jYWxSb29tIiwibG9jYWxSb29tIiwiaXNOZXciLCJzdGF0ZSIsIkxvY2FsUm9vbVN0YXRlIiwiQ1JFQVRJTkciLCJlbWl0IiwiQ2xpZW50RXZlbnQiLCJSb29tIiwidGhlbiIsIkVycm9yIiwiYWN0dWFsUm9vbUlkIiwid2FpdEZvclJvb21SZWFkeUFuZEFwcGx5QWZ0ZXJDcmVhdGVDYWxsYmFja3MiLCJFUlJPUiIsIk1lbWJlciIsImV4cG9ydHMiLCJEaXJlY3RvcnlNZW1iZXIiLCJjb25zdHJ1Y3RvciIsInVzZXJEaXJSZXN1bHQiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsIl91c2VySWQiLCJ1c2VyX2lkIiwiZGlzcGxheU5hbWUiLCJkaXNwbGF5X25hbWUiLCJhdmF0YXJVcmwiLCJhdmF0YXJfdXJsIiwibmFtZSIsInVzZXJJZCIsImdldE14Y0F2YXRhclVybCIsImlkIiwiaXNFbWFpbCIsImluY2x1ZGVzIiwidW5kZWZpbmVkIiwiZGV0ZXJtaW5lQ3JlYXRlUm9vbUVuY3J5cHRpb25PcHRpb24iLCJoYXMzUGlkTWVtYmVycyIsInNvbWUiLCJ0IiwidGFyZ2V0SWRzIiwibWFwIiwiYWxsSGF2ZURldmljZUtleXMiLCJjYW5FbmNyeXB0VG9BbGxVc2VycyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9kaXJlY3QtbWVzc2FnZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjIgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IHsgQ2xpZW50RXZlbnQsIE1hdHJpeENsaWVudCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcblxuaW1wb3J0IHsgY2FuRW5jcnlwdFRvQWxsVXNlcnMgfSBmcm9tIFwiLi4vY3JlYXRlUm9vbVwiO1xuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcIi4uL2Rpc3BhdGNoZXIvYWN0aW9uc1wiO1xuaW1wb3J0IHsgVmlld1Jvb21QYXlsb2FkIH0gZnJvbSBcIi4uL2Rpc3BhdGNoZXIvcGF5bG9hZHMvVmlld1Jvb21QYXlsb2FkXCI7XG5pbXBvcnQgZGlzIGZyb20gXCIuLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCB7IExvY2FsUm9vbSwgTG9jYWxSb29tU3RhdGUgfSBmcm9tIFwiLi4vbW9kZWxzL0xvY2FsUm9vbVwiO1xuaW1wb3J0IHsgd2FpdEZvclJvb21SZWFkeUFuZEFwcGx5QWZ0ZXJDcmVhdGVDYWxsYmFja3MgfSBmcm9tIFwiLi9sb2NhbC1yb29tXCI7XG5pbXBvcnQgeyBmaW5kRE1Sb29tIH0gZnJvbSBcIi4vZG0vZmluZERNUm9vbVwiO1xuaW1wb3J0IHsgcHJpdmF0ZVNob3VsZEJlRW5jcnlwdGVkIH0gZnJvbSBcIi4vcm9vbXNcIjtcbmltcG9ydCB7IGNyZWF0ZURtTG9jYWxSb29tIH0gZnJvbSBcIi4vZG0vY3JlYXRlRG1Mb2NhbFJvb21cIjtcbmltcG9ydCB7IHN0YXJ0RG0gfSBmcm9tIFwiLi9kbS9zdGFydERtXCI7XG5pbXBvcnQgeyByZXNvbHZlVGhyZWVQaWRzIH0gZnJvbSBcIi4vdGhyZWVwaWRzXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydERtT25GaXJzdE1lc3NhZ2UoY2xpZW50OiBNYXRyaXhDbGllbnQsIHRhcmdldHM6IE1lbWJlcltdKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgbGV0IHJlc29sdmVkVGFyZ2V0cyA9IHRhcmdldHM7XG5cbiAgICB0cnkge1xuICAgICAgICByZXNvbHZlZFRhcmdldHMgPSBhd2FpdCByZXNvbHZlVGhyZWVQaWRzKHRhcmdldHMsIGNsaWVudCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIud2FybihcIkVycm9yIHJlc29sdmluZyAzcmQtcGFydHkgbWVtYmVyc1wiLCBlKTtcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZ1Jvb20gPSBmaW5kRE1Sb29tKGNsaWVudCwgcmVzb2x2ZWRUYXJnZXRzKTtcblxuICAgIGlmIChleGlzdGluZ1Jvb20pIHtcbiAgICAgICAgZGlzLmRpc3BhdGNoPFZpZXdSb29tUGF5bG9hZD4oe1xuICAgICAgICAgICAgYWN0aW9uOiBBY3Rpb24uVmlld1Jvb20sXG4gICAgICAgICAgICByb29tX2lkOiBleGlzdGluZ1Jvb20ucm9vbUlkLFxuICAgICAgICAgICAgc2hvdWxkX3BlZWs6IGZhbHNlLFxuICAgICAgICAgICAgam9pbmluZzogZmFsc2UsXG4gICAgICAgICAgICBtZXRyaWNzVHJpZ2dlcjogXCJNZXNzYWdlVXNlclwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nUm9vbS5yb29tSWQ7XG4gICAgfVxuXG4gICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAxICYmIHRhcmdldHNbMF0gaW5zdGFuY2VvZiBUaHJlZXBpZE1lbWJlciAmJiBwcml2YXRlU2hvdWxkQmVFbmNyeXB0ZWQoY2xpZW50KSkge1xuICAgICAgICAvLyBTaW5nbGUgM3JkLXBhcnR5IGludml0ZSBhbmQgd2VsbC1rbm93biBwcm9tb3RlcyBlbmNyeXB0aW9uOlxuICAgICAgICAvLyBEaXJlY3RseSBjcmVhdGUgYSByb29tIGFuZCBpbnZpdGUgdGhlIG90aGVyLlxuICAgICAgICByZXR1cm4gYXdhaXQgc3RhcnREbShjbGllbnQsIHRhcmdldHMpO1xuICAgIH1cblxuICAgIGNvbnN0IHJvb20gPSBhd2FpdCBjcmVhdGVEbUxvY2FsUm9vbShjbGllbnQsIHJlc29sdmVkVGFyZ2V0cyk7XG4gICAgZGlzLmRpc3BhdGNoKHtcbiAgICAgICAgYWN0aW9uOiBBY3Rpb24uVmlld1Jvb20sXG4gICAgICAgIHJvb21faWQ6IHJvb20ucm9vbUlkLFxuICAgICAgICBqb2luaW5nOiBmYWxzZSxcbiAgICAgICAgdGFyZ2V0czogcmVzb2x2ZWRUYXJnZXRzLFxuICAgIH0pO1xuICAgIHJldHVybiByb29tLnJvb21JZDtcbn1cblxuLyoqXG4gKiBTdGFydHMgYSBETSBiYXNlZCBvbiBhIGxvY2FsIHJvb20uXG4gKlxuICogQGFzeW5jXG4gKiBAcGFyYW0ge01hdHJpeENsaWVudH0gY2xpZW50XG4gKiBAcGFyYW0ge0xvY2FsUm9vbX0gbG9jYWxSb29tXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCB2b2lkPn0gUmVzb2x2ZXMgdG8gdGhlIGNyZWF0ZWQgcm9vbSBpZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUm9vbUZyb21Mb2NhbFJvb20oY2xpZW50OiBNYXRyaXhDbGllbnQsIGxvY2FsUm9vbTogTG9jYWxSb29tKTogUHJvbWlzZTxzdHJpbmcgfCB2b2lkPiB7XG4gICAgaWYgKCFsb2NhbFJvb20uaXNOZXcpIHtcbiAgICAgICAgLy8gVGhpcyBhY3Rpb24gb25seSBtYWtlcyBzZW5zZSBmb3IgbmV3IGxvY2FsIHJvb21zLlxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9jYWxSb29tLnN0YXRlID0gTG9jYWxSb29tU3RhdGUuQ1JFQVRJTkc7XG4gICAgY2xpZW50LmVtaXQoQ2xpZW50RXZlbnQuUm9vbSwgbG9jYWxSb29tKTtcblxuICAgIHJldHVybiBzdGFydERtKGNsaWVudCwgbG9jYWxSb29tLnRhcmdldHMsIGZhbHNlKS50aGVuKFxuICAgICAgICAocm9vbUlkKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJvb21JZCkgdGhyb3cgbmV3IEVycm9yKGBzdGFydERtIGZvciBsb2NhbCByb29tICR7bG9jYWxSb29tLnJvb21JZH0gZGlkbid0IHJldHVybiBhIHJvb20gSWRgKTtcblxuICAgICAgICAgICAgbG9jYWxSb29tLmFjdHVhbFJvb21JZCA9IHJvb21JZDtcbiAgICAgICAgICAgIHJldHVybiB3YWl0Rm9yUm9vbVJlYWR5QW5kQXBwbHlBZnRlckNyZWF0ZUNhbGxiYWNrcyhjbGllbnQsIGxvY2FsUm9vbSwgcm9vbUlkKTtcbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEVycm9yIGNyZWF0aW5nIERNIGZvciBsb2NhbCByb29tICR7bG9jYWxSb29tLnJvb21JZH1gKTtcbiAgICAgICAgICAgIGxvY2FsUm9vbS5zdGF0ZSA9IExvY2FsUm9vbVN0YXRlLkVSUk9SO1xuICAgICAgICAgICAgY2xpZW50LmVtaXQoQ2xpZW50RXZlbnQuUm9vbSwgbG9jYWxSb29tKTtcbiAgICAgICAgfSxcbiAgICApO1xufVxuXG4vLyBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgdGhhdCBpcyBleHBlY3RlZCBieSB2YXJpb3VzIGNvbXBvbmVudHMgaW4gdGhlIEludml0ZSBEaWFsb2cgYW5kIFJvb21JbnZpdGUuXG4vLyBJdCBpcyBhIGJpdCBhd2t3YXJkIGJlY2F1c2UgaXQgYWxzbyBtYXRjaGVzIHRoZSBSb29tTWVtYmVyIGNsYXNzIGZyb20gdGhlIGpzLXNkayB3aXRoIHNvbWUgZXh0cmEgc3VwcG9ydFxuLy8gZm9yIDNQSURzL2VtYWlsIGFkZHJlc3Nlcy5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNZW1iZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBkaXNwbGF5IG5hbWUgb2YgdGhpcyBNZW1iZXIuIEZvciB1c2VycyB0aGlzIHNob3VsZCBiZSB0aGVpciBwcm9maWxlJ3MgZGlzcGxheVxuICAgICAqIG5hbWUgb3IgdXNlciBJRCBpZiBub25lIHNldC4gRm9yIDNQSURzIHRoaXMgc2hvdWxkIGJlIHRoZSAzUElEIGFkZHJlc3MgKGVtYWlsKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0IG5hbWUoKTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoaXMgTWVtYmVyLiBGb3IgdXNlcnMgdGhpcyBzaG91bGQgYmUgdGhlaXIgdXNlciBJRC4gRm9yIDNQSURzIHRoaXMgc2hvdWxkXG4gICAgICogYmUgdGhlIDNQSUQgYWRkcmVzcyAoZW1haWwpLlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXQgdXNlcklkKCk6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIE1YQyBVUkwgb2YgdGhpcyBNZW1iZXIncyBhdmF0YXIuIEZvciB1c2VycyB0aGlzIHNob3VsZCBiZSB0aGVpciBwcm9maWxlJ3NcbiAgICAgKiBhdmF0YXIgTVhDIFVSTCBvciBudWxsIGlmIG5vbmUgc2V0LiBGb3IgM1BJRHMgdGhpcyBzaG91bGQgYWx3YXlzIGJlIHVuZGVmaW5lZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0TXhjQXZhdGFyVXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNsYXNzIERpcmVjdG9yeU1lbWJlciBleHRlbmRzIE1lbWJlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfdXNlcklkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkaXNwbGF5TmFtZT86IHN0cmluZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGF2YXRhclVybD86IHN0cmluZztcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjYW1lbGNhc2VcbiAgICBwdWJsaWMgY29uc3RydWN0b3IodXNlckRpclJlc3VsdDogeyB1c2VyX2lkOiBzdHJpbmc7IGRpc3BsYXlfbmFtZT86IHN0cmluZzsgYXZhdGFyX3VybD86IHN0cmluZyB9KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3VzZXJJZCA9IHVzZXJEaXJSZXN1bHQudXNlcl9pZDtcbiAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IHVzZXJEaXJSZXN1bHQuZGlzcGxheV9uYW1lO1xuICAgICAgICB0aGlzLmF2YXRhclVybCA9IHVzZXJEaXJSZXN1bHQuYXZhdGFyX3VybDtcbiAgICB9XG5cbiAgICAvLyBUaGVzZSBuZXh0IGNsYXNzIG1lbWJlcnMgYXJlIGZvciB0aGUgTWVtYmVyIGludGVyZmFjZVxuICAgIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5TmFtZSB8fCB0aGlzLl91c2VySWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB1c2VySWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJJZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TXhjQXZhdGFyVXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmF2YXRhclVybDtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUaHJlZXBpZE1lbWJlciBleHRlbmRzIE1lbWJlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgYSBnZXR0ZXIgdGhhdCB3b3VsZCBiZSBmYWxzeSBvbiBhbGwgb3RoZXIgaW1wbGVtZW50YXRpb25zLiBVbnRpbCB3ZSBoYXZlXG4gICAgLy8gYmV0dGVyIHR5cGUgc3VwcG9ydCBpbiB0aGUgcmVhY3Qtc2RrIHdlIGNhbiB1c2UgdGhpcyB0cmljayB0byBkZXRlcm1pbmUgdGhlIGtpbmRcbiAgICAvLyBvZiAzUElEIHdlJ3JlIGRlYWxpbmcgd2l0aCwgaWYgYW55LlxuICAgIHB1YmxpYyBnZXQgaXNFbWFpbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWQuaW5jbHVkZXMoXCJAXCIpO1xuICAgIH1cblxuICAgIC8vIFRoZXNlIG5leHQgY2xhc3MgbWVtYmVycyBhcmUgZm9yIHRoZSBNZW1iZXIgaW50ZXJmYWNlXG4gICAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmlkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdXNlcklkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmlkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNeGNBdmF0YXJVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURNVXNlclRpbGVQcm9wcyB7XG4gICAgbWVtYmVyOiBNZW1iZXI7XG4gICAgb25SZW1vdmU/KG1lbWJlcjogTWVtYmVyKTogdm9pZDtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHdoZXRoZXIgYSByb29tIHNob3VsZCBiZSBlbmNyeXB0ZWQuXG4gKlxuICogQGFzeW5jXG4gKiBAcGFyYW0ge01hdHJpeENsaWVudH0gY2xpZW50XG4gKiBAcGFyYW0ge01lbWJlcltdfSB0YXJnZXRzIFRoZSBtZW1iZXJzIHRvIHdoaWNoIHJ1biB0aGUgY2hlY2sgYWdhaW5zdFxuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXRlcm1pbmVDcmVhdGVSb29tRW5jcnlwdGlvbk9wdGlvbihjbGllbnQ6IE1hdHJpeENsaWVudCwgdGFyZ2V0czogTWVtYmVyW10pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAocHJpdmF0ZVNob3VsZEJlRW5jcnlwdGVkKGNsaWVudCkpIHtcbiAgICAgICAgLy8gRW5hYmxlIGVuY3J5cHRpb24gZm9yIGEgc2luZ2xlIDNyZCBwYXJ0eSBpbnZpdGUuXG4gICAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMSAmJiB0YXJnZXRzWzBdIGluc3RhbmNlb2YgVGhyZWVwaWRNZW1iZXIpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIENoZWNrIHdoZXRoZXIgYWxsIHVzZXJzIGhhdmUgdXBsb2FkZWQgZGV2aWNlIGtleXMgYmVmb3JlLlxuICAgICAgICAvLyBJZiBzbywgZW5hYmxlIGVuY3J5cHRpb24gaW4gdGhlIG5ldyByb29tLlxuICAgICAgICBjb25zdCBoYXMzUGlkTWVtYmVycyA9IHRhcmdldHMuc29tZSgodCkgPT4gdCBpbnN0YW5jZW9mIFRocmVlcGlkTWVtYmVyKTtcbiAgICAgICAgaWYgKCFoYXMzUGlkTWVtYmVycykge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0SWRzID0gdGFyZ2V0cy5tYXAoKHQpID0+IHQudXNlcklkKTtcbiAgICAgICAgICAgIGNvbnN0IGFsbEhhdmVEZXZpY2VLZXlzID0gYXdhaXQgY2FuRW5jcnlwdFRvQWxsVXNlcnMoY2xpZW50LCB0YXJnZXRJZHMpO1xuICAgICAgICAgICAgaWYgKGFsbEhhdmVEZXZpY2VLZXlzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBUUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsV0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsUUFBQSxHQUFBSCxPQUFBO0FBRUEsSUFBQUksV0FBQSxHQUFBQyxzQkFBQSxDQUFBTCxPQUFBO0FBQ0EsSUFBQU0sVUFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sVUFBQSxHQUFBUCxPQUFBO0FBQ0EsSUFBQVEsV0FBQSxHQUFBUixPQUFBO0FBQ0EsSUFBQVMsTUFBQSxHQUFBVCxPQUFBO0FBQ0EsSUFBQVUsa0JBQUEsR0FBQVYsT0FBQTtBQUNBLElBQUFXLFFBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLFVBQUEsR0FBQVosT0FBQTtBQXJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFpQk8sZUFBZWEscUJBQXFCQSxDQUFDQyxNQUFvQixFQUFFQyxPQUFpQixFQUEwQjtFQUN6RyxJQUFJQyxlQUFlLEdBQUdELE9BQU87RUFFN0IsSUFBSTtJQUNBQyxlQUFlLEdBQUcsTUFBTSxJQUFBQywyQkFBZ0IsRUFBQ0YsT0FBTyxFQUFFRCxNQUFNLENBQUM7RUFDN0QsQ0FBQyxDQUFDLE9BQU9JLENBQUMsRUFBRTtJQUNSQyxjQUFNLENBQUNDLElBQUksQ0FBQyxtQ0FBbUMsRUFBRUYsQ0FBQyxDQUFDO0VBQ3ZEO0VBRUEsTUFBTUcsWUFBWSxHQUFHLElBQUFDLHNCQUFVLEVBQUNSLE1BQU0sRUFBRUUsZUFBZSxDQUFDO0VBRXhELElBQUlLLFlBQVksRUFBRTtJQUNkRSxtQkFBRyxDQUFDQyxRQUFRLENBQWtCO01BQzFCQyxNQUFNLEVBQUVDLGVBQU0sQ0FBQ0MsUUFBUTtN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