matrix-react-sdk
Version:
SDK for matrix.org using React
172 lines (163 loc) • 22.2 kB
JavaScript
;
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+IHQudXNlcklkKTtcbiAgICAgICAgICAgIGNvbnN0IGFsbEhhdmVEZXZpY2VLZXlzID0gYXdhaXQgY2FuRW5jcnlwdFRvQWxsVXNlcnMoY2xpZW50LCB0YXJnZXRJZHMpO1xuICAgICAgICAgICAgaWYgKGFsbEhhdmVEZXZpY2VLZXlzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBUUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsV0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsUUFBQSxHQUFBSCxPQUFBO0FBRUEsSUFBQUksV0FBQSxHQUFBQyxzQkFBQSxDQUFBTCxPQUFBO0FBQ0EsSUFBQU0sVUFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sVUFBQSxHQUFBUCxPQUFBO0FBQ0EsSUFBQVEsV0FBQSxHQUFBUixPQUFBO0FBQ0EsSUFBQVMsTUFBQSxHQUFBVCxPQUFBO0FBQ0EsSUFBQVUsa0JBQUEsR0FBQVYsT0FBQTtBQUNBLElBQUFXLFFBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLFVBQUEsR0FBQVosT0FBQTtBQXJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFpQk8sZUFBZWEscUJBQXFCQSxDQUFDQyxNQUFvQixFQUFFQyxPQUFpQixFQUEwQjtFQUN6RyxJQUFJQyxlQUFlLEdBQUdELE9BQU87RUFFN0IsSUFBSTtJQUNBQyxlQUFlLEdBQUcsTUFBTSxJQUFBQywyQkFBZ0IsRUFBQ0YsT0FBTyxFQUFFRCxNQUFNLENBQUM7RUFDN0QsQ0FBQyxDQUFDLE9BQU9JLENBQUMsRUFBRTtJQUNSQyxjQUFNLENBQUNDLElBQUksQ0FBQyxtQ0FBbUMsRUFBRUYsQ0FBQyxDQUFDO0VBQ3ZEO0VBRUEsTUFBTUcsWUFBWSxHQUFHLElBQUFDLHNCQUFVLEVBQUNSLE1BQU0sRUFBRUUsZUFBZSxDQUFDO0VBRXhELElBQUlLLFlBQVksRUFBRTtJQUNkRSxtQkFBRyxDQUFDQyxRQUFRLENBQWtCO01BQzFCQyxNQUFNLEVBQUVDLGVBQU0sQ0FBQ0MsUUFBUTtNQUN2QkMsT0FBTyxFQUFFUCxZQUFZLENBQUNRLE1BQU07TUFDNUJDLFdBQVcsRUFBRSxLQUFLO01BQ2xCQyxPQUFPLEVBQUUsS0FBSztNQUNkQyxjQUFjLEVBQUU7SUFDcEIsQ0FBQyxDQUFDO0lBQ0YsT0FBT1gsWUFBWSxDQUFDUSxNQUFNO0VBQzlCO0VBRUEsSUFBSWQsT0FBTyxDQUFDa0IsTUFBTSxLQUFLLENBQUMsSUFBSWxCLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWW1CLGNBQWMsSUFBSSxJQUFBQywrQkFBd0IsRUFBQ3JCLE1BQU0sQ0FBQyxFQUFFO0lBQ2xHO0lBQ0E7SUFDQSxPQUFPLE1BQU0sSUFBQXNCLGdCQUFPLEVBQUN0QixNQUFNLEVBQUVDLE9BQU8sQ0FBQztFQUN6QztFQUVBLE1BQU1zQixJQUFJLEdBQUcsTUFBTSxJQUFBQyxvQ0FBaUIsRUFBQ3hCLE1BQU0sRUFBRUUsZUFBZSxDQUFDO0VBQzdETyxtQkFBRyxDQUFDQyxRQUFRLENBQUM7SUFDVEMsTUFBTSxFQUFFQyxlQUFNLENBQUNDLFFBQVE7SUFDdkJDLE9BQU8sRUFBRVMsSUFBSSxDQUFDUixNQUFNO0lBQ3BCRSxPQUFPLEVBQUUsS0FBSztJQUNkaEIsT0FBTyxFQUFFQztFQUNiLENBQUMsQ0FBQztFQUNGLE9BQU9xQixJQUFJLENBQUNSLE1BQU07QUFDdEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLGVBQWVVLHVCQUF1QkEsQ0FBQ3pCLE1BQW9CLEVBQUUwQixTQUFvQixFQUEwQjtFQUM5RyxJQUFJLENBQUNBLFNBQVMsQ0FBQ0MsS0FBSyxFQUFFO0lBQ2xCO0lBQ0E7RUFDSjtFQUVBRCxTQUFTLENBQUNFLEtBQUssR0FBR0MseUJBQWMsQ0FBQ0MsUUFBUTtFQUN6QzlCLE1BQU0sQ0FBQytCLElBQUksQ0FBQ0MsbUJBQVcsQ0FBQ0MsSUFBSSxFQUFFUCxTQUFTLENBQUM7RUFFeEMsT0FBTyxJQUFBSixnQkFBTyxFQUFDdEIsTUFBTSxFQUFFMEIsU0FBUyxDQUFDekIsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDaUMsSUFBSSxDQUNoRG5CLE1BQU0sSUFBSztJQUNSLElBQUksQ0FBQ0EsTUFBTSxFQUFFLE1BQU0sSUFBSW9CLEtBQUssQ0FBQywwQkFBMEJULFNBQVMsQ0FBQ1gsTUFBTSwwQkFBMEIsQ0FBQztJQUVsR1csU0FBUyxDQUFDVSxZQUFZLEdBQUdyQixNQUFNO0lBQy9CLE9BQU8sSUFBQXNCLHVEQUE0QyxFQUFDckMsTUFBTSxFQUFFMEIsU0FBUyxFQUFFWCxNQUFNLENBQUM7RUFDbEYsQ0FBQyxFQUNELE1BQU07SUFDRlYsY0FBTSxDQUFDQyxJQUFJLENBQUMsb0NBQW9Db0IsU0FBUyxDQUFDWCxNQUFNLEVBQUUsQ0FBQztJQUNuRVcsU0FBUyxDQUFDRSxLQUFLLEdBQUdDLHlCQUFjLENBQUNTLEtBQUs7SUFDdEN0QyxNQUFNLENBQUMrQixJQUFJLENBQUNDLG1CQUFXLENBQUNDLElBQUksRUFBRVAsU0FBUyxDQUFDO0VBQzVDLENBQ0osQ0FBQztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNPLE1BQWVhLE1BQU0sQ0FBQztBQWtCNUJDLE9BQUEsQ0FBQUQsTUFBQSxHQUFBQSxNQUFBO0FBRU0sTUFBTUUsZUFBZSxTQUFTRixNQUFNLENBQUM7RUFLeEM7RUFDT0csV0FBV0EsQ0FBQ0MsYUFBOEUsRUFBRTtJQUMvRixLQUFLLENBQUMsQ0FBQztJQUFDLElBQUFDLGdCQUFBLENBQUFDLE9BQUE7SUFBQSxJQUFBRCxnQkFBQSxDQUFBQyxPQUFBO0lBQUEsSUFBQUQsZ0JBQUEsQ0FBQUMsT0FBQTtJQUNSLElBQUksQ0FBQ0MsT0FBTyxHQUFHSCxhQUFhLENBQUNJLE9BQU87SUFDcEMsSUFBSSxDQUFDQyxXQUFXLEdBQUdMLGFBQWEsQ0FBQ00sWUFBWTtJQUM3QyxJQUFJLENBQUNDLFNBQVMsR0FBR1AsYUFBYSxDQUFDUSxVQUFVO0VBQzdDOztFQUVBO0VBQ0EsSUFBV0MsSUFBSUEsQ0FBQSxFQUFXO0lBQ3RCLE9BQU8sSUFBSSxDQUFDSixXQUFXLElBQUksSUFBSSxDQUFDRixPQUFPO0VBQzNDO0VBRUEsSUFBV08sTUFBTUEsQ0FBQSxFQUFXO0lBQ3hCLE9BQU8sSUFBSSxDQUFDUCxPQUFPO0VBQ3ZCO0VBRU9RLGVBQWVBLENBQUEsRUFBdUI7SUFDekMsT0FBTyxJQUFJLENBQUNKLFNBQVM7RUFDekI7QUFDSjtBQUFDVixPQUFBLENBQUFDLGVBQUEsR0FBQUEsZUFBQTtBQUVNLE1BQU1yQixjQUFjLFNBQVNtQixNQUFNLENBQUM7RUFHaENHLFdBQVdBLENBQUNhLEVBQVUsRUFBRTtJQUMzQixLQUFLLENBQUMsQ0FBQztJQUFDLElBQUFYLGdCQUFBLENBQUFDLE9BQUE7SUFDUixJQUFJLENBQUNVLEVBQUUsR0FBR0EsRUFBRTtFQUNoQjs7RUFFQTtFQUNBO0VBQ0E7RUFDQSxJQUFXQyxPQUFPQSxDQUFBLEVBQVk7SUFDMUIsT0FBTyxJQUFJLENBQUNELEVBQUUsQ0FBQ0UsUUFBUSxDQUFDLEdBQUcsQ0FBQztFQUNoQzs7RUFFQTtFQUNBLElBQVdMLElBQUlBLENBQUEsRUFBVztJQUN0QixPQUFPLElBQUksQ0FBQ0csRUFBRTtFQUNsQjtFQUVBLElBQVdGLE1BQU1BLENBQUEsRUFBVztJQUN4QixPQUFPLElBQUksQ0FBQ0UsRUFBRTtFQUNsQjtFQUVPRCxlQUFlQSxDQUFBLEVBQXVCO0lBQ3pDLE9BQU9JLFNBQVM7RUFDcEI7QUFDSjtBQUFDbEIsT0FBQSxDQUFBcEIsY0FBQSxHQUFBQSxjQUFBO0FBT0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLGVBQWV1QyxtQ0FBbUNBLENBQUMzRCxNQUFvQixFQUFFQyxPQUFpQixFQUFvQjtFQUNqSCxJQUFJLElBQUFvQiwrQkFBd0IsRUFBQ3JCLE1BQU0sQ0FBQyxFQUFFO0lBQ2xDO0lBQ0EsSUFBSUMsT0FBTyxDQUFDa0IsTUFBTSxLQUFLLENBQUMsSUFBSWxCLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWW1CLGNBQWMsRUFBRSxPQUFPLElBQUk7O0lBRTdFO0lBQ0E7SUFDQSxNQUFNd0MsY0FBYyxHQUFHM0QsT0FBTyxDQUFDNEQsSUFBSSxDQUFFQyxDQUFDLElBQUtBLENBQUMsWUFBWTFDLGNBQWMsQ0FBQztJQUN2RSxJQUFJLENBQUN3QyxjQUFjLEVBQUU7TUFDakIsTUFBTUcsU0FBUyxHQUFHOUQsT0FBTyxDQUFDK0QsR0FBRyxDQUFFRixDQUFDLElBQUtBLENBQUMsQ0FBQ1QsTUFBTSxDQUFDO01BQzlDLE1BQU1ZLGlCQUFpQixHQUFHLE1BQU0sSUFBQUMsZ0NBQW9CLEVBQUNsRSxNQUFNLEVBQUUrRCxTQUFTLENBQUM7TUFDdkUsSUFBSUUsaUJBQWlCLEVBQUU7UUFDbkIsT0FBTyxJQUFJO01BQ2Y7SUFDSjtFQUNKO0VBRUEsT0FBTyxLQUFLO0FBQ2hCIiwiaWdub3JlTGlzdCI6W119