UNPKG

matrix-react-sdk

Version:
168 lines (154 loc) 19.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.ModuleRunner = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _utils = require("matrix-js-sdk/src/utils"); var _CryptoSetupExtensions = require("@matrix-org/react-sdk-module-api/lib/lifecycles/CryptoSetupExtensions"); var _ExperimentalExtensions = require("@matrix-org/react-sdk-module-api/lib/lifecycles/ExperimentalExtensions"); var _AppModule = require("./AppModule"); require("./ModuleComponents"); var _ModuleRunner; /* 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. */ /** * Handles and manages extensions provided by modules. */ class ExtensionsManager { /** * Create a new instance. */ constructor() { // Private backing fields for extensions (0, _defineProperty2.default)(this, "cryptoSetupExtension", void 0); (0, _defineProperty2.default)(this, "experimentalExtension", void 0); /** `true` if `cryptoSetupExtension` is the default implementation; `false` if it is implemented by a module. */ (0, _defineProperty2.default)(this, "hasDefaultCryptoSetupExtension", true); /** `true` if `experimentalExtension` is the default implementation; `false` if it is implemented by a module. */ (0, _defineProperty2.default)(this, "hasDefaultExperimentalExtension", true); // Set up defaults this.cryptoSetupExtension = new _CryptoSetupExtensions.DefaultCryptoSetupExtensions(); this.experimentalExtension = new _ExperimentalExtensions.DefaultExperimentalExtensions(); } /** * Provides a crypto setup extension. * * @returns The registered extension. If no module provides this extension, a default implementation is returned. */ get cryptoSetup() { return this.cryptoSetupExtension; } /** * Provides an experimental extension. * * @remarks * This method extension is provided to simplify experimentation and development, and is not intended for production code. * * @returns The registered extension. If no module provides this extension, a default implementation is returned. */ get experimental() { return this.experimentalExtension; } /** * Add any extensions provided by the module. * * @param module - The appModule to check for extensions. * * @throws if an extension is provided by more than one module. */ addExtensions(module) { const runtimeModule = module.module; /* Add the cryptoSetup extension if any */ if (runtimeModule.extensions?.cryptoSetup) { if (this.hasDefaultCryptoSetupExtension) { this.cryptoSetupExtension = runtimeModule.extensions?.cryptoSetup; this.hasDefaultCryptoSetupExtension = false; } else { throw new Error(`adding cryptoSetup extension implementation from module ${runtimeModule.moduleName} but an implementation was already provided.`); } } /* Add the experimental extension if any */ if (runtimeModule.extensions?.experimental) { if (this.hasDefaultExperimentalExtension) { this.experimentalExtension = runtimeModule.extensions?.experimental; this.hasDefaultExperimentalExtension = false; } else { throw new Error(`adding experimental extension implementation from module ${runtimeModule.moduleName} but an implementation was already provided.`); } } } } /** * Handles and coordinates the operation of modules. */ class ModuleRunner { constructor() { (0, _defineProperty2.default)(this, "extensionsManager", new ExtensionsManager()); (0, _defineProperty2.default)(this, "modules", []); } // we only want one instance /** * Exposes all extensions which may be overridden/provided by modules. * * @returns An `ExtensionsManager` which exposes the extensions. */ get extensions() { return this.extensionsManager; } /** * Resets the runner, clearing all known modules, and all extensions * * Intended for test usage only. */ reset() { this.modules = []; this.extensionsManager = new ExtensionsManager(); } /** * All custom translations from all registered modules. */ get allTranslations() { const merged = {}; for (const module of this.modules) { const i18n = module.api.translations; if (!i18n) continue; for (const [lang, strings] of Object.entries(i18n)) { (0, _utils.safeSet)(merged, lang, merged[lang] || {}); for (const [str, val] of Object.entries(strings)) { (0, _utils.safeSet)(merged[lang], str, val); } } } return merged; } /** * Registers a factory which creates a module for later loading. The factory * will be called immediately. * @param factory The module factory. */ registerModule(factory) { const appModule = new _AppModule.AppModule(factory); this.modules.push(appModule); // Check if the new module provides any extensions, and also ensure a given extension is only provided by a single runtime module. this.extensionsManager.addExtensions(appModule); } /** * Invokes a lifecycle event, notifying registered modules. * @param lifecycleEvent The lifecycle event. * @param args The arguments for the lifecycle event. */ invoke(lifecycleEvent, ...args) { for (const module of this.modules) { module.module.emit(lifecycleEvent, ...args); } } } exports.ModuleRunner = ModuleRunner; _ModuleRunner = ModuleRunner; (0, _defineProperty2.default)(ModuleRunner, "instance", new _ModuleRunner()); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdXRpbHMiLCJyZXF1aXJlIiwiX0NyeXB0b1NldHVwRXh0ZW5zaW9ucyIsIl9FeHBlcmltZW50YWxFeHRlbnNpb25zIiwiX0FwcE1vZHVsZSIsIl9Nb2R1bGVSdW5uZXIiLCJFeHRlbnNpb25zTWFuYWdlciIsImNvbnN0cnVjdG9yIiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJjcnlwdG9TZXR1cEV4dGVuc2lvbiIsIkRlZmF1bHRDcnlwdG9TZXR1cEV4dGVuc2lvbnMiLCJleHBlcmltZW50YWxFeHRlbnNpb24iLCJEZWZhdWx0RXhwZXJpbWVudGFsRXh0ZW5zaW9ucyIsImNyeXB0b1NldHVwIiwiZXhwZXJpbWVudGFsIiwiYWRkRXh0ZW5zaW9ucyIsIm1vZHVsZSIsInJ1bnRpbWVNb2R1bGUiLCJleHRlbnNpb25zIiwiaGFzRGVmYXVsdENyeXB0b1NldHVwRXh0ZW5zaW9uIiwiRXJyb3IiLCJtb2R1bGVOYW1lIiwiaGFzRGVmYXVsdEV4cGVyaW1lbnRhbEV4dGVuc2lvbiIsIk1vZHVsZVJ1bm5lciIsImV4dGVuc2lvbnNNYW5hZ2VyIiwicmVzZXQiLCJtb2R1bGVzIiwiYWxsVHJhbnNsYXRpb25zIiwibWVyZ2VkIiwiaTE4biIsImFwaSIsInRyYW5zbGF0aW9ucyIsImxhbmciLCJzdHJpbmdzIiwiT2JqZWN0IiwiZW50cmllcyIsInNhZmVTZXQiLCJzdHIiLCJ2YWwiLCJyZWdpc3Rlck1vZHVsZSIsImZhY3RvcnkiLCJhcHBNb2R1bGUiLCJBcHBNb2R1bGUiLCJwdXNoIiwiaW52b2tlIiwibGlmZWN5Y2xlRXZlbnQiLCJhcmdzIiwiZW1pdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kdWxlcy9Nb2R1bGVSdW5uZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjIgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IHsgc2FmZVNldCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy91dGlsc1wiO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25TdHJpbmdzT2JqZWN0IH0gZnJvbSBcIkBtYXRyaXgtb3JnL3JlYWN0LXNkay1tb2R1bGUtYXBpL2xpYi90eXBlcy90cmFuc2xhdGlvbnNcIjtcbmltcG9ydCB7IEFueUxpZmVjeWNsZSB9IGZyb20gXCJAbWF0cml4LW9yZy9yZWFjdC1zZGstbW9kdWxlLWFwaS9saWIvbGlmZWN5Y2xlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgICBEZWZhdWx0Q3J5cHRvU2V0dXBFeHRlbnNpb25zLFxuICAgIFByb3ZpZGVDcnlwdG9TZXR1cEV4dGVuc2lvbnMsXG59IGZyb20gXCJAbWF0cml4LW9yZy9yZWFjdC1zZGstbW9kdWxlLWFwaS9saWIvbGlmZWN5Y2xlcy9DcnlwdG9TZXR1cEV4dGVuc2lvbnNcIjtcbmltcG9ydCB7XG4gICAgRGVmYXVsdEV4cGVyaW1lbnRhbEV4dGVuc2lvbnMsXG4gICAgUHJvdmlkZUV4cGVyaW1lbnRhbEV4dGVuc2lvbnMsXG59IGZyb20gXCJAbWF0cml4LW9yZy9yZWFjdC1zZGstbW9kdWxlLWFwaS9saWIvbGlmZWN5Y2xlcy9FeHBlcmltZW50YWxFeHRlbnNpb25zXCI7XG5cbmltcG9ydCB7IEFwcE1vZHVsZSB9IGZyb20gXCIuL0FwcE1vZHVsZVwiO1xuaW1wb3J0IHsgTW9kdWxlRmFjdG9yeSB9IGZyb20gXCIuL01vZHVsZUZhY3RvcnlcIjtcblxuaW1wb3J0IFwiLi9Nb2R1bGVDb21wb25lbnRzXCI7XG5cbi8qKlxuICogSGFuZGxlcyBhbmQgbWFuYWdlcyBleHRlbnNpb25zIHByb3ZpZGVkIGJ5IG1vZHVsZXMuXG4gKi9cbmNsYXNzIEV4dGVuc2lvbnNNYW5hZ2VyIHtcbiAgICAvLyBQcml2YXRlIGJhY2tpbmcgZmllbGRzIGZvciBleHRlbnNpb25zXG4gICAgcHJpdmF0ZSBjcnlwdG9TZXR1cEV4dGVuc2lvbjogUHJvdmlkZUNyeXB0b1NldHVwRXh0ZW5zaW9ucztcbiAgICBwcml2YXRlIGV4cGVyaW1lbnRhbEV4dGVuc2lvbjogUHJvdmlkZUV4cGVyaW1lbnRhbEV4dGVuc2lvbnM7XG5cbiAgICAvKiogYHRydWVgIGlmIGBjcnlwdG9TZXR1cEV4dGVuc2lvbmAgaXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb247IGBmYWxzZWAgaWYgaXQgaXMgaW1wbGVtZW50ZWQgYnkgYSBtb2R1bGUuICovXG4gICAgcHJpdmF0ZSBoYXNEZWZhdWx0Q3J5cHRvU2V0dXBFeHRlbnNpb24gPSB0cnVlO1xuXG4gICAgLyoqIGB0cnVlYCBpZiBgZXhwZXJpbWVudGFsRXh0ZW5zaW9uYCBpcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjsgYGZhbHNlYCBpZiBpdCBpcyBpbXBsZW1lbnRlZCBieSBhIG1vZHVsZS4gKi9cbiAgICBwcml2YXRlIGhhc0RlZmF1bHRFeHBlcmltZW50YWxFeHRlbnNpb24gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gU2V0IHVwIGRlZmF1bHRzXG4gICAgICAgIHRoaXMuY3J5cHRvU2V0dXBFeHRlbnNpb24gPSBuZXcgRGVmYXVsdENyeXB0b1NldHVwRXh0ZW5zaW9ucygpO1xuICAgICAgICB0aGlzLmV4cGVyaW1lbnRhbEV4dGVuc2lvbiA9IG5ldyBEZWZhdWx0RXhwZXJpbWVudGFsRXh0ZW5zaW9ucygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGEgY3J5cHRvIHNldHVwIGV4dGVuc2lvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSByZWdpc3RlcmVkIGV4dGVuc2lvbi4gSWYgbm8gbW9kdWxlIHByb3ZpZGVzIHRoaXMgZXh0ZW5zaW9uLCBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgcmV0dXJuZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBjcnlwdG9TZXR1cCgpOiBQcm92aWRlQ3J5cHRvU2V0dXBFeHRlbnNpb25zIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3J5cHRvU2V0dXBFeHRlbnNpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYW4gZXhwZXJpbWVudGFsIGV4dGVuc2lvbi5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgZXh0ZW5zaW9uIGlzIHByb3ZpZGVkIHRvIHNpbXBsaWZ5IGV4cGVyaW1lbnRhdGlvbiBhbmQgZGV2ZWxvcG1lbnQsIGFuZCBpcyBub3QgaW50ZW5kZWQgZm9yIHByb2R1Y3Rpb24gY29kZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSByZWdpc3RlcmVkIGV4dGVuc2lvbi4gSWYgbm8gbW9kdWxlIHByb3ZpZGVzIHRoaXMgZXh0ZW5zaW9uLCBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgcmV0dXJuZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBleHBlcmltZW50YWwoKTogUHJvdmlkZUV4cGVyaW1lbnRhbEV4dGVuc2lvbnMge1xuICAgICAgICByZXR1cm4gdGhpcy5leHBlcmltZW50YWxFeHRlbnNpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGFueSBleHRlbnNpb25zIHByb3ZpZGVkIGJ5IHRoZSBtb2R1bGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW9kdWxlIC0gVGhlIGFwcE1vZHVsZSB0byBjaGVjayBmb3IgZXh0ZW5zaW9ucy5cbiAgICAgKlxuICAgICAqIEB0aHJvd3MgaWYgYW4gZXh0ZW5zaW9uIGlzIHByb3ZpZGVkIGJ5IG1vcmUgdGhhbiBvbmUgbW9kdWxlLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRFeHRlbnNpb25zKG1vZHVsZTogQXBwTW9kdWxlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJ1bnRpbWVNb2R1bGUgPSBtb2R1bGUubW9kdWxlO1xuXG4gICAgICAgIC8qIEFkZCB0aGUgY3J5cHRvU2V0dXAgZXh0ZW5zaW9uIGlmIGFueSAqL1xuICAgICAgICBpZiAocnVudGltZU1vZHVsZS5leHRlbnNpb25zPy5jcnlwdG9TZXR1cCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVmYXVsdENyeXB0b1NldHVwRXh0ZW5zaW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcnlwdG9TZXR1cEV4dGVuc2lvbiA9IHJ1bnRpbWVNb2R1bGUuZXh0ZW5zaW9ucz8uY3J5cHRvU2V0dXA7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNEZWZhdWx0Q3J5cHRvU2V0dXBFeHRlbnNpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgYWRkaW5nIGNyeXB0b1NldHVwIGV4dGVuc2lvbiBpbXBsZW1lbnRhdGlvbiBmcm9tIG1vZHVsZSAke3J1bnRpbWVNb2R1bGUubW9kdWxlTmFtZX0gYnV0IGFuIGltcGxlbWVudGF0aW9uIHdhcyBhbHJlYWR5IHByb3ZpZGVkLmAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEFkZCB0aGUgZXhwZXJpbWVudGFsIGV4dGVuc2lvbiBpZiBhbnkgKi9cbiAgICAgICAgaWYgKHJ1bnRpbWVNb2R1bGUuZXh0ZW5zaW9ucz8uZXhwZXJpbWVudGFsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWZhdWx0RXhwZXJpbWVudGFsRXh0ZW5zaW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leHBlcmltZW50YWxFeHRlbnNpb24gPSBydW50aW1lTW9kdWxlLmV4dGVuc2lvbnM/LmV4cGVyaW1lbnRhbDtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc0RlZmF1bHRFeHBlcmltZW50YWxFeHRlbnNpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgYWRkaW5nIGV4cGVyaW1lbnRhbCBleHRlbnNpb24gaW1wbGVtZW50YXRpb24gZnJvbSBtb2R1bGUgJHtydW50aW1lTW9kdWxlLm1vZHVsZU5hbWV9IGJ1dCBhbiBpbXBsZW1lbnRhdGlvbiB3YXMgYWxyZWFkeSBwcm92aWRlZC5gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyBhbmQgY29vcmRpbmF0ZXMgdGhlIG9wZXJhdGlvbiBvZiBtb2R1bGVzLlxuICovXG5leHBvcnQgY2xhc3MgTW9kdWxlUnVubmVyIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGluc3RhbmNlID0gbmV3IE1vZHVsZVJ1bm5lcigpO1xuXG4gICAgcHJpdmF0ZSBleHRlbnNpb25zTWFuYWdlciA9IG5ldyBFeHRlbnNpb25zTWFuYWdlcigpO1xuXG4gICAgcHJpdmF0ZSBtb2R1bGVzOiBBcHBNb2R1bGVbXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gd2Ugb25seSB3YW50IG9uZSBpbnN0YW5jZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4cG9zZXMgYWxsIGV4dGVuc2lvbnMgd2hpY2ggbWF5IGJlIG92ZXJyaWRkZW4vcHJvdmlkZWQgYnkgbW9kdWxlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFuIGBFeHRlbnNpb25zTWFuYWdlcmAgd2hpY2ggZXhwb3NlcyB0aGUgZXh0ZW5zaW9ucy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGV4dGVuc2lvbnMoKTogRXh0ZW5zaW9uc01hbmFnZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5leHRlbnNpb25zTWFuYWdlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIHJ1bm5lciwgY2xlYXJpbmcgYWxsIGtub3duIG1vZHVsZXMsIGFuZCBhbGwgZXh0ZW5zaW9uc1xuICAgICAqXG4gICAgICogSW50ZW5kZWQgZm9yIHRlc3QgdXNhZ2Ugb25seS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubW9kdWxlcyA9IFtdO1xuICAgICAgICB0aGlzLmV4dGVuc2lvbnNNYW5hZ2VyID0gbmV3IEV4dGVuc2lvbnNNYW5hZ2VyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsIGN1c3RvbSB0cmFuc2xhdGlvbnMgZnJvbSBhbGwgcmVnaXN0ZXJlZCBtb2R1bGVzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYWxsVHJhbnNsYXRpb25zKCk6IFRyYW5zbGF0aW9uU3RyaW5nc09iamVjdCB7XG4gICAgICAgIGNvbnN0IG1lcmdlZDogVHJhbnNsYXRpb25TdHJpbmdzT2JqZWN0ID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgdGhpcy5tb2R1bGVzKSB7XG4gICAgICAgICAgICBjb25zdCBpMThuID0gbW9kdWxlLmFwaS50cmFuc2xhdGlvbnM7XG4gICAgICAgICAgICBpZiAoIWkxOG4pIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtsYW5nLCBzdHJpbmdzXSBvZiBPYmplY3QuZW50cmllcyhpMThuKSkge1xuICAgICAgICAgICAgICAgIHNhZmVTZXQobWVyZ2VkLCBsYW5nLCBtZXJnZWRbbGFuZ10gfHwge30pO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbc3RyLCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHN0cmluZ3MpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNhZmVTZXQobWVyZ2VkW2xhbmddLCBzdHIsIHZhbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lcmdlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBmYWN0b3J5IHdoaWNoIGNyZWF0ZXMgYSBtb2R1bGUgZm9yIGxhdGVyIGxvYWRpbmcuIFRoZSBmYWN0b3J5XG4gICAgICogd2lsbCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkuXG4gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIG1vZHVsZSBmYWN0b3J5LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck1vZHVsZShmYWN0b3J5OiBNb2R1bGVGYWN0b3J5KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFwcE1vZHVsZSA9IG5ldyBBcHBNb2R1bGUoZmFjdG9yeSk7XG5cbiAgICAgICAgdGhpcy5tb2R1bGVzLnB1c2goYXBwTW9kdWxlKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgbmV3IG1vZHVsZSBwcm92aWRlcyBhbnkgZXh0ZW5zaW9ucywgYW5kIGFsc28gZW5zdXJlIGEgZ2l2ZW4gZXh0ZW5zaW9uIGlzIG9ubHkgcHJvdmlkZWQgYnkgYSBzaW5nbGUgcnVudGltZSBtb2R1bGUuXG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uc01hbmFnZXIuYWRkRXh0ZW5zaW9ucyhhcHBNb2R1bGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgYSBsaWZlY3ljbGUgZXZlbnQsIG5vdGlmeWluZyByZWdpc3RlcmVkIG1vZHVsZXMuXG4gICAgICogQHBhcmFtIGxpZmVjeWNsZUV2ZW50IFRoZSBsaWZlY3ljbGUgZXZlbnQuXG4gICAgICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3VtZW50cyBmb3IgdGhlIGxpZmVjeWNsZSBldmVudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW52b2tlKGxpZmVjeWNsZUV2ZW50OiBBbnlMaWZlY3ljbGUsIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIHRoaXMubW9kdWxlcykge1xuICAgICAgICAgICAgbW9kdWxlLm1vZHVsZS5lbWl0KGxpZmVjeWNsZUV2ZW50LCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFRQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFHQSxJQUFBQyxzQkFBQSxHQUFBRCxPQUFBO0FBSUEsSUFBQUUsdUJBQUEsR0FBQUYsT0FBQTtBQUtBLElBQUFHLFVBQUEsR0FBQUgsT0FBQTtBQUdBQSxPQUFBO0FBQTRCLElBQUFJLGFBQUE7QUF2QjVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBbUJBO0FBQ0E7QUFDQTtBQUNBLE1BQU1DLGlCQUFpQixDQUFDO0VBV3BCO0FBQ0o7QUFDQTtFQUNXQyxXQUFXQSxDQUFBLEVBQUc7SUFickI7SUFBQSxJQUFBQyxnQkFBQSxDQUFBQyxPQUFBO0lBQUEsSUFBQUQsZ0JBQUEsQ0FBQUMsT0FBQTtJQUlBO0lBQUEsSUFBQUQsZ0JBQUEsQ0FBQUMsT0FBQSwwQ0FDeUMsSUFBSTtJQUU3QztJQUFBLElBQUFELGdCQUFBLENBQUFDLE9BQUEsMkNBQzBDLElBQUk7SUFNMUM7SUFDQSxJQUFJLENBQUNDLG9CQUFvQixHQUFHLElBQUlDLG1EQUE0QixDQUFDLENBQUM7SUFDOUQsSUFBSSxDQUFDQyxxQkFBcUIsR0FBRyxJQUFJQyxxREFBNkIsQ0FBQyxDQUFDO0VBQ3BFOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFDSSxJQUFXQyxXQUFXQSxDQUFBLEVBQWlDO0lBQ25ELE9BQU8sSUFBSSxDQUFDSixvQkFBb0I7RUFDcEM7O0VBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJLElBQVdLLFlBQVlBLENBQUEsRUFBa0M7SUFDckQsT0FBTyxJQUFJLENBQUNILHFCQUFxQjtFQUNyQzs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNXSSxhQUFhQSxDQUFDQyxNQUFpQixFQUFRO0lBQzFD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