@hsaadawy/ngx-chat
Version:
110 lines • 19.3 kB
JavaScript
import { __awaiter } from "tslib";
import { xml } from '@xmpp/client';
import { BehaviorSubject } from 'rxjs';
import { AbstractXmppPlugin } from './abstract-xmpp-plugin';
export const MUC_SUB_FEATURE_ID = 'urn:xmpp:mucsub:0';
export var MUC_SUB_EVENT_TYPE;
(function (MUC_SUB_EVENT_TYPE) {
MUC_SUB_EVENT_TYPE["presence"] = "urn:xmpp:mucsub:nodes:presence";
MUC_SUB_EVENT_TYPE["messages"] = "urn:xmpp:mucsub:nodes:messages";
MUC_SUB_EVENT_TYPE["affiliations"] = "urn:xmpp:mucsub:nodes:affiliations";
MUC_SUB_EVENT_TYPE["subscribers"] = "urn:xmpp:mucsub:nodes:subscribers";
MUC_SUB_EVENT_TYPE["config"] = "urn:xmpp:mucsub:nodes:config";
MUC_SUB_EVENT_TYPE["subject"] = "urn:xmpp:mucsub:nodes:subject";
MUC_SUB_EVENT_TYPE["system"] = "urn:xmpp:mucsub:nodes:system";
})(MUC_SUB_EVENT_TYPE || (MUC_SUB_EVENT_TYPE = {}));
/**
* support for https://docs.ejabberd.im/developer/xmpp-clients-bots/extensions/muc-sub/
*/
export class MucSubPlugin extends AbstractXmppPlugin {
constructor(xmppChatAdapter, serviceDiscoveryPlugin) {
super();
this.xmppChatAdapter = xmppChatAdapter;
this.serviceDiscoveryPlugin = serviceDiscoveryPlugin;
this.supportsMucSub$ = new BehaviorSubject('unknown');
}
onBeforeOnline() {
return this.determineSupportForMucSub();
}
determineSupportForMucSub() {
return __awaiter(this, void 0, void 0, function* () {
let isSupported;
try {
const service = yield this.serviceDiscoveryPlugin.findService('conference', 'text');
isSupported = service.features.includes(MUC_SUB_FEATURE_ID);
}
catch (e) {
isSupported = false;
}
this.supportsMucSub$.next(isSupported);
});
}
onOffline() {
this.supportsMucSub$.next('unknown');
}
subscribeRoom(roomJid, nodes = []) {
return __awaiter(this, void 0, void 0, function* () {
const nick = this.xmppChatAdapter.chatConnectionService.userJid.local;
yield this.xmppChatAdapter.chatConnectionService.sendIq(makeSubscribeRoomStanza(roomJid, nick, nodes));
});
}
unsubscribeRoom(roomJid) {
return __awaiter(this, void 0, void 0, function* () {
yield this.xmppChatAdapter.chatConnectionService.sendIq(makeUnsubscribeRoomStanza(roomJid));
});
}
/**
* A room moderator can unsubscribe others providing the their jid as attribute to the information query (iq)
* see: https://docs.ejabberd.im/developer/xmpp-clients-bots/extensions/muc-sub/#unsubscribing-from-a-muc-room
* @param roomJid for the room to be unsubscribed from
* @param jid user id to be unsubscribed
*/
unsubscribeJidFromRoom(roomJid, jid) {
this.xmppChatAdapter.chatConnectionService.sendIq(xml('iq', { type: 'set', to: roomJid }, xml('unsubscribe', { xmlns: 'urn:xmpp:mucsub:0', jid })));
}
/**
* A user can query the MUC service to get their list of subscriptions.
* see: https://docs.ejabberd.im/developer/xmpp-clients-bots/extensions/muc-sub/#g dd ddetting-list-of-subscribed-rooms
*/
getSubscribedRooms() {
return __awaiter(this, void 0, void 0, function* () {
const { local, domain } = this.xmppChatAdapter.chatConnectionService.userJid;
const from = `${local}@${domain}`;
const subscriptions = yield this.xmppChatAdapter.chatConnectionService.sendIq(xml('iq', { type: 'get', from, to: 'muc.' + domain }, xml('subscriptions', { xmlns: 'urn:xmpp:mucsub:0' })));
return subscriptions.getChildren('subscription').map(sub => sub.getAttr('jid'));
});
}
/**
* A subscriber or room moderator can get the list of subscribers by sending <subscriptions/> request directly to the room JID.
* see: https://docs.ejabberd.im/developer/xmpp-clients-bots/extensions/muc-sub/#getting-list-of-subscribers-of-a-room
* @param roomJid of the room the get a subscriber list from
*/
getSubscribers(roomJid) {
this.xmppChatAdapter.chatConnectionService.sendIq(xml('iq', { type: 'get', to: roomJid }, xml('subscriptions', { xmlns: 'urn:xmpp:mucsub:0' })));
}
retrieveSubscriptions() {
var _a, _b;
return __awaiter(this, void 0, void 0, function* () {
const service = yield this.serviceDiscoveryPlugin.findService('conference', 'text');
const result = yield this.xmppChatAdapter.chatConnectionService.sendIq(makeRetrieveSubscriptionsStanza(service.jid));
const subscriptions = (_b = (_a = result
.getChild('subscriptions', MUC_SUB_FEATURE_ID)) === null || _a === void 0 ? void 0 : _a.getChildren('subscription')) === null || _b === void 0 ? void 0 : _b.map(subscriptionElement => {
var _a, _b;
const subscribedEvents = (_b = (_a = subscriptionElement
.getChildren('event')) === null || _a === void 0 ? void 0 : _a.map(eventElement => eventElement.attrs.node)) !== null && _b !== void 0 ? _b : [];
return [subscriptionElement.attrs.jid, subscribedEvents];
});
return new Map(subscriptions);
});
}
}
function makeSubscribeRoomStanza(roomJid, nick, nodes) {
return xml('iq', { type: 'set', to: roomJid }, xml('subscribe', { xmlns: MUC_SUB_FEATURE_ID, nick }, nodes.map(node => xml('event', { node }))));
}
function makeUnsubscribeRoomStanza(roomJid) {
return xml('iq', { type: 'set', to: roomJid }, xml('unsubscribe', { xmlns: MUC_SUB_FEATURE_ID }));
}
function makeRetrieveSubscriptionsStanza(conferenceServiceJid) {
return xml('iq', { type: 'get', to: conferenceServiceJid }, xml('subscriptions', { xmlns: MUC_SUB_FEATURE_ID }));
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVjLXN1Yi5wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wYXp6bmV0d29yay9uZ3gtY2hhdC9zcmMvbGliL3NlcnZpY2VzL2FkYXB0ZXJzL3htcHAvcGx1Z2lucy9tdWMtc3ViLnBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNuQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBSTVELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLG1CQUFtQixDQUFDO0FBRXRELE1BQU0sQ0FBTixJQUFZLGtCQVFYO0FBUkQsV0FBWSxrQkFBa0I7SUFDMUIsaUVBQTJDLENBQUE7SUFDM0MsaUVBQTJDLENBQUE7SUFDM0MseUVBQW1ELENBQUE7SUFDbkQsdUVBQWlELENBQUE7SUFDakQsNkRBQXVDLENBQUE7SUFDdkMsK0RBQXlDLENBQUE7SUFDekMsNkRBQXVDLENBQUE7QUFDM0MsQ0FBQyxFQVJXLGtCQUFrQixLQUFsQixrQkFBa0IsUUFRN0I7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxZQUFhLFNBQVEsa0JBQWtCO0lBR2hELFlBQ3FCLGVBQWdDLEVBQ2hDLHNCQUE4QztRQUUvRCxLQUFLLEVBQUUsQ0FBQztRQUhTLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBSmxELG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQXNCLFNBQVMsQ0FBQyxDQUFDO0lBT3ZGLENBQUM7SUFFRCxjQUFjO1FBQ1YsT0FBTyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRWEseUJBQXlCOztZQUNuQyxJQUFJLFdBQW9CLENBQUM7WUFD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RUFBRSxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBQyxFQUN2QyxHQUFHLENBQUMsYUFBYSxFQUFFLEVBQUMsS0FBSyxFQUFFLGtCQUFrQixFQUFDLENBQUMsQ0FDbEQsQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFTLCtCQUErQixDQUFDLG9CQUE0QjtJQUNqRSxPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxvQkFBb0IsRUFBQyxFQUNwRCxHQUFHLENBQUMsZUFBZSxFQUFFLEVBQUMsS0FBSyxFQUFFLGtCQUFrQixFQUFDLENBQUMsQ0FDcEQsQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB4bWwgfSBmcm9tICdAeG1wcC9jbGllbnQnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgWG1wcENoYXRBZGFwdGVyIH0gZnJvbSAnLi4veG1wcC1jaGF0LWFkYXB0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0WG1wcFBsdWdpbiB9IGZyb20gJy4vYWJzdHJhY3QteG1wcC1wbHVnaW4nO1xyXG5pbXBvcnQgeyBTZXJ2aWNlRGlzY292ZXJ5UGx1Z2luIH0gZnJvbSAnLi9zZXJ2aWNlLWRpc2NvdmVyeS5wbHVnaW4nO1xyXG5pbXBvcnQgeyBTdGFuemEgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3N0YW56YSc7XHJcblxyXG5leHBvcnQgY29uc3QgTVVDX1NVQl9GRUFUVVJFX0lEID0gJ3Vybjp4bXBwOm11Y3N1YjowJztcclxuXHJcbmV4cG9ydCBlbnVtIE1VQ19TVUJfRVZFTlRfVFlQRSB7XHJcbiAgICBwcmVzZW5jZSA9ICd1cm46eG1wcDptdWNzdWI6bm9kZXM6cHJlc2VuY2UnLFxyXG4gICAgbWVzc2FnZXMgPSAndXJuOnhtcHA6bXVjc3ViOm5vZGVzOm1lc3NhZ2VzJyxcclxuICAgIGFmZmlsaWF0aW9ucyA9ICd1cm46eG1wcDptdWNzdWI6bm9kZXM6YWZmaWxpYXRpb25zJyxcclxuICAgIHN1YnNjcmliZXJzID0gJ3Vybjp4bXBwOm11Y3N1Yjpub2RlczpzdWJzY3JpYmVycycsXHJcbiAgICBjb25maWcgPSAndXJuOnhtcHA6bXVjc3ViOm5vZGVzOmNvbmZpZycsXHJcbiAgICBzdWJqZWN0ID0gJ3Vybjp4bXBwOm11Y3N1Yjpub2RlczpzdWJqZWN0JyxcclxuICAgIHN5c3RlbSA9ICd1cm46eG1wcDptdWNzdWI6bm9kZXM6c3lzdGVtJyxcclxufVxyXG5cclxuLyoqXHJcbiAqIHN1cHBvcnQgZm9yIGh0dHBzOi8vZG9jcy5lamFiYmVyZC5pbS9kZXZlbG9wZXIveG1wcC1jbGllbnRzLWJvdHMvZXh0ZW5zaW9ucy9tdWMtc3ViL1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE11Y1N1YlBsdWdpbiBleHRlbmRzIEFic3RyYWN0WG1wcFBsdWdpbiB7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN1cHBvcnRzTXVjU3ViJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbiB8ICd1bmtub3duJz4oJ3Vua25vd24nKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHhtcHBDaGF0QWRhcHRlcjogWG1wcENoYXRBZGFwdGVyLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZURpc2NvdmVyeVBsdWdpbjogU2VydmljZURpc2NvdmVyeVBsdWdpbixcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25CZWZvcmVPbmxpbmUoKTogUHJvbWlzZUxpa2U8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRldGVybWluZVN1cHBvcnRGb3JNdWNTdWIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGRldGVybWluZVN1cHBvcnRGb3JNdWNTdWIoKSB7XHJcbiAgICAgICAgbGV0IGlzU3VwcG9ydGVkOiBib29sZWFuO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSBhd2FpdCB0aGlzLnNlcnZpY2VEaXNjb3ZlcnlQbHVnaW4uZmluZFNlcnZpY2UoJ2NvbmZlcmVuY2UnLCAndGV4dCcpO1xyXG4gICAgICAgICAgICBpc1N1cHBvcnRlZCA9IHNlcnZpY2UuZmVhdHVyZXMuaW5jbHVkZXMoTVVDX1NVQl9GRUFUVVJFX0lEKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGlzU3VwcG9ydGVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc3VwcG9ydHNNdWNTdWIkLm5leHQoaXNTdXBwb3J0ZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uT2ZmbGluZSgpIHtcclxuICAgICAgICB0aGlzLnN1cHBvcnRzTXVjU3ViJC5uZXh0KCd1bmtub3duJyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc3Vic2NyaWJlUm9vbShyb29tSmlkOiBzdHJpbmcsIG5vZGVzOiBzdHJpbmdbXSA9IFtdKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3QgbmljayA9IHRoaXMueG1wcENoYXRBZGFwdGVyLmNoYXRDb25uZWN0aW9uU2VydmljZS51c2VySmlkLmxvY2FsO1xyXG4gICAgICAgIGF3YWl0IHRoaXMueG1wcENoYXRBZGFwdGVyLmNoYXRDb25uZWN0aW9uU2VydmljZS5zZW5kSXEoXHJcbiAgICAgICAgICAgIG1ha2VTdWJzY3JpYmVSb29tU3RhbnphKHJvb21KaWQsIG5pY2ssIG5vZGVzKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdW5zdWJzY3JpYmVSb29tKHJvb21KaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGF3YWl0IHRoaXMueG1wcENoYXRBZGFwdGVyLmNoYXRDb25uZWN0aW9uU2VydmljZS5zZW5kSXEoXHJcbiAgICAgICAgICAgIG1ha2VVbnN1YnNjcmliZVJvb21TdGFuemEocm9vbUppZClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSByb29tIG1vZGVyYXRvciBjYW4gdW5zdWJzY3JpYmUgb3RoZXJzIHByb3ZpZGluZyB0aGUgdGhlaXIgamlkIGFzIGF0dHJpYnV0ZSB0byB0aGUgaW5mb3JtYXRpb24gcXVlcnkgKGlxKVxyXG4gICAgICogc2VlOiBodHRwczovL2RvY3MuZWphYmJlcmQuaW0vZGV2ZWxvcGVyL3htcHAtY2xpZW50cy1ib3RzL2V4dGVuc2lvbnMvbXVjLXN1Yi8jdW5zdWJzY3JpYmluZy1mcm9tLWEtbXVjLXJvb21cclxuICAgICAqIEBwYXJhbSByb29tSmlkIGZvciB0aGUgcm9vbSB0byBiZSB1bnN1YnNjcmliZWQgZnJvbVxyXG4gICAgICogQHBhcmFtIGppZCB1c2VyIGlkIHRvIGJlIHVuc3Vic2NyaWJlZFxyXG4gICAgICovXHJcbiAgICB1bnN1YnNjcmliZUppZEZyb21Sb29tKHJvb21KaWQ6IHN0cmluZywgamlkOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLnhtcHBDaGF0QWRhcHRlci5jaGF0Q29ubmVjdGlvblNlcnZpY2Uuc2VuZElxKFxyXG4gICAgICAgICAgICB4bWwoJ2lxJywge3R5cGU6ICdzZXQnLCB0bzogcm9vbUppZH0sXHJcbiAgICAgICAgICAgICAgICB4bWwoJ3Vuc3Vic2NyaWJlJywge3htbG5zOiAndXJuOnhtcHA6bXVjc3ViOjAnLCBqaWR9KSxcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSB1c2VyIGNhbiBxdWVyeSB0aGUgTVVDIHNlcnZpY2UgdG8gZ2V0IHRoZWlyIGxpc3Qgb2Ygc3Vic2NyaXB0aW9ucy5cclxuICAgICAqIHNlZTogaHR0cHM6Ly9kb2NzLmVqYWJiZXJkLmltL2RldmVsb3Blci94bXBwLWNsaWVudHMtYm90cy9leHRlbnNpb25zL211Yy1zdWIvI2cgZGQgZGRldHRpbmctbGlzdC1vZi1zdWJzY3JpYmVkLXJvb21zXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldFN1YnNjcmliZWRSb29tcygpIHtcclxuICAgICAgICBjb25zdCB7bG9jYWwsIGRvbWFpbn0gPSB0aGlzLnhtcHBDaGF0QWRhcHRlci5jaGF0Q29ubmVjdGlvblNlcnZpY2UudXNlckppZDtcclxuICAgICAgICBjb25zdCBmcm9tID0gYCR7bG9jYWx9QCR7ZG9tYWlufWA7XHJcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IGF3YWl0IHRoaXMueG1wcENoYXRBZGFwdGVyLmNoYXRDb25uZWN0aW9uU2VydmljZS5zZW5kSXEoXHJcbiAgICAgICAgICAgIHhtbCgnaXEnLCB7dHlwZTogJ2dldCcsIGZyb20sIHRvOiAnbXVjLicgKyBkb21haW59LFxyXG4gICAgICAgICAgICAgICAgeG1sKCdzdWJzY3JpcHRpb25zJywge3htbG5zOiAndXJuOnhtcHA6bXVjc3ViOjAnfSksXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9ucy5nZXRDaGlsZHJlbignc3Vic2NyaXB0aW9uJykubWFwKHN1YiA9PiBzdWIuZ2V0QXR0cignamlkJykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBzdWJzY3JpYmVyIG9yIHJvb20gbW9kZXJhdG9yIGNhbiBnZXQgdGhlIGxpc3Qgb2Ygc3Vic2NyaWJlcnMgYnkgc2VuZGluZyA8c3Vic2NyaXB0aW9ucy8+IHJlcXVlc3QgZGlyZWN0bHkgdG8gdGhlIHJvb20gSklELlxyXG4gICAgICogc2VlOiBodHRwczovL2RvY3MuZWphYmJlcmQuaW0vZGV2ZWxvcGVyL3htcHAtY2xpZW50cy1ib3RzL2V4dGVuc2lvbnMvbXVjLXN1Yi8jZ2V0dGluZy1saXN0LW9mLXN1YnNjcmliZXJzLW9mLWEtcm9vbVxyXG4gICAgICogQHBhcmFtIHJvb21KaWQgb2YgdGhlIHJvb20gdGhlIGdldCBhIHN1YnNjcmliZXIgbGlzdCBmcm9tXHJcbiAgICAgKi9cclxuICAgIGdldFN1YnNjcmliZXJzKHJvb21KaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMueG1wcENoYXRBZGFwdGVyLmNoYXRDb25uZWN0aW9uU2VydmljZS5zZW5kSXEoXHJcbiAgICAgICAgICAgIHhtbCgnaXEnLCB7dHlwZTogJ2dldCcsIHRvOiByb29tSmlkfSxcclxuICAgICAgICAgICAgICAgIHhtbCgnc3Vic2NyaXB0aW9ucycsIHt4bWxuczogJ3Vybjp4bXBwOm11Y3N1YjowJ30pLFxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmV0cmlldmVTdWJzY3JpcHRpb25zKCk6IFByb21pc2U8TWFwPHN0cmluZywgc3RyaW5nW10+PiB7XHJcbiAgICAgICAgY29uc3Qgc2VydmljZSA9IGF3YWl0IHRoaXMuc2VydmljZURpc2NvdmVyeVBsdWdpbi5maW5kU2VydmljZSgnY29uZmVyZW5jZScsICd0ZXh0Jyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMueG1wcENoYXRBZGFwdGVyLmNoYXRDb25uZWN0aW9uU2VydmljZS5zZW5kSXEoXHJcbiAgICAgICAgICAgIG1ha2VSZXRyaWV2ZVN1YnNjcmlwdGlvbnNTdGFuemEoc2VydmljZS5qaWQpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IHJlc3VsdFxyXG4gICAgICAgICAgICAuZ2V0Q2hpbGQoJ3N1YnNjcmlwdGlvbnMnLCBNVUNfU1VCX0ZFQVRVUkVfSUQpXHJcbiAgICAgICAgICAgID8uZ2V0Q2hpbGRyZW4oJ3N1YnNjcmlwdGlvbicpXHJcbiAgICAgICAgICAgID8ubWFwKHN1YnNjcmlwdGlvbkVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3Vic2NyaWJlZEV2ZW50czogc3RyaW5nW10gPSBzdWJzY3JpcHRpb25FbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgLmdldENoaWxkcmVuKCdldmVudCcpXHJcbiAgICAgICAgICAgICAgICAgICAgPy5tYXAoZXZlbnRFbGVtZW50ID0+IGV2ZW50RWxlbWVudC5hdHRycy5ub2RlKSA/PyBbXTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbc3Vic2NyaXB0aW9uRWxlbWVudC5hdHRycy5qaWQgYXMgc3RyaW5nLCBzdWJzY3JpYmVkRXZlbnRzXSBhcyBjb25zdDtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgTWFwKHN1YnNjcmlwdGlvbnMpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBtYWtlU3Vic2NyaWJlUm9vbVN0YW56YShyb29tSmlkOiBzdHJpbmcsIG5pY2s6IHN0cmluZywgbm9kZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogU3RhbnphIHtcclxuICAgIHJldHVybiB4bWwoJ2lxJywge3R5cGU6ICdzZXQnLCB0bzogcm9vbUppZH0sXHJcbiAgICAgICAgeG1sKCdzdWJzY3JpYmUnLCB7eG1sbnM6IE1VQ19TVUJfRkVBVFVSRV9JRCwgbmlja30sXHJcbiAgICAgICAgICAgIG5vZGVzLm1hcChub2RlID0+IHhtbCgnZXZlbnQnLCB7bm9kZX0pKVxyXG4gICAgICAgIClcclxuICAgICk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1ha2VVbnN1YnNjcmliZVJvb21TdGFuemEocm9vbUppZDogc3RyaW5nKTogU3RhbnphIHtcclxuICAgIHJldHVybiB4bWwoJ2lxJywge3R5cGU6ICdzZXQnLCB0bzogcm9vbUppZH0sXHJcbiAgICAgICAgeG1sKCd1bnN1YnNjcmliZScsIHt4bWxuczogTVVDX1NVQl9GRUFUVVJFX0lEfSlcclxuICAgICk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1ha2VSZXRyaWV2ZVN1YnNjcmlwdGlvbnNTdGFuemEoY29uZmVyZW5jZVNlcnZpY2VKaWQ6IHN0cmluZyk6IFN0YW56YSB7XHJcbiAgICByZXR1cm4geG1sKCdpcScsIHt0eXBlOiAnZ2V0JywgdG86IGNvbmZlcmVuY2VTZXJ2aWNlSmlkfSxcclxuICAgICAgICB4bWwoJ3N1YnNjcmlwdGlvbnMnLCB7eG1sbnM6IE1VQ19TVUJfRkVBVFVSRV9JRH0pXHJcbiAgICApO1xyXG59XHJcbiJdfQ==