UNPKG

matrix-react-sdk

Version:
123 lines (118 loc) 16 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _matrix = require("matrix-js-sdk/src/matrix"); var _versionSupport = require("matrix-js-sdk/src/version-support"); var _logger = require("matrix-js-sdk/src/logger"); var _actions = require("../dispatcher/actions"); var _dispatcher = _interopRequireDefault(require("../dispatcher/dispatcher")); var _AsyncStore = require("./AsyncStore"); var _MatrixClientPeg = require("../MatrixClientPeg"); var _ToastStore = _interopRequireDefault(require("./ToastStore")); var _languageHandler = require("../languageHandler"); var _SdkConfig = _interopRequireDefault(require("../SdkConfig")); var _GenericToast = _interopRequireDefault(require("../components/views/toasts/GenericToast")); /* Copyright 2024 New Vector Ltd. Copyright 2017-2021 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 INITIAL_STATE = { deferredAction: null }; /** * A class for storing application state to do with authentication. This is a simple * store that listens for actions and updates its state accordingly, informing any * listeners (views) of state changes. */ class LifecycleStore extends _AsyncStore.AsyncStore { constructor() { super(_dispatcher.default, INITIAL_STATE); } onDispatch(payload) { switch (payload.action) { case _actions.Action.DoAfterSyncPrepared: this.updateState({ deferredAction: payload.deferred_action }); break; case "cancel_after_sync_prepared": this.updateState({ deferredAction: null }); break; case "MatrixActions.sync": { if (payload.state === _matrix.SyncState.Syncing && payload.prevState !== _matrix.SyncState.Syncing) { // We've reconnected to the server: update server version support // This is async but we don't care about the result, so just fire & forget. checkServerVersions(); } if (payload.state !== "PREPARED") { break; } if (!this.state.deferredAction) break; const deferredAction = Object.assign({}, this.state.deferredAction); this.updateState({ deferredAction: null }); _dispatcher.default.dispatch(deferredAction); break; } case "on_client_not_viable": case _actions.Action.OnLoggedOut: this.reset(); break; } } } async function checkServerVersions() { try { const client = _MatrixClientPeg.MatrixClientPeg.get(); if (!client) return; for (const version of _versionSupport.SUPPORTED_MATRIX_VERSIONS) { // Check if the server supports this spec version. (`isVersionSupported` caches the response, so this loop will // only make a single HTTP request). // Note that although we do this on a reconnect, we cache the server's versions in memory // indefinitely, so it will only ever trigger the toast on the first connection after a fresh // restart of the client. if (await client.isVersionSupported(version)) { // we found a compatible spec version return; } } // This is retrospective doc having debated about the exactly what this toast is for, but // our guess is that it's a nudge to update, or ask your HS admin to update your Homeserver // after a new version of Element has come out, in a way that doesn't lock you out of all // your messages. const toastKey = "LEGACY_SERVER"; _ToastStore.default.sharedInstance().addOrReplaceToast({ key: toastKey, title: (0, _languageHandler._t)("unsupported_server_title"), props: { description: (0, _languageHandler._t)("unsupported_server_description", { version: _versionSupport.MINIMUM_MATRIX_VERSION, brand: _SdkConfig.default.get().brand }), primaryLabel: (0, _languageHandler._t)("action|ok"), onPrimaryClick: () => { _ToastStore.default.sharedInstance().dismissToast(toastKey); } }, component: _GenericToast.default, priority: 98 }); } catch (e) { _logger.logger.warn("Failed to check server versions", e); } } let singletonLifecycleStore = null; if (!singletonLifecycleStore) { singletonLifecycleStore = new LifecycleStore(); } var _default = exports.default = singletonLifecycleStore; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl92ZXJzaW9uU3VwcG9ydCIsIl9sb2dnZXIiLCJfYWN0aW9ucyIsIl9kaXNwYXRjaGVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9Bc3luY1N0b3JlIiwiX01hdHJpeENsaWVudFBlZyIsIl9Ub2FzdFN0b3JlIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9TZGtDb25maWciLCJfR2VuZXJpY1RvYXN0IiwiSU5JVElBTF9TVEFURSIsImRlZmVycmVkQWN0aW9uIiwiTGlmZWN5Y2xlU3RvcmUiLCJBc3luY1N0b3JlIiwiY29uc3RydWN0b3IiLCJkaXMiLCJvbkRpc3BhdGNoIiwicGF5bG9hZCIsImFjdGlvbiIsIkFjdGlvbiIsIkRvQWZ0ZXJTeW5jUHJlcGFyZWQiLCJ1cGRhdGVTdGF0ZSIsImRlZmVycmVkX2FjdGlvbiIsInN0YXRlIiwiU3luY1N0YXRlIiwiU3luY2luZyIsInByZXZTdGF0ZSIsImNoZWNrU2VydmVyVmVyc2lvbnMiLCJPYmplY3QiLCJhc3NpZ24iLCJkaXNwYXRjaCIsIk9uTG9nZ2VkT3V0IiwicmVzZXQiLCJjbGllbnQiLCJNYXRyaXhDbGllbnRQZWciLCJnZXQiLCJ2ZXJzaW9uIiwiU1VQUE9SVEVEX01BVFJJWF9WRVJTSU9OUyIsImlzVmVyc2lvblN1cHBvcnRlZCIsInRvYXN0S2V5IiwiVG9hc3RTdG9yZSIsInNoYXJlZEluc3RhbmNlIiwiYWRkT3JSZXBsYWNlVG9hc3QiLCJrZXkiLCJ0aXRsZSIsIl90IiwicHJvcHMiLCJkZXNjcmlwdGlvbiIsIk1JTklNVU1fTUFUUklYX1ZFUlNJT04iLCJicmFuZCIsIlNka0NvbmZpZyIsInByaW1hcnlMYWJlbCIsIm9uUHJpbWFyeUNsaWNrIiwiZGlzbWlzc1RvYXN0IiwiY29tcG9uZW50IiwiR2VuZXJpY1RvYXN0IiwicHJpb3JpdHkiLCJlIiwibG9nZ2VyIiwid2FybiIsInNpbmdsZXRvbkxpZmVjeWNsZVN0b3JlIiwiX2RlZmF1bHQiLCJleHBvcnRzIiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yZXMvTGlmZWN5Y2xlU3RvcmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTctMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgeyBTeW5jU3RhdGUgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5pbXBvcnQgeyBNSU5JTVVNX01BVFJJWF9WRVJTSU9OLCBTVVBQT1JURURfTUFUUklYX1ZFUlNJT05TIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL3ZlcnNpb24tc3VwcG9ydFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuXG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwiLi4vZGlzcGF0Y2hlci9hY3Rpb25zXCI7XG5pbXBvcnQgZGlzIGZyb20gXCIuLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCB7IEFjdGlvblBheWxvYWQgfSBmcm9tIFwiLi4vZGlzcGF0Y2hlci9wYXlsb2Fkc1wiO1xuaW1wb3J0IHsgRG9BZnRlclN5bmNQcmVwYXJlZFBheWxvYWQgfSBmcm9tIFwiLi4vZGlzcGF0Y2hlci9wYXlsb2Fkcy9Eb0FmdGVyU3luY1ByZXBhcmVkUGF5bG9hZFwiO1xuaW1wb3J0IHsgQXN5bmNTdG9yZSB9IGZyb20gXCIuL0FzeW5jU3RvcmVcIjtcbmltcG9ydCB7IE1hdHJpeENsaWVudFBlZyB9IGZyb20gXCIuLi9NYXRyaXhDbGllbnRQZWdcIjtcbmltcG9ydCBUb2FzdFN0b3JlIGZyb20gXCIuL1RvYXN0U3RvcmVcIjtcbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IFNka0NvbmZpZyBmcm9tIFwiLi4vU2RrQ29uZmlnXCI7XG5pbXBvcnQgR2VuZXJpY1RvYXN0IGZyb20gXCIuLi9jb21wb25lbnRzL3ZpZXdzL3RvYXN0cy9HZW5lcmljVG9hc3RcIjtcblxuaW50ZXJmYWNlIElTdGF0ZSB7XG4gICAgZGVmZXJyZWRBY3Rpb246IEFjdGlvblBheWxvYWQgfCBudWxsO1xufVxuXG5jb25zdCBJTklUSUFMX1NUQVRFOiBJU3RhdGUgPSB7XG4gICAgZGVmZXJyZWRBY3Rpb246IG51bGwsXG59O1xuXG4vKipcbiAqIEEgY2xhc3MgZm9yIHN0b3JpbmcgYXBwbGljYXRpb24gc3RhdGUgdG8gZG8gd2l0aCBhdXRoZW50aWNhdGlvbi4gVGhpcyBpcyBhIHNpbXBsZVxuICogc3RvcmUgdGhhdCBsaXN0ZW5zIGZvciBhY3Rpb25zIGFuZCB1cGRhdGVzIGl0cyBzdGF0ZSBhY2NvcmRpbmdseSwgaW5mb3JtaW5nIGFueVxuICogbGlzdGVuZXJzICh2aWV3cykgb2Ygc3RhdGUgY2hhbmdlcy5cbiAqL1xuY2xhc3MgTGlmZWN5Y2xlU3RvcmUgZXh0ZW5kcyBBc3luY1N0b3JlPElTdGF0ZT4ge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoZGlzLCBJTklUSUFMX1NUQVRFKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25EaXNwYXRjaChwYXlsb2FkOiBBY3Rpb25QYXlsb2FkIHwgRG9BZnRlclN5bmNQcmVwYXJlZFBheWxvYWQ8QWN0aW9uUGF5bG9hZD4pOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoIChwYXlsb2FkLmFjdGlvbikge1xuICAgICAgICAgICAgY2FzZSBBY3Rpb24uRG9BZnRlclN5bmNQcmVwYXJlZDpcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWRBY3Rpb246IHBheWxvYWQuZGVmZXJyZWRfYWN0aW9uLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImNhbmNlbF9hZnRlcl9zeW5jX3ByZXBhcmVkXCI6XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkQWN0aW9uOiBudWxsLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIk1hdHJpeEFjdGlvbnMuc3luY1wiOiB7XG4gICAgICAgICAgICAgICAgaWYgKHBheWxvYWQuc3RhdGUgPT09IFN5bmNTdGF0ZS5TeW5jaW5nICYmIHBheWxvYWQucHJldlN0YXRlICE9PSBTeW5jU3RhdGUuU3luY2luZykge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSd2ZSByZWNvbm5lY3RlZCB0byB0aGUgc2VydmVyOiB1cGRhdGUgc2VydmVyIHZlcnNpb24gc3VwcG9ydFxuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGFzeW5jIGJ1dCB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSByZXN1bHQsIHNvIGp1c3QgZmlyZSAmIGZvcmdldC5cbiAgICAgICAgICAgICAgICAgICAgY2hlY2tTZXJ2ZXJWZXJzaW9ucygpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkLnN0YXRlICE9PSBcIlBSRVBBUkVEXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zdGF0ZS5kZWZlcnJlZEFjdGlvbikgYnJlYWs7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVmZXJyZWRBY3Rpb24gPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnN0YXRlLmRlZmVycmVkQWN0aW9uKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWRBY3Rpb246IG51bGwsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZGlzLmRpc3BhdGNoKGRlZmVycmVkQWN0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJvbl9jbGllbnRfbm90X3ZpYWJsZVwiOlxuICAgICAgICAgICAgY2FzZSBBY3Rpb24uT25Mb2dnZWRPdXQ6XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja1NlcnZlclZlcnNpb25zKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IE1hdHJpeENsaWVudFBlZy5nZXQoKTtcbiAgICAgICAgaWYgKCFjbGllbnQpIHJldHVybjtcbiAgICAgICAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIFNVUFBPUlRFRF9NQVRSSVhfVkVSU0lPTlMpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgdGhpcyBzcGVjIHZlcnNpb24uIChgaXNWZXJzaW9uU3VwcG9ydGVkYCBjYWNoZXMgdGhlIHJlc3BvbnNlLCBzbyB0aGlzIGxvb3Agd2lsbFxuICAgICAgICAgICAgLy8gb25seSBtYWtlIGEgc2luZ2xlIEhUVFAgcmVxdWVzdCkuXG4gICAgICAgICAgICAvLyBOb3RlIHRoYXQgYWx0aG91Z2ggd2UgZG8gdGhpcyBvbiBhIHJlY29ubmVjdCwgd2UgY2FjaGUgdGhlIHNlcnZlcidzIHZlcnNpb25zIGluIG1lbW9yeVxuICAgICAgICAgICAgLy8gaW5kZWZpbml0ZWx5LCBzbyBpdCB3aWxsIG9ubHkgZXZlciB0cmlnZ2VyIHRoZSB0b2FzdCBvbiB0aGUgZmlyc3QgY29ubmVjdGlvbiBhZnRlciBhIGZyZXNoXG4gICAgICAgICAgICAvLyByZXN0YXJ0IG9mIHRoZSBjbGllbnQuXG4gICAgICAgICAgICBpZiAoYXdhaXQgY2xpZW50LmlzVmVyc2lvblN1cHBvcnRlZCh2ZXJzaW9uKSkge1xuICAgICAgICAgICAgICAgIC8vIHdlIGZvdW5kIGEgY29tcGF0aWJsZSBzcGVjIHZlcnNpb25cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGlzIGlzIHJldHJvc3BlY3RpdmUgZG9jIGhhdmluZyBkZWJhdGVkIGFib3V0IHRoZSBleGFjdGx5IHdoYXQgdGhpcyB0b2FzdCBpcyBmb3IsIGJ1dFxuICAgICAgICAvLyBvdXIgZ3Vlc3MgaXMgdGhhdCBpdCdzIGEgbnVkZ2UgdG8gdXBkYXRlLCBvciBhc2sgeW91ciBIUyBhZG1pbiB0byB1cGRhdGUgeW91ciBIb21lc2VydmVyXG4gICAgICAgIC8vIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgRWxlbWVudCBoYXMgY29tZSBvdXQsIGluIGEgd2F5IHRoYXQgZG9lc24ndCBsb2NrIHlvdSBvdXQgb2YgYWxsXG4gICAgICAgIC8vIHlvdXIgbWVzc2FnZXMuXG4gICAgICAgIGNvbnN0IHRvYXN0S2V5ID0gXCJMRUdBQ1lfU0VSVkVSXCI7XG4gICAgICAgIFRvYXN0U3RvcmUuc2hhcmVkSW5zdGFuY2UoKS5hZGRPclJlcGxhY2VUb2FzdCh7XG4gICAgICAgICAgICBrZXk6IHRvYXN0S2V5LFxuICAgICAgICAgICAgdGl0bGU6IF90KFwidW5zdXBwb3J0ZWRfc2VydmVyX3RpdGxlXCIpLFxuICAgICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogX3QoXCJ1bnN1cHBvcnRlZF9zZXJ2ZXJfZGVzY3JpcHRpb25cIiwge1xuICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiBNSU5JTVVNX01BVFJJWF9WRVJTSU9OLFxuICAgICAgICAgICAgICAgICAgICBicmFuZDogU2RrQ29uZmlnLmdldCgpLmJyYW5kLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHByaW1hcnlMYWJlbDogX3QoXCJhY3Rpb258b2tcIiksXG4gICAgICAgICAgICAgICAgb25QcmltYXJ5Q2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgVG9hc3RTdG9yZS5zaGFyZWRJbnN0YW5jZSgpLmRpc21pc3NUb2FzdCh0b2FzdEtleSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wb25lbnQ6IEdlbmVyaWNUb2FzdCxcbiAgICAgICAgICAgIHByaW9yaXR5OiA5OCxcbiAgICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIud2FybihcIkZhaWxlZCB0byBjaGVjayBzZXJ2ZXIgdmVyc2lvbnNcIiwgZSk7XG4gICAgfVxufVxuXG5sZXQgc2luZ2xldG9uTGlmZWN5Y2xlU3RvcmU6IExpZmVjeWNsZVN0b3JlIHwgbnVsbCA9IG51bGw7XG5pZiAoIXNpbmdsZXRvbkxpZmVjeWNsZVN0b3JlKSB7XG4gICAgc2luZ2xldG9uTGlmZWN5Y2xlU3RvcmUgPSBuZXcgTGlmZWN5Y2xlU3RvcmUoKTtcbn1cbmV4cG9ydCBkZWZhdWx0IHNpbmdsZXRvbkxpZmVjeWNsZVN0b3JlITtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQVFBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLGVBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUYsT0FBQTtBQUVBLElBQUFHLFFBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUwsT0FBQTtBQUdBLElBQUFNLFdBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLGdCQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxXQUFBLEdBQUFILHNCQUFBLENBQUFMLE9BQUE7QUFDQSxJQUFBUyxnQkFBQSxHQUFBVCxPQUFBO0FBQ0EsSUFBQVUsVUFBQSxHQUFBTCxzQkFBQSxDQUFBTCxPQUFBO0FBQ0EsSUFBQVcsYUFBQSxHQUFBTixzQkFBQSxDQUFBTCxPQUFBO0FBckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQXFCQSxNQUFNWSxhQUFxQixHQUFHO0VBQzFCQyxjQUFjLEVBQUU7QUFDcEIsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTUMsY0FBYyxTQUFTQyxzQkFBVSxDQUFTO0VBQ3JDQyxXQUFXQSxDQUFBLEVBQUc7SUFDakIsS0FBSyxDQUFDQyxtQkFBRyxFQUFFTCxhQUFhLENBQUM7RUFDN0I7RUFFVU0sVUFBVUEsQ0FBQ0MsT0FBa0UsRUFBUTtJQUMzRixRQUFRQSxPQUFPLENBQUNDLE1BQU07TUFDbEIsS0FBS0MsZUFBTSxDQUFDQyxtQkFBbUI7UUFDM0IsSUFBSSxDQUFDQyxXQUFXLENBQUM7VUFDYlYsY0FBYyxFQUFFTSxPQUFPLENBQUNLO1FBQzVCLENBQUMsQ0FBQztRQUNGO01BQ0osS0FBSyw0QkFBNEI7UUFDN0IsSUFBSSxDQUFDRCxXQUFXLENBQUM7VUFDYlYsY0FBYyxFQUFFO1FBQ3BCLENBQUMsQ0FBQztRQUNGO01BQ0osS0FBSyxvQkFBb0I7UUFBRTtVQUN2QixJQUFJTSxPQUFPLENBQUNNLEtBQUssS0FBS0MsaUJBQVMsQ0FBQ0MsT0FBTyxJQUFJUixPQUFPLENBQUNTLFNBQVMsS0FBS0YsaUJBQVMsQ0FBQ0MsT0FBTyxFQUFFO1lBQ2hGO1lBQ0E7WUFDQUUsbUJBQW1CLENBQUMsQ0FBQztVQUN6QjtVQUVBLElBQUlWLE9BQU8sQ0FBQ00sS0FBSyxLQUFLLFVBQVUsRUFBRTtZQUM5QjtVQUNKO1VBQ0EsSUFBSSxDQUFDLElBQUksQ0FBQ0EsS0FBSyxDQUFDWixjQUFjLEVBQUU7VUFDaEMsTUFBTUEsY0FBYyxHQUFHaUIsTUFBTSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDTixLQUFLLENBQUNaLGNBQWMsQ0FBQztVQUNuRSxJQUFJLENBQUNVLFdBQVcsQ0FBQztZQUNiVixjQUFjLEVBQUU7VUFDcEIsQ0FBQyxDQUFDO1VBQ0ZJLG1CQUFHLENBQUNlLFFBQVEsQ0FBQ25CLGNBQWMsQ0FBQztVQUM1QjtRQUNKO01BQ0EsS0FBSyxzQkFBc0I7TUFDM0IsS0FBS1EsZUFBTSxDQUFDWSxXQUFXO1FBQ25CLElBQUksQ0FBQ0MsS0FBSyxDQUFDLENBQUM7UUFDWjtJQUNSO0VBQ0o7QUFDSjtBQUVBLGVBQWVMLG1CQUFtQkEsQ0FBQSxFQUFrQjtFQUNoRCxJQUFJO0lBQ0EsTUFBTU0sTUFBTSxHQUFHQyxnQ0FBZSxDQUFDQyxHQUFHLENBQUMsQ0FBQztJQUNwQyxJQUFJLENBQUNGLE1BQU0sRUFBRTtJQUNiLEtBQUssTUFBTUcsT0FBTyxJQUFJQyx5Q0FBeUIsRUFBRTtNQUM3QztNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0EsSUFBSSxNQUFNSixNQUFNLENBQUNLLGtCQUFrQixDQUFDRixPQUFPLENBQUMsRUFBRTtRQUMxQztRQUNBO01BQ0o7SUFDSjs7SUFFQTtJQUNBO0lBQ0E7SUFDQTtJQUNBLE1BQU1HLFFBQVEsR0FBRyxlQUFlO0lBQ2hDQyxtQkFBVSxDQUFDQyxjQUFjLENBQUMsQ0FBQyxDQUFDQyxpQkFBaUIsQ0FBQztNQUMxQ0MsR0FBRyxFQUFFSixRQUFRO01BQ2JLLEtBQUssRUFBRSxJQUFBQyxtQkFBRSxFQUFDLDBCQUEwQixDQUFDO01BQ3JDQyxLQUFLLEVBQUU7UUFDSEMsV0FBVyxFQUFFLElBQUFGLG1CQUFFLEVBQUMsZ0NBQWdDLEVBQUU7VUFDOUNULE9BQU8sRUFBRVksc0NBQXNCO1VBQy9CQyxLQUFLLEVBQUVDLGtCQUFTLENBQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUNjO1FBQzNCLENBQUMsQ0FBQztRQUNGRSxZQUFZLEVBQUUsSUFBQU4sbUJBQUUsRUFBQyxXQUFXLENBQUM7UUFDN0JPLGNBQWMsRUFBRUEsQ0FBQSxLQUFNO1VBQ2xCWixtQkFBVSxDQUFDQyxjQUFjLENBQUMsQ0FBQyxDQUFDWSxZQUFZLENBQUNkLFFBQVEsQ0FBQztRQUN0RDtNQUNKLENBQUM7TUFDRGUsU0FBUyxFQUFFQyxxQkFBWTtNQUN2QkMsUUFBUSxFQUFFO0lBQ2QsQ0FBQyxDQUFDO0VBQ04sQ0FBQyxDQUFDLE9BQU9DLENBQUMsRUFBRTtJQUNSQyxjQUFNLENBQUNDLElBQUksQ0FBQyxpQ0FBaUMsRUFBRUYsQ0FBQyxDQUFDO0VBQ3JEO0FBQ0o7QUFFQSxJQUFJRyx1QkFBOEMsR0FBRyxJQUFJO0FBQ3pELElBQUksQ0FBQ0EsdUJBQXVCLEVBQUU7RUFDMUJBLHVCQUF1QixHQUFHLElBQUloRCxjQUFjLENBQUMsQ0FBQztBQUNsRDtBQUFDLElBQUFpRCxRQUFBLEdBQUFDLE9BQUEsQ0FBQUMsT0FBQSxHQUNjSCx1QkFBdUIiLCJpZ25vcmVMaXN0IjpbXX0=