matrix-react-sdk
Version:
SDK for matrix.org using React
168 lines (154 loc) • 19.5 kB
JavaScript
;
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/LmV4cGVyaW1lbnRhbDtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc0RlZmF1bHRFeHBlcmltZW50YWxFeHRlbnNpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgYWRkaW5nIGV4cGVyaW1lbnRhbCBleHRlbnNpb24gaW1wbGVtZW50YXRpb24gZnJvbSBtb2R1bGUgJHtydW50aW1lTW9kdWxlLm1vZHVsZU5hbWV9IGJ1dCBhbiBpbXBsZW1lbnRhdGlvbiB3YXMgYWxyZWFkeSBwcm92aWRlZC5gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyBhbmQgY29vcmRpbmF0ZXMgdGhlIG9wZXJhdGlvbiBvZiBtb2R1bGVzLlxuICovXG5leHBvcnQgY2xhc3MgTW9kdWxlUnVubmVyIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGluc3RhbmNlID0gbmV3IE1vZHVsZVJ1bm5lcigpO1xuXG4gICAgcHJpdmF0ZSBleHRlbnNpb25zTWFuYWdlciA9IG5ldyBFeHRlbnNpb25zTWFuYWdlcigpO1xuXG4gICAgcHJpdmF0ZSBtb2R1bGVzOiBBcHBNb2R1bGVbXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gd2Ugb25seSB3YW50IG9uZSBpbnN0YW5jZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4cG9zZXMgYWxsIGV4dGVuc2lvbnMgd2hpY2ggbWF5IGJlIG92ZXJyaWRkZW4vcHJvdmlkZWQgYnkgbW9kdWxlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFuIGBFeHRlbnNpb25zTWFuYWdlcmAgd2hpY2ggZXhwb3NlcyB0aGUgZXh0ZW5zaW9ucy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGV4dGVuc2lvbnMoKTogRXh0ZW5zaW9uc01hbmFnZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5leHRlbnNpb25zTWFuYWdlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIHJ1bm5lciwgY2xlYXJpbmcgYWxsIGtub3duIG1vZHVsZXMsIGFuZCBhbGwgZXh0ZW5zaW9uc1xuICAgICAqXG4gICAgICogSW50ZW5kZWQgZm9yIHRlc3QgdXNhZ2Ugb25seS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubW9kdWxlcyA9IFtdO1xuICAgICAgICB0aGlzLmV4dGVuc2lvbnNNYW5hZ2VyID0gbmV3IEV4dGVuc2lvbnNNYW5hZ2VyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsIGN1c3RvbSB0cmFuc2xhdGlvbnMgZnJvbSBhbGwgcmVnaXN0ZXJlZCBtb2R1bGVzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYWxsVHJhbnNsYXRpb25zKCk6IFRyYW5zbGF0aW9uU3RyaW5nc09iamVjdCB7XG4gICAgICAgIGNvbnN0IG1lcmdlZDogVHJhbnNsYXRpb25TdHJpbmdzT2JqZWN0ID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgdGhpcy5tb2R1bGVzKSB7XG4gICAgICAgICAgICBjb25zdCBpMThuID0gbW9kdWxlLmFwaS50cmFuc2xhdGlvbnM7XG4gICAgICAgICAgICBpZiAoIWkxOG4pIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtsYW5nLCBzdHJpbmdzXSBvZiBPYmplY3QuZW50cmllcyhpMThuKSkge1xuICAgICAgICAgICAgICAgIHNhZmVTZXQobWVyZ2VkLCBsYW5nLCBtZXJnZWRbbGFuZ10gfHwge30pO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbc3RyLCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHN0cmluZ3MpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNhZmVTZXQobWVyZ2VkW2xhbmddLCBzdHIsIHZhbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lcmdlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBmYWN0b3J5IHdoaWNoIGNyZWF0ZXMgYSBtb2R1bGUgZm9yIGxhdGVyIGxvYWRpbmcuIFRoZSBmYWN0b3J5XG4gICAgICogd2lsbCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkuXG4gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIG1vZHVsZSBmYWN0b3J5LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck1vZHVsZShmYWN0b3J5OiBNb2R1bGVGYWN0b3J5KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFwcE1vZHVsZSA9IG5ldyBBcHBNb2R1bGUoZmFjdG9yeSk7XG5cbiAgICAgICAgdGhpcy5tb2R1bGVzLnB1c2goYXBwTW9kdWxlKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgbmV3IG1vZHVsZSBwcm92aWRlcyBhbnkgZXh0ZW5zaW9ucywgYW5kIGFsc28gZW5zdXJlIGEgZ2l2ZW4gZXh0ZW5zaW9uIGlzIG9ubHkgcHJvdmlkZWQgYnkgYSBzaW5nbGUgcnVudGltZSBtb2R1bGUuXG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uc01hbmFnZXIuYWRkRXh0ZW5zaW9ucyhhcHBNb2R1bGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgYSBsaWZlY3ljbGUgZXZlbnQsIG5vdGlmeWluZyByZWdpc3RlcmVkIG1vZHVsZXMuXG4gICAgICogQHBhcmFtIGxpZmVjeWNsZUV2ZW50IFRoZSBsaWZlY3ljbGUgZXZlbnQuXG4gICAgICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3VtZW50cyBmb3IgdGhlIGxpZmVjeWNsZSBldmVudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW52b2tlKGxpZmVjeWNsZUV2ZW50OiBBbnlMaWZlY3ljbGUsIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIHRoaXMubW9kdWxlcykge1xuICAgICAgICAgICAgbW9kdWxlLm1vZHVsZS5lbWl0KGxpZmVjeWNsZUV2ZW50LCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFRQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFHQSxJQUFBQyxzQkFBQSxHQUFBRCxPQUFBO0FBSUEsSUFBQUUsdUJBQUEsR0FBQUYsT0FBQTtBQUtBLElBQUFHLFVBQUEsR0FBQUgsT0FBQTtBQUdBQSxPQUFBO0FBQTRCLElBQUFJLGFBQUE7QUF2QjVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBbUJBO0FBQ0E7QUFDQTtBQUNBLE1BQU1DLGlCQUFpQixDQUFDO0VBV3BCO0FBQ0o7QUFDQTtFQUNXQyxXQUFXQSxDQUFBLEVBQUc7SUFickI7SUFBQSxJQUFBQyxnQkFBQSxDQUFBQyxPQUFBO0lBQUEsSUFBQUQsZ0JBQUEsQ0FBQUMsT0FBQTtJQUlBO0lBQUEsSUFBQUQsZ0JBQUEsQ0FBQUMsT0FBQSwwQ0FDeUMsSUFBSTtJQUU3QztJQUFBLElBQUFELGdCQUFBLENBQUFDLE9BQUEsMkNBQzBDLElBQUk7SUFNMUM7SUFDQSxJQUFJLENBQUNDLG9CQUFvQixHQUFHLElBQUlDLG1EQUE0QixDQUFDLENBQUM7SUFDOUQsSUFBSSxDQUFDQyxxQkFBcUIsR0FBRyxJQUFJQyxxREFBNkIsQ0FBQyxDQUFDO0VBQ3BFOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFDSSxJQUFXQyxXQUFXQSxDQUFBLEVBQWlDO0lBQ25ELE9BQU8sSUFBSSxDQUFDSixvQkFBb0I7RUFDcEM7O0VBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJLElBQVdLLFlBQVlBLENBQUEsRUFBa0M7SUFDckQsT0FBTyxJQUFJLENBQUNILHFCQUFxQjtFQUNyQzs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNXSSxhQUFhQSxDQUFDQyxNQUFpQixFQUFRO0lBQzFDLE1BQU1DLGFBQWEsR0FBR0QsTUFBTSxDQUFDQSxNQUFNOztJQUVuQztJQUNBLElBQUlDLGFBQWEsQ0FBQ0MsVUFBVSxFQUFFTCxXQUFXLEVBQUU7TUFDdkMsSUFBSSxJQUFJLENBQUNNLDhCQUE4QixFQUFFO1FBQ3JDLElBQUksQ0FBQ1Ysb0JBQW9CLEdBQUdRLGFBQWEsQ0FBQ0MsVUFBVSxFQUFFTCxXQUFXO1FBQ2pFLElBQUksQ0FBQ00sOEJBQThCLEdBQUcsS0FBSztNQUMvQyxDQUFDLE1BQU07UUFDSCxNQUFNLElBQUlDLEtBQUssQ0FDWCwyREFBMkRILGFBQWEsQ0FBQ0ksVUFBVSw4Q0FDdkYsQ0FBQztNQUNMO0lBQ0o7O0lBRUE7SUFDQSxJQUFJSixhQUFhLENBQUNDLFVBQVUsRUFBRUosWUFBWSxFQUFFO01BQ3hDLElBQUksSUFBSSxDQUFDUSwrQkFBK0IsRUFBRTtRQUN0QyxJQUFJLENBQUNYLHFCQUFxQixHQUFHTSxhQUFhLENBQUNDLFVBQVUsRUFBRUosWUFBWTtRQUNuRSxJQUFJLENBQUNRLCtCQUErQixHQUFHLEtBQUs7TUFDaEQsQ0FBQyxNQUFNO1FBQ0gsTUFBTSxJQUFJRixLQUFLLENBQ1gsNERBQTRESCxhQUFhLENBQUNJLFVBQVUsOENBQ3hGLENBQUM7TUFDTDtJQUNKO0VBQ0o7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDTyxNQUFNRSxZQUFZLENBQUM7RUFPZGpCLFdBQVdBLENBQUEsRUFBRztJQUFBLElBQUFDLGdCQUFBLENBQUFDLE9BQUEsNkJBSk0sSUFBSUgsaUJBQWlCLENBQUMsQ0FBQztJQUFBLElBQUFFLGdCQUFBLENBQUFDLE9BQUEsbUJBRXBCLEVBQUU7RUFJakMsQ0FBQyxDQURHOztFQUdKO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFDSSxJQUFXVSxVQUFVQSxDQUFBLEVBQXNCO0lBQ3ZDLE9BQU8sSUFBSSxDQUFDTSxpQkFBaUI7RUFDakM7O0VBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUNXQyxLQUFLQSxDQUFBLEVBQVM7SUFDakIsSUFBSSxDQUFDQyxPQUFPLEdBQUcsRUFBRTtJQUNqQixJQUFJLENBQUNGLGlCQUFpQixHQUFHLElBQUluQixpQkFBaUIsQ0FBQyxDQUFDO0VBQ3BEOztFQUVBO0FBQ0o7QUFDQTtFQUNJLElBQVdzQixlQUFlQSxDQUFBLEVBQTZCO0lBQ25ELE1BQU1DLE1BQWdDLEdBQUcsQ0FBQyxDQUFDO0lBRTNDLEtBQUssTUFBTVosTUFBTSxJQUFJLElBQUksQ0FBQ1UsT0FBTyxFQUFFO01BQy9CLE1BQU1HLElBQUksR0FBR2IsTUFBTSxDQUFDYyxHQUFHLENBQUNDLFlBQVk7TUFDcEMsSUFBSSxDQUFDRixJQUFJLEVBQUU7TUFFWCxLQUFLLE1BQU0sQ0FBQ0csSUFBSSxFQUFFQyxPQUFPLENBQUMsSUFBSUMsTUFBTSxDQUFDQyxPQUFPLENBQUNOLElBQUksQ0FBQyxFQUFFO1FBQ2hELElBQUFPLGNBQU8sRUFBQ1IsTUFBTSxFQUFFSSxJQUFJLEVBQUVKLE1BQU0sQ0FBQ0ksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFekMsS0FBSyxNQUFNLENBQUNLLEdBQUcsRUFBRUMsR0FBRyxDQUFDLElBQUlKLE1BQU0sQ0FBQ0MsT0FBTyxDQUFDRixPQUFPLENBQUMsRUFBRTtVQUM5QyxJQUFBRyxjQUFPLEVBQUNSLE1BQU0sQ0FBQ0ksSUFBSSxDQUFDLEVBQUVLLEdBQUcsRUFBRUMsR0FBRyxDQUFDO1FBQ25DO01BQ0o7SUFDSjtJQUVBLE9BQU9WLE1BQU07RUFDakI7O0VBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUNXVyxjQUFjQSxDQUFDQyxPQUFzQixFQUFRO0lBQ2hELE1BQU1DLFNBQVMsR0FBRyxJQUFJQyxvQkFBUyxDQUFDRixPQUFPLENBQUM7SUFFeEMsSUFBSSxDQUFDZCxPQUFPLENBQUNpQixJQUFJLENBQUNGLFNBQVMsQ0FBQzs7SUFFNUI7SUFDQSxJQUFJLENBQUNqQixpQkFBaUIsQ0FBQ1QsYUFBYSxDQUFDMEIsU0FBUyxDQUFDO0VBQ25EOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFDV0csTUFBTUEsQ0FBQ0MsY0FBNEIsRUFBRSxHQUFHQyxJQUFXLEVBQVE7SUFDOUQsS0FBSyxNQUFNOUIsTUFBTSxJQUFJLElBQUksQ0FBQ1UsT0FBTyxFQUFFO01BQy9CVixNQUFNLENBQUNBLE1BQU0sQ0FBQytCLElBQUksQ0FBQ0YsY0FBYyxFQUFFLEdBQUdDLElBQUksQ0FBQztJQUMvQztFQUNKO0FBQ0o7QUFBQ0UsT0FBQSxDQUFBekIsWUFBQSxHQUFBQSxZQUFBO0FBQUFuQixhQUFBLEdBNUVZbUIsWUFBWTtBQUFBLElBQUFoQixnQkFBQSxDQUFBQyxPQUFBLEVBQVplLFlBQVksY0FDYSxJQUFJQSxhQUFZLENBQUMsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==