UNPKG

@hsaadawy/ngx-chat

Version:
110 lines 19.3 kB
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==