matrix-react-sdk
Version:
SDK for matrix.org using React
250 lines (205 loc) • 26.7 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.CommunityPrototypeStore = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _AsyncStoreWithClient = require("./AsyncStoreWithClient");
var _dispatcher = _interopRequireDefault(require("../dispatcher/dispatcher"));
var _membership = require("../utils/membership");
var _SettingsStore = _interopRequireDefault(require("../settings/SettingsStore"));
var utils = _interopRequireWildcard(require("matrix-js-sdk/src/utils"));
var _AsyncStore = require("./AsyncStore");
var _FlairStore = _interopRequireDefault(require("./FlairStore"));
var _GroupFilterOrderStore = _interopRequireDefault(require("./GroupFilterOrderStore"));
var _GroupStore = _interopRequireDefault(require("./GroupStore"));
/*
Copyright 2020 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
class CommunityPrototypeStore extends _AsyncStoreWithClient.AsyncStoreWithClient
/*:: <IState>*/
{
constructor() {
super(_dispatcher.default, {});
}
static get instance()
/*: CommunityPrototypeStore*/
{
return CommunityPrototypeStore.internalInstance;
}
static getUpdateEventName(roomId
/*: string*/
)
/*: string*/
{
return `${_AsyncStore.UPDATE_EVENT}:${roomId}`;
}
getSelectedCommunityId()
/*: string*/
{
if (_SettingsStore.default.getValue("feature_communities_v2_prototypes")) {
return _GroupFilterOrderStore.default.getSelectedTags()[0];
}
return null; // no selection as far as this function is concerned
}
getSelectedCommunityName()
/*: string*/
{
return CommunityPrototypeStore.instance.getCommunityName(this.getSelectedCommunityId());
}
getSelectedCommunityGeneralChat()
/*: Room*/
{
const communityId = this.getSelectedCommunityId();
if (communityId) {
return this.getGeneralChat(communityId);
}
}
getCommunityName(communityId
/*: string*/
)
/*: string*/
{
const profile = _FlairStore.default.getGroupProfileCachedFast(this.matrixClient, communityId);
return profile?.name || communityId;
}
getCommunityProfile(communityId
/*: string*/
)
/*: { name?: string, avatarUrl?: string }*/
{
return _FlairStore.default.getGroupProfileCachedFast(this.matrixClient, communityId);
}
getGeneralChat(communityId
/*: string*/
)
/*: Room*/
{
const rooms = _GroupStore.default.getGroupRooms(communityId).map(r => this.matrixClient.getRoom(r.roomId)).filter(r => !!r);
let chat = rooms.find(r => {
const idState = r.currentState.getStateEvents("im.vector.general_chat", "");
if (!idState || idState.getContent()['groupId'] !== communityId) return false;
return true;
});
if (!chat) chat = rooms[0];
return chat; // can be null
}
isAdminOf(communityId
/*: string*/
)
/*: boolean*/
{
const members = _GroupStore.default.getGroupMembers(communityId);
const myMember = members.find(m => m.userId === this.matrixClient.getUserId());
return myMember?.isPrivileged;
}
canInviteTo(communityId
/*: string*/
)
/*: boolean*/
{
const generalChat = this.getGeneralChat(communityId);
if (!generalChat) return this.isAdminOf(communityId);
const myMember = generalChat.getMember(this.matrixClient.getUserId());
if (!myMember) return this.isAdminOf(communityId);
const pl = generalChat.currentState.getStateEvents("m.room.power_levels", "");
if (!pl) return this.isAdminOf(communityId);
const invitePl = (0, utils.isNullOrUndefined)(pl.invite) ? 50 : Number(pl.invite);
return invitePl <= myMember.powerLevel;
}
async onAction(payload
/*: ActionPayload*/
)
/*: Promise<any>*/
{
if (!this.matrixClient || !_SettingsStore.default.getValue("feature_communities_v2_prototypes")) {
return;
}
if (payload.action === "MatrixActions.Room.myMembership") {
const room
/*: Room*/
= payload.room;
const membership = (0, _membership.getEffectiveMembership)(payload.membership);
const oldMembership = (0, _membership.getEffectiveMembership)(payload.oldMembership);
if (membership === oldMembership) return;
if (membership === _membership.EffectiveMembership.Invite) {
try {
const path = utils.encodeUri("/rooms/$roomId/group_info", {
$roomId: room.roomId
});
const profile = await this.matrixClient._http.authedRequest(undefined, "GET", path, undefined, undefined, {
prefix: "/_matrix/client/unstable/im.vector.custom"
}); // we use global account data because per-room account data on invites is unreliable
await this.matrixClient.setAccountData("im.vector.group_info." + room.roomId, profile);
} catch (e) {
console.warn("Non-fatal error getting group information for invite:", e);
}
}
} else if (payload.action === "MatrixActions.accountData") {
if (payload.event_type.startsWith("im.vector.group_info.")) {
const roomId = payload.event_type.substring("im.vector.group_info.".length);
this.emit(CommunityPrototypeStore.getUpdateEventName(roomId), roomId);
}
} else if (payload.action === "select_tag") {
// Automatically select the general chat when switching communities
const chat = this.getGeneralChat(payload.tag);
if (chat) {
_dispatcher.default.dispatch({
action: 'view_room',
room_id: chat.roomId
});
}
}
}
getInviteProfile(roomId
/*: string*/
)
/*: IRoomProfile*/
{
if (!this.matrixClient) return {
displayName: null,
avatarMxc: null
};
const room = this.matrixClient.getRoom(roomId);
if (_SettingsStore.default.getValue("feature_communities_v2_prototypes")) {
const data = this.matrixClient.getAccountData("im.vector.group_info." + roomId);
if (data && data.getContent()) {
return {
displayName: data.getContent().name,
avatarMxc: data.getContent().avatar_url
};
}
}
return {
displayName: room.name,
avatarMxc: room.avatar_url
};
}
async onReady()
/*: Promise<any>*/
{
for (const room of this.matrixClient.getRooms()) {
const myMember = room.currentState.getMembers().find(m => m.userId === this.matrixClient.getUserId());
if (!myMember) continue;
if ((0, _membership.getEffectiveMembership)(myMember.membership) === _membership.EffectiveMembership.Invite) {
// Fake an update for anything that might have started listening before the invite
// data was available (eg: RoomPreviewBar after a refresh)
this.emit(CommunityPrototypeStore.getUpdateEventName(room.roomId), room.roomId);
}
}
}
}
exports.CommunityPrototypeStore = CommunityPrototypeStore;
(0, _defineProperty2.default)(CommunityPrototypeStore, "internalInstance", new CommunityPrototypeStore());
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yZXMvQ29tbXVuaXR5UHJvdG90eXBlU3RvcmUudHMiXSwibmFtZXMiOlsiQ29tbXVuaXR5UHJvdG90eXBlU3RvcmUiLCJBc3luY1N0b3JlV2l0aENsaWVudCIsImNvbnN0cnVjdG9yIiwiZGVmYXVsdERpc3BhdGNoZXIiLCJpbnN0YW5jZSIsImludGVybmFsSW5zdGFuY2UiLCJnZXRVcGRhdGVFdmVudE5hbWUiLCJyb29tSWQiLCJVUERBVEVfRVZFTlQiLCJnZXRTZWxlY3RlZENvbW11bml0eUlkIiwiU2V0dGluZ3NTdG9yZSIsImdldFZhbHVlIiwiR3JvdXBGaWx0ZXJPcmRlclN0b3JlIiwiZ2V0U2VsZWN0ZWRUYWdzIiwiZ2V0U2VsZWN0ZWRDb21tdW5pdHlOYW1lIiwiZ2V0Q29tbXVuaXR5TmFtZSIsImdldFNlbGVjdGVkQ29tbXVuaXR5R2VuZXJhbENoYXQiLCJjb21tdW5pdHlJZCIsImdldEdlbmVyYWxDaGF0IiwicHJvZmlsZSIsIkZsYWlyU3RvcmUiLCJnZXRHcm91cFByb2ZpbGVDYWNoZWRGYXN0IiwibWF0cml4Q2xpZW50IiwibmFtZSIsImdldENvbW11bml0eVByb2ZpbGUiLCJyb29tcyIsIkdyb3VwU3RvcmUiLCJnZXRHcm91cFJvb21zIiwibWFwIiwiciIsImdldFJvb20iLCJmaWx0ZXIiLCJjaGF0IiwiZmluZCIsImlkU3RhdGUiLCJjdXJyZW50U3RhdGUiLCJnZXRTdGF0ZUV2ZW50cyIsImdldENvbnRlbnQiLCJpc0FkbWluT2YiLCJtZW1iZXJzIiwiZ2V0R3JvdXBNZW1iZXJzIiwibXlNZW1iZXIiLCJtIiwidXNlcklkIiwiZ2V0VXNlcklkIiwiaXNQcml2aWxlZ2VkIiwiY2FuSW52aXRlVG8iLCJnZW5lcmFsQ2hhdCIsImdldE1lbWJlciIsInBsIiwiaW52aXRlUGwiLCJpbnZpdGUiLCJOdW1iZXIiLCJwb3dlckxldmVsIiwib25BY3Rpb24iLCJwYXlsb2FkIiwiYWN0aW9uIiwicm9vbSIsIm1lbWJlcnNoaXAiLCJvbGRNZW1iZXJzaGlwIiwiRWZmZWN0aXZlTWVtYmVyc2hpcCIsIkludml0ZSIsInBhdGgiLCJ1dGlscyIsImVuY29kZVVyaSIsIiRyb29tSWQiLCJfaHR0cCIsImF1dGhlZFJlcXVlc3QiLCJ1bmRlZmluZWQiLCJwcmVmaXgiLCJzZXRBY2NvdW50RGF0YSIsImUiLCJjb25zb2xlIiwid2FybiIsImV2ZW50X3R5cGUiLCJzdGFydHNXaXRoIiwic3Vic3RyaW5nIiwibGVuZ3RoIiwiZW1pdCIsInRhZyIsImRpcyIsImRpc3BhdGNoIiwicm9vbV9pZCIsImdldEludml0ZVByb2ZpbGUiLCJkaXNwbGF5TmFtZSIsImF2YXRhck14YyIsImRhdGEiLCJnZXRBY2NvdW50RGF0YSIsImF2YXRhcl91cmwiLCJvblJlYWR5IiwiZ2V0Um9vbXMiLCJnZXRNZW1iZXJzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBZ0JBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQTFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF5Qk8sTUFBTUEsdUJBQU4sU0FBc0NDO0FBQXRDO0FBQW1FO0FBRzlEQyxFQUFBQSxXQUFSLEdBQXNCO0FBQ2xCLFVBQU1DLG1CQUFOLEVBQXlCLEVBQXpCO0FBQ0g7O0FBRUQsYUFBa0JDLFFBQWxCO0FBQUE7QUFBc0Q7QUFDbEQsV0FBT0osdUJBQXVCLENBQUNLLGdCQUEvQjtBQUNIOztBQUVELFNBQWNDLGtCQUFkLENBQWlDQztBQUFqQztBQUFBO0FBQUE7QUFBeUQ7QUFDckQsV0FBUSxHQUFFQyx3QkFBYSxJQUFHRCxNQUFPLEVBQWpDO0FBQ0g7O0FBRU1FLEVBQUFBLHNCQUFQO0FBQUE7QUFBd0M7QUFDcEMsUUFBSUMsdUJBQWNDLFFBQWQsQ0FBdUIsbUNBQXZCLENBQUosRUFBaUU7QUFDN0QsYUFBT0MsK0JBQXNCQyxlQUF0QixHQUF3QyxDQUF4QyxD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TUFBeEU7QUFDSDtBQUNKO0FBQ0o7O0FBMUlxRTs7OzhCQUE3RFAsdUIsc0JBQ3lCLElBQUlBLHVCQUFKLEUiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjAgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgeyBBc3luY1N0b3JlV2l0aENsaWVudCB9IGZyb20gXCIuL0FzeW5jU3RvcmVXaXRoQ2xpZW50XCI7XG5pbXBvcnQgZGVmYXVsdERpc3BhdGNoZXIgZnJvbSBcIi4uL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgQWN0aW9uUGF5bG9hZCB9IGZyb20gXCIuLi9kaXNwYXRjaGVyL3BheWxvYWRzXCI7XG5pbXBvcnQgeyBSb29tIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21vZGVscy9yb29tXCI7XG5pbXBvcnQgeyBFZmZlY3RpdmVNZW1iZXJzaGlwLCBnZXRFZmZlY3RpdmVNZW1iZXJzaGlwIH0gZnJvbSBcIi4uL3V0aWxzL21lbWJlcnNoaXBcIjtcbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlXCI7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvdXRpbHNcIjtcbmltcG9ydCB7IFVQREFURV9FVkVOVCB9IGZyb20gXCIuL0FzeW5jU3RvcmVcIjtcbmltcG9ydCBGbGFpclN0b3JlIGZyb20gXCIuL0ZsYWlyU3RvcmVcIjtcbmltcG9ydCBHcm91cEZpbHRlck9yZGVyU3RvcmUgZnJvbSBcIi4vR3JvdXBGaWx0ZXJPcmRlclN0b3JlXCI7XG5pbXBvcnQgR3JvdXBTdG9yZSBmcm9tIFwiLi9Hcm91cFN0b3JlXCI7XG5pbXBvcnQgZGlzIGZyb20gXCIuLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCB7IGlzTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL3V0aWxzXCI7XG5cbmludGVyZmFjZSBJU3RhdGUge1xuICAgIC8vIG5vdGhpbmcgb2YgdmFsdWUgLSB3ZSB1c2UgYWNjb3VudCBkYXRhXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJvb21Qcm9maWxlIHtcbiAgICBkaXNwbGF5TmFtZTogc3RyaW5nO1xuICAgIGF2YXRhck14Yzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgQ29tbXVuaXR5UHJvdG90eXBlU3RvcmUgZXh0ZW5kcyBBc3luY1N0b3JlV2l0aENsaWVudDxJU3RhdGU+IHtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnRlcm5hbEluc3RhbmNlID0gbmV3IENvbW11bml0eVByb3RvdHlwZVN0b3JlKCk7XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihkZWZhdWx0RGlzcGF0Y2hlciwge30pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGluc3RhbmNlKCk6IENvbW11bml0eVByb3RvdHlwZVN0b3JlIHtcbiAgICAgICAgcmV0dXJuIENvbW11bml0eVByb3RvdHlwZVN0b3JlLmludGVybmFsSW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRVcGRhdGVFdmVudE5hbWUocm9vbUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7VVBEQVRFX0VWRU5UfToke3Jvb21JZH1gO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTZWxlY3RlZENvbW11bml0eUlkKCk6IHN0cmluZyB7XG4gICAgICAgIGlmIChTZXR0aW5nc1N0b3JlLmdldFZhbHVlKFwiZmVhdHVyZV9jb21tdW5pdGllc192Ml9wcm90b3R5cGVzXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gR3JvdXBGaWx0ZXJPcmRlclN0b3JlLmdldFNlbGVjdGVkVGFncygpWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsOyAvLyBubyBzZWxlY3Rpb24gYXMgZmFyIGFzIHRoaXMgZnVuY3Rpb24gaXMgY29uY2VybmVkXG4gICAgfVxuXG4gICAgcHVibGljIGdldFNlbGVjdGVkQ29tbXVuaXR5TmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gQ29tbXVuaXR5UHJvdG90eXBlU3RvcmUuaW5zdGFuY2UuZ2V0Q29tbXVuaXR5TmFtZSh0aGlzLmdldFNlbGVjdGVkQ29tbXVuaXR5SWQoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNlbGVjdGVkQ29tbXVuaXR5R2VuZXJhbENoYXQoKTogUm9vbSB7XG4gICAgICAgIGNvbnN0IGNvbW11bml0eUlkID0gdGhpcy5nZXRTZWxlY3RlZENvbW11bml0eUlkKCk7XG4gICAgICAgIGlmIChjb21tdW5pdHlJZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0R2VuZXJhbENoYXQoY29tbXVuaXR5SWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbW11bml0eU5hbWUoY29tbXVuaXR5SWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHByb2ZpbGUgPSBGbGFpclN0b3JlLmdldEdyb3VwUHJvZmlsZUNhY2hlZEZhc3QodGhpcy5tYXRyaXhDbGllbnQsIGNvbW11bml0eUlkKTtcbiAgICAgICAgcmV0dXJuIHByb2ZpbGU/Lm5hbWUgfHwgY29tbXVuaXR5SWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbW11bml0eVByb2ZpbGUoY29tbXVuaXR5SWQ6IHN0cmluZyk6IHsgbmFtZT86IHN0cmluZywgYXZhdGFyVXJsPzogc3RyaW5nIH0ge1xuICAgICAgICByZXR1cm4gRmxhaXJTdG9yZS5nZXRHcm91cFByb2ZpbGVDYWNoZWRGYXN0KHRoaXMubWF0cml4Q2xpZW50LCBjb21tdW5pdHlJZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEdlbmVyYWxDaGF0KGNvbW11bml0eUlkOiBzdHJpbmcpOiBSb29tIHtcbiAgICAgICAgY29uc3Qgcm9vbXMgPSBHcm91cFN0b3JlLmdldEdyb3VwUm9vbXMoY29tbXVuaXR5SWQpXG4gICAgICAgICAgICAubWFwKHIgPT4gdGhpcy5tYXRyaXhDbGllbnQuZ2V0Um9vbShyLnJvb21JZCkpXG4gICAgICAgICAgICAuZmlsdGVyKHIgPT4gISFyKTtcbiAgICAgICAgbGV0IGNoYXQgPSByb29tcy5maW5kKHIgPT4ge1xuICAgICAgICAgICAgY29uc3QgaWRTdGF0ZSA9IHIuY3VycmVudFN0YXRlLmdldFN0YXRlRXZlbnRzKFwiaW0udmVjdG9yLmdlbmVyYWxfY2hhdFwiLCBcIlwiKTtcbiAgICAgICAgICAgIGlmICghaWRTdGF0ZSB8fCBpZFN0YXRlLmdldENvbnRlbnQoKVsnZ3JvdXBJZCddICE9PSBjb21tdW5pdHlJZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWNoYXQpIGNoYXQgPSByb29tc1swXTtcbiAgICAgICAgcmV0dXJuIGNoYXQ7IC8vIGNhbiBiZSBudWxsXG4gICAgfVxuXG4gICAgcHVibGljIGlzQWRtaW5PZihjb21tdW5pdHlJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSBHcm91cFN0b3JlLmdldEdyb3VwTWVtYmVycyhjb21tdW5pdHlJZCk7XG4gICAgICAgIGNvbnN0IG15TWVtYmVyID0gbWVtYmVycy5maW5kKG0gPT4gbS51c2VySWQgPT09IHRoaXMubWF0cml4Q2xpZW50LmdldFVzZXJJZCgpKTtcbiAgICAgICAgcmV0dXJuIG15TWVtYmVyPy5pc1ByaXZpbGVnZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGNhbkludml0ZVRvKGNvbW11bml0eUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZ2VuZXJhbENoYXQgPSB0aGlzLmdldEdlbmVyYWxDaGF0KGNvbW11bml0eUlkKTtcbiAgICAgICAgaWYgKCFnZW5lcmFsQ2hhdCkgcmV0dXJuIHRoaXMuaXNBZG1pbk9mKGNvbW11bml0eUlkKTtcblxuICAgICAgICBjb25zdCBteU1lbWJlciA9IGdlbmVyYWxDaGF0LmdldE1lbWJlcih0aGlzLm1hdHJpeENsaWVudC5nZXRVc2VySWQoKSk7XG4gICAgICAgIGlmICghbXlNZW1iZXIpIHJldHVybiB0aGlzLmlzQWRtaW5PZihjb21tdW5pdHlJZCk7XG5cbiAgICAgICAgY29uc3QgcGwgPSBnZW5lcmFsQ2hhdC5jdXJyZW50U3RhdGUuZ2V0U3RhdGVFdmVudHMoXCJtLnJvb20ucG93ZXJfbGV2ZWxzXCIsIFwiXCIpO1xuICAgICAgICBpZiAoIXBsKSByZXR1cm4gdGhpcy5pc0FkbWluT2YoY29tbXVuaXR5SWQpO1xuXG4gICAgICAgIGNvbnN0IGludml0ZVBsID0gaXNOdWxsT3JVbmRlZmluZWQocGwuaW52aXRlKSA/IDUwIDogTnVtYmVyKHBsLmludml0ZSk7XG4gICAgICAgIHJldHVybiBpbnZpdGVQbCA8PSBteU1lbWJlci5wb3dlckxldmVsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBvbkFjdGlvbihwYXlsb2FkOiBBY3Rpb25QYXlsb2FkKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgaWYgKCF0aGlzLm1hdHJpeENsaWVudCB8fCAhU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShcImZlYXR1cmVfY29tbXVuaXRpZXNfdjJfcHJvdG90eXBlc1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBheWxvYWQuYWN0aW9uID09PSBcIk1hdHJpeEFjdGlvbnMuUm9vbS5teU1lbWJlcnNoaXBcIikge1xuICAgICAgICAgICAgY29uc3Qgcm9vbTogUm9vbSA9IHBheWxvYWQucm9vbTtcbiAgICAgICAgICAgIGNvbnN0IG1lbWJlcnNoaXAgPSBnZXRFZmZlY3RpdmVNZW1iZXJzaGlwKHBheWxvYWQubWVtYmVyc2hpcCk7XG4gICAgICAgICAgICBjb25zdCBvbGRNZW1iZXJzaGlwID0gZ2V0RWZmZWN0aXZlTWVtYmVyc2hpcChwYXlsb2FkLm9sZE1lbWJlcnNoaXApO1xuICAgICAgICAgICAgaWYgKG1lbWJlcnNoaXAgPT09IG9sZE1lbWJlcnNoaXApIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKG1lbWJlcnNoaXAgPT09IEVmZmVjdGl2ZU1lbWJlcnNoaXAuSW52aXRlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IHV0aWxzLmVuY29kZVVyaShcIi9yb29tcy8kcm9vbUlkL2dyb3VwX2luZm9cIiwgeyRyb29tSWQ6IHJvb20ucm9vbUlkfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCB0aGlzLm1hdHJpeENsaWVudC5faHR0cC5hdXRoZWRSZXF1ZXN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLCBcIkdFVFwiLCBwYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB7cHJlZml4OiBcIi9fbWF0cml4L2NsaWVudC91bnN0YWJsZS9pbS52ZWN0b3IuY3VzdG9tXCJ9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2UgdXNlIGdsb2JhbCBhY2NvdW50IGRhdGEgYmVjYXVzZSBwZXItcm9vbSBhY2NvdW50IGRhdGEgb24gaW52aXRlcyBpcyB1bnJlbGlhYmxlXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWF0cml4Q2xpZW50LnNldEFjY291bnREYXRhKFwiaW0udmVjdG9yLmdyb3VwX2luZm8uXCIgKyByb29tLnJvb21JZCwgcHJvZmlsZSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJOb24tZmF0YWwgZXJyb3IgZ2V0dGluZyBncm91cCBpbmZvcm1hdGlvbiBmb3IgaW52aXRlOlwiLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZC5hY3Rpb24gPT09IFwiTWF0cml4QWN0aW9ucy5hY2NvdW50RGF0YVwiKSB7XG4gICAgICAgICAgICBpZiAocGF5bG9hZC5ldmVudF90eXBlLnN0YXJ0c1dpdGgoXCJpbS52ZWN0b3IuZ3JvdXBfaW5mby5cIikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb29tSWQgPSBwYXlsb2FkLmV2ZW50X3R5cGUuc3Vic3RyaW5nKFwiaW0udmVjdG9yLmdyb3VwX2luZm8uXCIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoQ29tbXVuaXR5UHJvdG90eXBlU3RvcmUuZ2V0VXBkYXRlRXZlbnROYW1lKHJvb21JZCksIHJvb21JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZC5hY3Rpb24gPT09IFwic2VsZWN0X3RhZ1wiKSB7XG4gICAgICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IHNlbGVjdCB0aGUgZ2VuZXJhbCBjaGF0IHdoZW4gc3dpdGNoaW5nIGNvbW11bml0aWVzXG4gICAgICAgICAgICBjb25zdCBjaGF0ID0gdGhpcy5nZXRHZW5lcmFsQ2hhdChwYXlsb2FkLnRhZyk7XG4gICAgICAgICAgICBpZiAoY2hhdCkge1xuICAgICAgICAgICAgICAgIGRpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3ZpZXdfcm9vbScsXG4gICAgICAgICAgICAgICAgICAgIHJvb21faWQ6IGNoYXQucm9vbUlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldEludml0ZVByb2ZpbGUocm9vbUlkOiBzdHJpbmcpOiBJUm9vbVByb2ZpbGUge1xuICAgICAgICBpZiAoIXRoaXMubWF0cml4Q2xpZW50KSByZXR1cm4ge2Rpc3BsYXlOYW1lOiBudWxsLCBhdmF0YXJNeGM6IG51bGx9O1xuICAgICAgICBjb25zdCByb29tID0gdGhpcy5tYXRyaXhDbGllbnQuZ2V0Um9vbShyb29tSWQpO1xuICAgICAgICBpZiAoU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShcImZlYXR1cmVfY29tbXVuaXRpZXNfdjJfcHJvdG90eXBlc1wiKSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMubWF0cml4Q2xpZW50LmdldEFjY291bnREYXRhKFwiaW0udmVjdG9yLmdyb3VwX2luZm8uXCIgKyByb29tSWQpO1xuICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5nZXRDb250ZW50KCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge2Rpc3BsYXlOYW1lOiBkYXRhLmdldENvbnRlbnQoKS5uYW1lLCBhdmF0YXJNeGM6IGRhdGEuZ2V0Q29udGVudCgpLmF2YXRhcl91cmx9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7ZGlzcGxheU5hbWU6IHJvb20ubmFtZSwgYXZhdGFyTXhjOiByb29tLmF2YXRhcl91cmx9O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBvblJlYWR5KCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGZvciAoY29uc3Qgcm9vbSBvZiB0aGlzLm1hdHJpeENsaWVudC5nZXRSb29tcygpKSB7XG4gICAgICAgICAgICBjb25zdCBteU1lbWJlciA9IHJvb20uY3VycmVudFN0YXRlLmdldE1lbWJlcnMoKS5maW5kKG0gPT4gbS51c2VySWQgPT09IHRoaXMubWF0cml4Q2xpZW50LmdldFVzZXJJZCgpKTtcbiAgICAgICAgICAgIGlmICghbXlNZW1iZXIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGdldEVmZmVjdGl2ZU1lbWJlcnNoaXAobXlNZW1iZXIubWVtYmVyc2hpcCkgPT09IEVmZmVjdGl2ZU1lbWJlcnNoaXAuSW52aXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gRmFrZSBhbiB1cGRhdGUgZm9yIGFueXRoaW5nIHRoYXQgbWlnaHQgaGF2ZSBzdGFydGVkIGxpc3RlbmluZyBiZWZvcmUgdGhlIGludml0ZVxuICAgICAgICAgICAgICAgIC8vIGRhdGEgd2FzIGF2YWlsYWJsZSAoZWc6IFJvb21QcmV2aWV3QmFyIGFmdGVyIGEgcmVmcmVzaClcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoQ29tbXVuaXR5UHJvdG90eXBlU3RvcmUuZ2V0VXBkYXRlRXZlbnROYW1lKHJvb20ucm9vbUlkKSwgcm9vbS5yb29tSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl19