UNPKG

matrix-react-sdk

Version:
147 lines (140 loc) 22.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.IntegrationManagers = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _logger = require("matrix-js-sdk/src/logger"); var _matrix = require("matrix-js-sdk/src/matrix"); var _SdkConfig = _interopRequireDefault(require("../SdkConfig")); var _Modal = _interopRequireDefault(require("../Modal")); var _IntegrationManagerInstance = require("./IntegrationManagerInstance"); var _IntegrationsImpossibleDialog = _interopRequireDefault(require("../components/views/dialogs/IntegrationsImpossibleDialog")); var _IntegrationsDisabledDialog = _interopRequireDefault(require("../components/views/dialogs/IntegrationsDisabledDialog")); var _WidgetUtils = _interopRequireDefault(require("../utils/WidgetUtils")); var _MatrixClientPeg = require("../MatrixClientPeg"); /* Copyright 2024 New Vector Ltd. Copyright 2019 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. */ const KIND_PREFERENCE = [ // Ordered: first is most preferred, last is least preferred. _IntegrationManagerInstance.Kind.Account, _IntegrationManagerInstance.Kind.Homeserver, _IntegrationManagerInstance.Kind.Config]; class IntegrationManagers { static sharedInstance() { if (!IntegrationManagers.instance) { IntegrationManagers.instance = new IntegrationManagers(); } return IntegrationManagers.instance; } constructor() { (0, _defineProperty2.default)(this, "managers", []); (0, _defineProperty2.default)(this, "client", void 0); (0, _defineProperty2.default)(this, "primaryManager", null); (0, _defineProperty2.default)(this, "setupHomeserverManagers", async discoveryResponse => { _logger.logger.log("Updating homeserver-configured integration managers..."); if (discoveryResponse && discoveryResponse["m.integrations"]) { let managers = discoveryResponse["m.integrations"]["managers"]; if (!Array.isArray(managers)) managers = []; // make it an array so we can wipe the HS managers _logger.logger.log(`Homeserver has ${managers.length} integration managers`); // Clear out any known managers for the homeserver // TODO: Log out of the scalar clients this.managers = this.managers.filter(m => m.kind !== _IntegrationManagerInstance.Kind.Homeserver); // Now add all the managers the homeserver wants us to have for (const hsManager of managers) { if (!hsManager["api_url"]) continue; this.managers.push(new _IntegrationManagerInstance.IntegrationManagerInstance(_IntegrationManagerInstance.Kind.Homeserver, hsManager["api_url"], hsManager["ui_url"]) // optional ); } this.primaryManager = null; // reset primary } else { _logger.logger.log("Homeserver has no integration managers"); } }); (0, _defineProperty2.default)(this, "onAccountData", ev => { if (ev.getType() === "m.widgets") { this.compileManagers(); } }); this.compileManagers(); } startWatching() { this.stopWatching(); this.client = _MatrixClientPeg.MatrixClientPeg.safeGet(); this.client.on(_matrix.ClientEvent.AccountData, this.onAccountData); this.client.on(_matrix.ClientEvent.ClientWellKnown, this.setupHomeserverManagers); this.compileManagers(); } stopWatching() { if (!this.client) return; this.client.removeListener(_matrix.ClientEvent.AccountData, this.onAccountData); this.client.removeListener(_matrix.ClientEvent.ClientWellKnown, this.setupHomeserverManagers); } compileManagers() { this.managers = []; this.setupConfiguredManager(); this.setupAccountManagers(); } setupConfiguredManager() { const apiUrl = _SdkConfig.default.get("integrations_rest_url"); const uiUrl = _SdkConfig.default.get("integrations_ui_url"); if (apiUrl && uiUrl) { this.managers.push(new _IntegrationManagerInstance.IntegrationManagerInstance(_IntegrationManagerInstance.Kind.Config, apiUrl, uiUrl)); this.primaryManager = null; // reset primary } } setupAccountManagers() { if (!this.client || !this.client.getUserId()) return; // not logged in const widgets = _WidgetUtils.default.getIntegrationManagerWidgets(this.client); widgets.forEach(w => { const data = w.content["data"]; if (!data) return; const uiUrl = w.content["url"]; const apiUrl = data["api_url"]; if (!apiUrl || !uiUrl) return; const manager = new _IntegrationManagerInstance.IntegrationManagerInstance(_IntegrationManagerInstance.Kind.Account, apiUrl, uiUrl, w["id"] || w["state_key"] || ""); this.managers.push(manager); }); this.primaryManager = null; // reset primary } hasManager() { return this.managers.length > 0; } getOrderedManagers() { const collator = new Intl.Collator(); const ordered = []; for (const kind of KIND_PREFERENCE) { const managers = this.managers.filter(m => m.kind === kind); if (!managers || !managers.length) continue; if (kind === _IntegrationManagerInstance.Kind.Account) { // Order by state_keys (IDs) managers.sort((a, b) => collator.compare(a.id ?? "", b.id ?? "")); } ordered.push(...managers); } return ordered; } getPrimaryManager() { if (this.hasManager()) { if (this.primaryManager) return this.primaryManager; this.primaryManager = this.getOrderedManagers()[0]; return this.primaryManager; } else { return null; } } openNoManagerDialog() { _Modal.default.createDialog(_IntegrationsImpossibleDialog.default); } showDisabledDialog() { _Modal.default.createDialog(_IntegrationsDisabledDialog.default); } } // For debugging exports.IntegrationManagers = IntegrationManagers; (0, _defineProperty2.default)(IntegrationManagers, "instance", void 0); window.mxIntegrationManagers = IntegrationManagers; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwicmVxdWlyZSIsIl9tYXRyaXgiLCJfU2RrQ29uZmlnIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9Nb2RhbCIsIl9JbnRlZ3JhdGlvbk1hbmFnZXJJbnN0YW5jZSIsIl9JbnRlZ3JhdGlvbnNJbXBvc3NpYmxlRGlhbG9nIiwiX0ludGVncmF0aW9uc0Rpc2FibGVkRGlhbG9nIiwiX1dpZGdldFV0aWxzIiwiX01hdHJpeENsaWVudFBlZyIsIktJTkRfUFJFRkVSRU5DRSIsIktpbmQiLCJBY2NvdW50IiwiSG9tZXNlcnZlciIsIkNvbmZpZyIsIkludGVncmF0aW9uTWFuYWdlcnMiLCJzaGFyZWRJbnN0YW5jZSIsImluc3RhbmNlIiwiY29uc3RydWN0b3IiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsImRpc2NvdmVyeVJlc3BvbnNlIiwibG9nZ2VyIiwibG9nIiwibWFuYWdlcnMiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJmaWx0ZXIiLCJtIiwia2luZCIsImhzTWFuYWdlciIsInB1c2giLCJJbnRlZ3JhdGlvbk1hbmFnZXJJbnN0YW5jZSIsInByaW1hcnlNYW5hZ2VyIiwiZXYiLCJnZXRUeXBlIiwiY29tcGlsZU1hbmFnZXJzIiwic3RhcnRXYXRjaGluZyIsInN0b3BXYXRjaGluZyIsImNsaWVudCIsIk1hdHJpeENsaWVudFBlZyIsInNhZmVHZXQiLCJvbiIsIkNsaWVudEV2ZW50IiwiQWNjb3VudERhdGEiLCJvbkFjY291bnREYXRhIiwiQ2xpZW50V2VsbEtub3duIiwic2V0dXBIb21lc2VydmVyTWFuYWdlcnMiLCJyZW1vdmVMaXN0ZW5lciIsInNldHVwQ29uZmlndXJlZE1hbmFnZXIiLCJzZXR1cEFjY291bnRNYW5hZ2VycyIsImFwaVVybCIsIlNka0NvbmZpZyIsImdldCIsInVpVXJsIiwiZ2V0VXNlcklkIiwid2lkZ2V0cyIsIldpZGdldFV0aWxzIiwiZ2V0SW50ZWdyYXRpb25NYW5hZ2VyV2lkZ2V0cyIsImZvckVhY2giLCJ3IiwiZGF0YSIsImNvbnRlbnQiLCJtYW5hZ2VyIiwiaGFzTWFuYWdlciIsImdldE9yZGVyZWRNYW5hZ2VycyIsImNvbGxhdG9yIiwiSW50bCIsIkNvbGxhdG9yIiwib3JkZXJlZCIsInNvcnQiLCJhIiwiYiIsImNvbXBhcmUiLCJpZCIsImdldFByaW1hcnlNYW5hZ2VyIiwib3Blbk5vTWFuYWdlckRpYWxvZyIsIk1vZGFsIiwiY3JlYXRlRGlhbG9nIiwiSW50ZWdyYXRpb25zSW1wb3NzaWJsZURpYWxvZyIsInNob3dEaXNhYmxlZERpYWxvZyIsIkludGVncmF0aW9uc0Rpc2FibGVkRGlhbG9nIiwiZXhwb3J0cyIsIndpbmRvdyIsIm14SW50ZWdyYXRpb25NYW5hZ2VycyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbnRlZ3JhdGlvbnMvSW50ZWdyYXRpb25NYW5hZ2Vycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxOSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBDbGllbnRFdmVudCwgSUNsaWVudFdlbGxLbm93biwgTWF0cml4Q2xpZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuXG5pbXBvcnQgdHlwZSB7IE1hdHJpeEV2ZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IFNka0NvbmZpZyBmcm9tIFwiLi4vU2RrQ29uZmlnXCI7XG5pbXBvcnQgTW9kYWwgZnJvbSBcIi4uL01vZGFsXCI7XG5pbXBvcnQgeyBJbnRlZ3JhdGlvbk1hbmFnZXJJbnN0YW5jZSwgS2luZCB9IGZyb20gXCIuL0ludGVncmF0aW9uTWFuYWdlckluc3RhbmNlXCI7XG5pbXBvcnQgSW50ZWdyYXRpb25zSW1wb3NzaWJsZURpYWxvZyBmcm9tIFwiLi4vY29tcG9uZW50cy92aWV3cy9kaWFsb2dzL0ludGVncmF0aW9uc0ltcG9zc2libGVEaWFsb2dcIjtcbmltcG9ydCBJbnRlZ3JhdGlvbnNEaXNhYmxlZERpYWxvZyBmcm9tIFwiLi4vY29tcG9uZW50cy92aWV3cy9kaWFsb2dzL0ludGVncmF0aW9uc0Rpc2FibGVkRGlhbG9nXCI7XG5pbXBvcnQgV2lkZ2V0VXRpbHMgZnJvbSBcIi4uL3V0aWxzL1dpZGdldFV0aWxzXCI7XG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tIFwiLi4vTWF0cml4Q2xpZW50UGVnXCI7XG5cbmNvbnN0IEtJTkRfUFJFRkVSRU5DRSA9IFtcbiAgICAvLyBPcmRlcmVkOiBmaXJzdCBpcyBtb3N0IHByZWZlcnJlZCwgbGFzdCBpcyBsZWFzdCBwcmVmZXJyZWQuXG4gICAgS2luZC5BY2NvdW50LFxuICAgIEtpbmQuSG9tZXNlcnZlcixcbiAgICBLaW5kLkNvbmZpZyxcbl07XG5cbmV4cG9ydCBjbGFzcyBJbnRlZ3JhdGlvbk1hbmFnZXJzIHtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZT86IEludGVncmF0aW9uTWFuYWdlcnM7XG5cbiAgICBwcml2YXRlIG1hbmFnZXJzOiBJbnRlZ3JhdGlvbk1hbmFnZXJJbnN0YW5jZVtdID0gW107XG4gICAgcHJpdmF0ZSBjbGllbnQ/OiBNYXRyaXhDbGllbnQ7XG4gICAgcHJpdmF0ZSBwcmltYXJ5TWFuYWdlcjogSW50ZWdyYXRpb25NYW5hZ2VySW5zdGFuY2UgfCBudWxsID0gbnVsbDtcblxuICAgIHB1YmxpYyBzdGF0aWMgc2hhcmVkSW5zdGFuY2UoKTogSW50ZWdyYXRpb25NYW5hZ2VycyB7XG4gICAgICAgIGlmICghSW50ZWdyYXRpb25NYW5hZ2Vycy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgSW50ZWdyYXRpb25NYW5hZ2Vycy5pbnN0YW5jZSA9IG5ldyBJbnRlZ3JhdGlvbk1hbmFnZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEludGVncmF0aW9uTWFuYWdlcnMuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNvbXBpbGVNYW5hZ2VycygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGFydFdhdGNoaW5nKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN0b3BXYXRjaGluZygpO1xuICAgICAgICB0aGlzLmNsaWVudCA9IE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCk7XG4gICAgICAgIHRoaXMuY2xpZW50Lm9uKENsaWVudEV2ZW50LkFjY291bnREYXRhLCB0aGlzLm9uQWNjb3VudERhdGEpO1xuICAgICAgICB0aGlzLmNsaWVudC5vbihDbGllbnRFdmVudC5DbGllbnRXZWxsS25vd24sIHRoaXMuc2V0dXBIb21lc2VydmVyTWFuYWdlcnMpO1xuICAgICAgICB0aGlzLmNvbXBpbGVNYW5hZ2VycygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdG9wV2F0Y2hpbmcoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jbGllbnQpIHJldHVybjtcbiAgICAgICAgdGhpcy5jbGllbnQucmVtb3ZlTGlzdGVuZXIoQ2xpZW50RXZlbnQuQWNjb3VudERhdGEsIHRoaXMub25BY2NvdW50RGF0YSk7XG4gICAgICAgIHRoaXMuY2xpZW50LnJlbW92ZUxpc3RlbmVyKENsaWVudEV2ZW50LkNsaWVudFdlbGxLbm93biwgdGhpcy5zZXR1cEhvbWVzZXJ2ZXJNYW5hZ2Vycyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21waWxlTWFuYWdlcnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFuYWdlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5zZXR1cENvbmZpZ3VyZWRNYW5hZ2VyKCk7XG4gICAgICAgIHRoaXMuc2V0dXBBY2NvdW50TWFuYWdlcnMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwQ29uZmlndXJlZE1hbmFnZXIoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFwaVVybCA9IFNka0NvbmZpZy5nZXQoXCJpbnRlZ3JhdGlvbnNfcmVzdF91cmxcIik7XG4gICAgICAgIGNvbnN0IHVpVXJsID0gU2RrQ29uZmlnLmdldChcImludGVncmF0aW9uc191aV91cmxcIik7XG5cbiAgICAgICAgaWYgKGFwaVVybCAmJiB1aVVybCkge1xuICAgICAgICAgICAgdGhpcy5tYW5hZ2Vycy5wdXNoKG5ldyBJbnRlZ3JhdGlvbk1hbmFnZXJJbnN0YW5jZShLaW5kLkNvbmZpZywgYXBpVXJsLCB1aVVybCkpO1xuICAgICAgICAgICAgdGhpcy5wcmltYXJ5TWFuYWdlciA9IG51bGw7IC8vIHJlc2V0IHByaW1hcnlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBIb21lc2VydmVyTWFuYWdlcnMgPSBhc3luYyAoZGlzY292ZXJ5UmVzcG9uc2U6IElDbGllbnRXZWxsS25vd24pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgbG9nZ2VyLmxvZyhcIlVwZGF0aW5nIGhvbWVzZXJ2ZXItY29uZmlndXJlZCBpbnRlZ3JhdGlvbiBtYW5hZ2Vycy4uLlwiKTtcbiAgICAgICAgaWYgKGRpc2NvdmVyeVJlc3BvbnNlICYmIGRpc2NvdmVyeVJlc3BvbnNlW1wibS5pbnRlZ3JhdGlvbnNcIl0pIHtcbiAgICAgICAgICAgIGxldCBtYW5hZ2VycyA9IGRpc2NvdmVyeVJlc3BvbnNlW1wibS5pbnRlZ3JhdGlvbnNcIl1bXCJtYW5hZ2Vyc1wiXTtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShtYW5hZ2VycykpIG1hbmFnZXJzID0gW107IC8vIG1ha2UgaXQgYW4gYXJyYXkgc28gd2UgY2FuIHdpcGUgdGhlIEhTIG1hbmFnZXJzXG5cbiAgICAgICAgICAgIGxvZ2dlci5sb2coYEhvbWVzZXJ2ZXIgaGFzICR7bWFuYWdlcnMubGVuZ3RofSBpbnRlZ3JhdGlvbiBtYW5hZ2Vyc2ApO1xuXG4gICAgICAgICAgICAvLyBDbGVhciBvdXQgYW55IGtub3duIG1hbmFnZXJzIGZvciB0aGUgaG9tZXNlcnZlclxuICAgICAgICAgICAgLy8gVE9ETzogTG9nIG91dCBvZiB0aGUgc2NhbGFyIGNsaWVudHNcbiAgICAgICAgICAgIHRoaXMubWFuYWdlcnMgPSB0aGlzLm1hbmFnZXJzLmZpbHRlcigobSkgPT4gbS5raW5kICE9PSBLaW5kLkhvbWVzZXJ2ZXIpO1xuXG4gICAgICAgICAgICAvLyBOb3cgYWRkIGFsbCB0aGUgbWFuYWdlcnMgdGhlIGhvbWVzZXJ2ZXIgd2FudHMgdXMgdG8gaGF2ZVxuICAgICAgICAgICAgZm9yIChjb25zdCBoc01hbmFnZXIgb2YgbWFuYWdlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhzTWFuYWdlcltcImFwaV91cmxcIl0pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlcnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgbmV3IEludGVncmF0aW9uTWFuYWdlckluc3RhbmNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgS2luZC5Ib21lc2VydmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgaHNNYW5hZ2VyW1wiYXBpX3VybFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhzTWFuYWdlcltcInVpX3VybFwiXSwgLy8gb3B0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnByaW1hcnlNYW5hZ2VyID0gbnVsbDsgLy8gcmVzZXQgcHJpbWFyeVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLmxvZyhcIkhvbWVzZXJ2ZXIgaGFzIG5vIGludGVncmF0aW9uIG1hbmFnZXJzXCIpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgc2V0dXBBY2NvdW50TWFuYWdlcnMoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jbGllbnQgfHwgIXRoaXMuY2xpZW50LmdldFVzZXJJZCgpKSByZXR1cm47IC8vIG5vdCBsb2dnZWQgaW5cbiAgICAgICAgY29uc3Qgd2lkZ2V0cyA9IFdpZGdldFV0aWxzLmdldEludGVncmF0aW9uTWFuYWdlcldpZGdldHModGhpcy5jbGllbnQpO1xuICAgICAgICB3aWRnZXRzLmZvckVhY2goKHcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB3LmNvbnRlbnRbXCJkYXRhXCJdO1xuICAgICAgICAgICAgaWYgKCFkYXRhKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IHVpVXJsID0gdy5jb250ZW50W1widXJsXCJdO1xuICAgICAgICAgICAgY29uc3QgYXBpVXJsID0gZGF0YVtcImFwaV91cmxcIl0gYXMgc3RyaW5nO1xuICAgICAgICAgICAgaWYgKCFhcGlVcmwgfHwgIXVpVXJsKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgSW50ZWdyYXRpb25NYW5hZ2VySW5zdGFuY2UoXG4gICAgICAgICAgICAgICAgS2luZC5BY2NvdW50LFxuICAgICAgICAgICAgICAgIGFwaVVybCxcbiAgICAgICAgICAgICAgICB1aVVybCxcbiAgICAgICAgICAgICAgICB3W1wiaWRcIl0gfHwgd1tcInN0YXRlX2tleVwiXSB8fCBcIlwiLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlcnMucHVzaChtYW5hZ2VyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucHJpbWFyeU1hbmFnZXIgPSBudWxsOyAvLyByZXNldCBwcmltYXJ5XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkFjY291bnREYXRhID0gKGV2OiBNYXRyaXhFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoZXYuZ2V0VHlwZSgpID09PSBcIm0ud2lkZ2V0c1wiKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVNYW5hZ2VycygpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHB1YmxpYyBoYXNNYW5hZ2VyKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2Vycy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRPcmRlcmVkTWFuYWdlcnMoKTogSW50ZWdyYXRpb25NYW5hZ2VySW5zdGFuY2VbXSB7XG4gICAgICAgIGNvbnN0IGNvbGxhdG9yID0gbmV3IEludGwuQ29sbGF0b3IoKTtcbiAgICAgICAgY29uc3Qgb3JkZXJlZDogSW50ZWdyYXRpb25NYW5hZ2VySW5zdGFuY2VbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtpbmQgb2YgS0lORF9QUkVGRVJFTkNFKSB7XG4gICAgICAgICAgICBjb25zdCBtYW5hZ2VycyA9IHRoaXMubWFuYWdlcnMuZmlsdGVyKChtKSA9PiBtLmtpbmQgPT09IGtpbmQpO1xuICAgICAgICAgICAgaWYgKCFtYW5hZ2VycyB8fCAhbWFuYWdlcnMubGVuZ3RoKSBjb250aW51ZTtcblxuICAgICAgICAgICAgaWYgKGtpbmQgPT09IEtpbmQuQWNjb3VudCkge1xuICAgICAgICAgICAgICAgIC8vIE9yZGVyIGJ5IHN0YXRlX2tleXMgKElEcylcbiAgICAgICAgICAgICAgICBtYW5hZ2Vycy5zb3J0KChhLCBiKSA9PiBjb2xsYXRvci5jb21wYXJlKGEuaWQgPz8gXCJcIiwgYi5pZCA/PyBcIlwiKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9yZGVyZWQucHVzaCguLi5tYW5hZ2Vycyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9yZGVyZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFByaW1hcnlNYW5hZ2VyKCk6IEludGVncmF0aW9uTWFuYWdlckluc3RhbmNlIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLmhhc01hbmFnZXIoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJpbWFyeU1hbmFnZXIpIHJldHVybiB0aGlzLnByaW1hcnlNYW5hZ2VyO1xuXG4gICAgICAgICAgICB0aGlzLnByaW1hcnlNYW5hZ2VyID0gdGhpcy5nZXRPcmRlcmVkTWFuYWdlcnMoKVswXTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByaW1hcnlNYW5hZ2VyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb3Blbk5vTWFuYWdlckRpYWxvZygpOiB2b2lkIHtcbiAgICAgICAgTW9kYWwuY3JlYXRlRGlhbG9nKEludGVncmF0aW9uc0ltcG9zc2libGVEaWFsb2cpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaG93RGlzYWJsZWREaWFsb2coKTogdm9pZCB7XG4gICAgICAgIE1vZGFsLmNyZWF0ZURpYWxvZyhJbnRlZ3JhdGlvbnNEaXNhYmxlZERpYWxvZyk7XG4gICAgfVxufVxuXG4vLyBGb3IgZGVidWdnaW5nXG53aW5kb3cubXhJbnRlZ3JhdGlvbk1hbmFnZXJzID0gSW50ZWdyYXRpb25NYW5hZ2VycztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFRQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFHQSxJQUFBRSxVQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxNQUFBLEdBQUFELHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSywyQkFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sNkJBQUEsR0FBQUgsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFPLDJCQUFBLEdBQUFKLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBUSxZQUFBLEdBQUFMLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBUyxnQkFBQSxHQUFBVCxPQUFBO0FBbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQWNBLE1BQU1VLGVBQWUsR0FBRztBQUNwQjtBQUNBQyxnQ0FBSSxDQUFDQyxPQUFPLEVBQ1pELGdDQUFJLENBQUNFLFVBQVUsRUFDZkYsZ0NBQUksQ0FBQ0csTUFBTSxDQUNkO0FBRU0sTUFBTUMsbUJBQW1CLENBQUM7RUFPN0IsT0FBY0MsY0FBY0EsQ0FBQSxFQUF3QjtJQUNoRCxJQUFJLENBQUNELG1CQUFtQixDQUFDRSxRQUFRLEVBQUU7TUFDL0JGLG1CQUFtQixDQUFDRSxRQUFRLEdBQUcsSUFBSUYsbUJBQW1CLENBQUMsQ0FBQztJQUM1RDtJQUNBLE9BQU9BLG1CQUFtQixDQUFDRSxRQUFRO0VBQ3ZDO0VBRU9DLFdBQVdBLENBQUEsRUFBRztJQUFBLElBQUFDLGdCQUFBLENBQUFDLE9BQUEsb0JBWDRCLEVBQUU7SUFBQSxJQUFBRCxnQkFBQSxDQUFBQyxPQUFBO0lBQUEsSUFBQUQsZ0JBQUEsQ0FBQUMsT0FBQSwwQkFFUyxJQUFJO0lBQUEsSUFBQUQsZ0JBQUEsQ0FBQUMsT0FBQSxtQ0EyQzlCLE1BQU9DLGlCQUFtQyxJQUFvQjtNQUM1RkMsY0FBTSxDQUFDQyxHQUFHLENBQUMsd0RBQXdELENBQUM7TUFDcEUsSUFBSUYsaUJBQWlCLElBQUlBLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLEVBQUU7UUFDMUQsSUFBSUcsUUFBUSxHQUFHSCxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUM5RCxJQUFJLENBQUNJLEtBQUssQ0FBQ0MsT0FBTyxDQUFDRixRQUFRLENBQUMsRUFBRUEsUUFBUSxHQUFHLEVBQUUsQ0FBQyxDQUFDOztRQUU3Q0YsY0FBTSxDQUFDQyxHQUFHLENBQUMsa0JBQWtCQyxRQUFRLENBQUNHLE1BQU0sdUJBQXVCLENBQUM7O1FBRXBFO1FBQ0E7UUFDQSxJQUFJLENBQUNILFFBQVEsR0FBRyxJQUFJLENBQUNBLFFBQVEsQ0FBQ0ksTUFBTSxDQUFFQyxDQUFDLElBQUtBLENBQUMsQ0FBQ0MsSUFBSSxLQUFLbkIsZ0NBQUksQ0FBQ0UsVUFBVSxDQUFDOztRQUV2RTtRQUNBLEtBQUssTUFBTWtCLFNBQVMsSUFBSVAsUUFBUSxFQUFFO1VBQzlCLElBQUksQ0FBQ08sU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1VBQzNCLElBQUksQ0FBQ1AsUUFBUSxDQUFDUSxJQUFJLENBQ2QsSUFBSUMsc0RBQTBCLENBQzFCdEIsZ0NBQUksQ0FBQ0UsVUFBVSxFQUNma0IsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUNwQkEsU0FBUyxDQUFDLFFBQVEsQ0FDdEIsQ0FBQyxDQUR3QjtVQUU3QixDQUFDO1FBQ0w7UUFFQSxJQUFJLENBQUNHLGNBQWMsR0FBRyxJQUFJLENBQUMsQ0FBQztNQUNoQyxDQUFDLE1BQU07UUFDSFosY0FBTSxDQUFDQyxHQUFHLENBQUMsd0NBQXdDLENBQUM7TUFDeEQ7SUFDSixDQUFDO0lBQUEsSUFBQUosZ0JBQUEsQ0FBQUMsT0FBQSx5QkF3QndCZSxFQUFlLElBQVc7TUFDL0MsSUFBSUEsRUFBRSxDQUFDQyxPQUFPLENBQUMsQ0FBQyxLQUFLLFdBQVcsRUFBRTtRQUM5QixJQUFJLENBQUNDLGVBQWUsQ0FBQyxDQUFDO01BQzFCO0lBQ0osQ0FBQztJQXpGRyxJQUFJLENBQUNBLGVBQWUsQ0FBQyxDQUFDO0VBQzFCO0VBRU9DLGFBQWFBLENBQUEsRUFBUztJQUN6QixJQUFJLENBQUNDLFlBQVksQ0FBQyxDQUFDO0lBQ25CLElBQUksQ0FBQ0MsTUFBTSxHQUFHQyxnQ0FBZSxDQUFDQyxPQUFPLENBQUMsQ0FBQztJQUN2QyxJQUFJLENBQUNGLE1BQU0sQ0FBQ0csRUFBRSxDQUFDQyxtQkFBVyxDQUFDQyxXQUFXLEVBQUUsSUFBSSxDQUFDQyxhQUFhLENBQUM7SUFDM0QsSUFBSSxDQUFDTixNQUFNLENBQUNHLEVBQUUsQ0FBQ0MsbUJBQVcsQ0FBQ0csZUFBZSxFQUFFLElBQUksQ0FBQ0MsdUJBQXVCLENBQUM7SUFDekUsSUFBSSxDQUFDWCxlQUFlLENBQUMsQ0FBQztFQUMxQjtFQUVPRSxZQUFZQSxDQUFBLEVBQVM7SUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQ0MsTUFBTSxFQUFFO0lBQ2xCLElBQUksQ0FBQ0EsTUFBTSxDQUFDUyxjQUFjLENBQUNMLG1CQUFXLENBQUNDLFdBQVcsRUFBRSxJQUFJLENBQUNDLGFBQWEsQ0FBQztJQUN2RSxJQUFJLENBQUNOLE1BQU0sQ0FBQ1MsY0FBYyxDQUFDTCxtQkFBVyxDQUFDRyxlQUFlLEVBQUUsSUFBSSxDQUFDQyx1QkFBdUIsQ0FBQztFQUN6RjtFQUVRWCxlQUFlQSxDQUFBLEVBQVM7SUFDNUIsSUFBSSxDQUFDYixRQUFRLEdBQUcsRUFBRTtJQUNsQixJQUFJLENBQUMwQixzQkFBc0IsQ0FBQyxDQUFDO0lBQzdCLElBQUksQ0FBQ0Msb0JBQW9CLENBQUMsQ0FBQztFQUMvQjtFQUVRRCxzQkFBc0JBLENBQUEsRUFBUztJQUNuQyxNQUFNRSxNQUFNLEdBQUdDLGtCQUFTLENBQUNDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQztJQUNyRCxNQUFNQyxLQUFLLEdBQUdGLGtCQUFTLENBQUNDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQztJQUVsRCxJQUFJRixNQUFNLElBQUlHLEtBQUssRUFBRTtNQUNqQixJQUFJLENBQUMvQixRQUFRLENBQUNRLElBQUksQ0FBQyxJQUFJQyxzREFBMEIsQ0FBQ3RCLGdDQUFJLENBQUNHLE1BQU0sRUFBRXNDLE1BQU0sRUFBRUcsS0FBSyxDQUFDLENBQUM7TUFDOUUsSUFBSSxDQUFDckIsY0FBYyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2hDO0VBQ0o7RUFnQ1FpQixvQkFBb0JBLENBQUEsRUFBUztJQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDWCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUNBLE1BQU0sQ0FBQ2dCLFNBQVMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDO0lBQ3RELE1BQU1DLE9BQU8sR0FBR0Msb0JBQVcsQ0FBQ0MsNEJBQTRCLENBQUMsSUFBSSxDQUFDbkIsTUFBTSxDQUFDO0lBQ3JFaUIsT0FBTyxDQUFDRyxPQUFPLENBQUVDLENBQUMsSUFBSztNQUNuQixNQUFNQyxJQUFJLEdBQUdELENBQUMsQ0FBQ0UsT0FBTyxDQUFDLE1BQU0sQ0FBQztNQUM5QixJQUFJLENBQUNELElBQUksRUFBRTtNQUVYLE1BQU1QLEtBQUssR0FBR00sQ0FBQyxDQUFDRSxPQUFPLENBQUMsS0FBSyxDQUFDO01BQzlCLE1BQU1YLE1BQU0sR0FBR1UsSUFBSSxDQUFDLFNBQVMsQ0FBVztNQUN4QyxJQUFJLENBQUNWLE1BQU0sSUFBSSxDQUFDRyxLQUFLLEVBQUU7TUFFdkIsTUFBTVMsT0FBTyxHQUFHLElBQUkvQixzREFBMEIsQ0FDMUN0QixnQ0FBSSxDQUFDQyxPQUFPLEVBQ1p3QyxNQUFNLEVBQ05HLEtBQUssRUFDTE0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJQSxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksRUFDakMsQ0FBQztNQUNELElBQUksQ0FBQ3JDLFFBQVEsQ0FBQ1EsSUFBSSxDQUFDZ0MsT0FBTyxDQUFDO0lBQy9CLENBQUMsQ0FBQztJQUNGLElBQUksQ0FBQzlCLGNBQWMsR0FBRyxJQUFJLENBQUMsQ0FBQztFQUNoQztFQVFPK0IsVUFBVUEsQ0FBQSxFQUFZO0lBQ3pCLE9BQU8sSUFBSSxDQUFDekMsUUFBUSxDQUFDRyxNQUFNLEdBQUcsQ0FBQztFQUNuQztFQUVPdUMsa0JBQWtCQSxDQUFBLEVBQWlDO0lBQ3RELE1BQU1DLFFBQVEsR0FBRyxJQUFJQyxJQUFJLENBQUNDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLE1BQU1DLE9BQXFDLEdBQUcsRUFBRTtJQUNoRCxLQUFLLE1BQU14QyxJQUFJLElBQUlwQixlQUFlLEVBQUU7TUFDaEMsTUFBTWMsUUFBUSxHQUFHLElBQUksQ0FBQ0EsUUFBUSxDQUFDSSxNQUFNLENBQUVDLENBQUMsSUFBS0EsQ0FBQyxDQUFDQyxJQUFJLEtBQUtBLElBQUksQ0FBQztNQUM3RCxJQUFJLENBQUNOLFFBQVEsSUFBSSxDQUFDQSxRQUFRLENBQUNHLE1BQU0sRUFBRTtNQUVuQyxJQUFJRyxJQUFJLEtBQUtuQixnQ0FBSSxDQUFDQyxPQUFPLEVBQUU7UUFDdkI7UUFDQVksUUFBUSxDQUFDK0MsSUFBSSxDQUFDLENBQUNDLENBQUMsRUFBRUMsQ0FBQyxLQUFLTixRQUFRLENBQUNPLE9BQU8sQ0FBQ0YsQ0FBQyxDQUFDRyxFQUFFLElBQUksRUFBRSxFQUFFRixDQUFDLENBQUNFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztNQUNyRTtNQUVBTCxPQUFPLENBQUN0QyxJQUFJLENBQUMsR0FBR1IsUUFBUSxDQUFDO0lBQzdCO0lBQ0EsT0FBTzhDLE9BQU87RUFDbEI7RUFFT00saUJBQWlCQSxDQUFBLEVBQXNDO0lBQzFELElBQUksSUFBSSxDQUFDWCxVQUFVLENBQUMsQ0FBQyxFQUFFO01BQ25CLElBQUksSUFBSSxDQUFDL0IsY0FBYyxFQUFFLE9BQU8sSUFBSSxDQUFDQSxjQUFjO01BRW5ELElBQUksQ0FBQ0EsY0FBYyxHQUFHLElBQUksQ0FBQ2dDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDbEQsT0FBTyxJQUFJLENBQUNoQyxjQUFjO0lBQzlCLENBQUMsTUFBTTtNQUNILE9BQU8sSUFBSTtJQUNmO0VBQ0o7RUFFTzJDLG1CQUFtQkEsQ0FBQSxFQUFTO0lBQy9CQyxjQUFLLENBQUNDLFlBQVksQ0FBQ0MscUNBQTRCLENBQUM7RUFDcEQ7RUFFT0Msa0JBQWtCQSxDQUFBLEVBQVM7SUFDOUJILGNBQUssQ0FBQ0MsWUFBWSxDQUFDRyxtQ0FBMEIsQ0FBQztFQUNsRDtBQUNKOztBQUVBO0FBQUFDLE9BQUEsQ0FBQXBFLG1CQUFBLEdBQUFBLG1CQUFBO0FBQUEsSUFBQUksZ0JBQUEsQ0FBQUMsT0FBQSxFQW5KYUwsbUJBQW1CO0FBb0poQ3FFLE1BQU0sQ0FBQ0MscUJBQXFCLEdBQUd0RSxtQkFBbUIiLCJpZ25vcmVMaXN0IjpbXX0=