matrix-react-sdk
Version:
SDK for matrix.org using React
161 lines (155 loc) • 22.8 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.AbortedIdentityActionError = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _logger = require("matrix-js-sdk/src/logger");
var _MatrixClientPeg = require("./MatrixClientPeg");
var _Modal = _interopRequireDefault(require("./Modal"));
var _languageHandler = require("./languageHandler");
var _Terms = require("./Terms");
var _IdentityServerUtils = require("./utils/IdentityServerUtils");
var _QuestionDialog = _interopRequireDefault(require("./components/views/dialogs/QuestionDialog"));
var _UrlUtils = require("./utils/UrlUtils");
/*
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.
*/
class AbortedIdentityActionError extends Error {}
exports.AbortedIdentityActionError = AbortedIdentityActionError;
class IdentityAuthClient {
/**
* Creates a new identity auth client
* @param {string} identityUrl The URL to contact the identity server with.
* When provided, this class will operate solely within memory, refusing to
* persist any information such as tokens. Default null (not provided).
*/
constructor(identityUrl) {
(0, _defineProperty2.default)(this, "accessToken", null);
(0, _defineProperty2.default)(this, "tempClient", void 0);
(0, _defineProperty2.default)(this, "authEnabled", true);
if (identityUrl) {
// XXX: We shouldn't have to create a whole new MatrixClient just to
// do identity server auth. The functions don't take an identity URL
// though, and making all of them take one could lead to developer
// confusion about what the idBaseUrl does on a client. Therefore, we
// just make a new client and live with it.
this.tempClient = (0, _matrix.createClient)({
baseUrl: "",
// invalid by design
idBaseUrl: identityUrl
});
}
}
// This client must not be used for general operations as it may not have a baseUrl or be running (tempClient).
get identityClient() {
return this.tempClient ?? this.matrixClient;
}
get matrixClient() {
return _MatrixClientPeg.MatrixClientPeg.safeGet();
}
writeToken() {
if (this.tempClient) return; // temporary client: ignore
if (this.accessToken) {
window.localStorage.setItem("mx_is_access_token", this.accessToken);
} else {
window.localStorage.removeItem("mx_is_access_token");
}
}
readToken() {
if (this.tempClient) return null; // temporary client: ignore
return window.localStorage.getItem("mx_is_access_token");
}
// Returns a promise that resolves to the access_token string from the IS
async getAccessToken({
check = true
} = {}) {
if (!this.authEnabled) {
// The current IS doesn't support authentication
return null;
}
let token = this.accessToken;
if (!token) {
token = this.readToken();
}
if (!token) {
token = await this.registerForToken(check);
if (token) {
this.accessToken = token;
this.writeToken();
}
return token;
}
if (check) {
try {
await this.checkToken(token);
} catch (e) {
if (e instanceof _Terms.TermsNotSignedError || e instanceof AbortedIdentityActionError) {
// Retrying won't help this
throw e;
}
// Retry in case token expired
token = await this.registerForToken();
if (token) {
this.accessToken = token;
this.writeToken();
}
}
}
return token;
}
async checkToken(token) {
const identityServerUrl = this.identityClient.getIdentityServerUrl();
try {
await this.identityClient.getIdentityAccount(token);
} catch (e) {
if (e instanceof _matrix.MatrixError && e.errcode === "M_TERMS_NOT_SIGNED") {
_logger.logger.log("Identity server requires new terms to be agreed to");
await (0, _Terms.startTermsFlow)(this.matrixClient, [new _Terms.Service(_matrix.SERVICE_TYPES.IS, identityServerUrl, token)]);
return;
}
throw e;
}
if (!this.tempClient && !(0, _IdentityServerUtils.doesAccountDataHaveIdentityServer)(this.matrixClient) && !(await (0, _IdentityServerUtils.doesIdentityServerHaveTerms)(this.matrixClient, identityServerUrl))) {
const {
finished
} = _Modal.default.createDialog(_QuestionDialog.default, {
title: (0, _languageHandler._t)("terms|identity_server_no_terms_title"),
description: /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("terms|identity_server_no_terms_description_1", {}, {
server: () => /*#__PURE__*/_react.default.createElement("strong", null, (0, _UrlUtils.abbreviateUrl)(identityServerUrl))
})), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("terms|identity_server_no_terms_description_2"))),
button: (0, _languageHandler._t)("action|trust")
});
const [confirmed] = await finished;
if (confirmed) {
(0, _IdentityServerUtils.setToDefaultIdentityServer)(this.matrixClient);
} else {
throw new AbortedIdentityActionError("User aborted identity server action without terms");
}
}
// We should ensure the token in `localStorage` is cleared
// appropriately. We already clear storage on sign out, but we'll need
// additional clearing when changing ISes in settings as part of future
// privacy work.
// See also https://github.com/vector-im/element-web/issues/10455.
}
async registerForToken(check = true) {
const hsOpenIdToken = await _MatrixClientPeg.MatrixClientPeg.safeGet().getOpenIdToken();
// XXX: The spec is `token`, but we used `access_token` for a Sydent release.
const {
access_token: accessToken,
token
} = await this.identityClient.registerWithIdentityServer(hsOpenIdToken);
const identityAccessToken = token ? token : accessToken;
if (check) await this.checkToken(identityAccessToken);
return identityAccessToken;
}
}
exports.default = IdentityAuthClient;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tYXRyaXgiLCJfbG9nZ2VyIiwiX01hdHJpeENsaWVudFBlZyIsIl9Nb2RhbCIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfVGVybXMiLCJfSWRlbnRpdHlTZXJ2ZXJVdGlscyIsIl9RdWVzdGlvbkRpYWxvZyIsIl9VcmxVdGlscyIsIkFib3J0ZWRJZGVudGl0eUFjdGlvbkVycm9yIiwiRXJyb3IiLCJleHBvcnRzIiwiSWRlbnRpdHlBdXRoQ2xpZW50IiwiY29uc3RydWN0b3IiLCJpZGVudGl0eVVybCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwidGVtcENsaWVudCIsImNyZWF0ZUNsaWVudCIsImJhc2VVcmwiLCJpZEJhc2VVcmwiLCJpZGVudGl0eUNsaWVudCIsIm1hdHJpeENsaWVudCIsIk1hdHJpeENsaWVudFBlZyIsInNhZmVHZXQiLCJ3cml0ZVRva2VuIiwiYWNjZXNzVG9rZW4iLCJ3aW5kb3ciLCJsb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwicmVtb3ZlSXRlbSIsInJlYWRUb2tlbiIsImdldEl0ZW0iLCJnZXRBY2Nlc3NUb2tlbiIsImNoZWNrIiwiYXV0aEVuYWJsZWQiLCJ0b2tlbiIsInJlZ2lzdGVyRm9yVG9rZW4iLCJjaGVja1Rva2VuIiwiZSIsIlRlcm1zTm90U2lnbmVkRXJyb3IiLCJpZGVudGl0eVNlcnZlclVybCIsImdldElkZW50aXR5U2VydmVyVXJsIiwiZ2V0SWRlbnRpdHlBY2NvdW50IiwiTWF0cml4RXJyb3IiLCJlcnJjb2RlIiwibG9nZ2VyIiwibG9nIiwic3RhcnRUZXJtc0Zsb3ciLCJTZXJ2aWNlIiwiU0VSVklDRV9UWVBFUyIsIklTIiwiZG9lc0FjY291bnREYXRhSGF2ZUlkZW50aXR5U2VydmVyIiwiZG9lc0lkZW50aXR5U2VydmVySGF2ZVRlcm1zIiwiZmluaXNoZWQiLCJNb2RhbCIsImNyZWF0ZURpYWxvZyIsIlF1ZXN0aW9uRGlhbG9nIiwidGl0bGUiLCJfdCIsImRlc2NyaXB0aW9uIiwiY3JlYXRlRWxlbWVudCIsInNlcnZlciIsImFiYnJldmlhdGVVcmwiLCJidXR0b24iLCJjb25maXJtZWQiLCJzZXRUb0RlZmF1bHRJZGVudGl0eVNlcnZlciIsImhzT3BlbklkVG9rZW4iLCJnZXRPcGVuSWRUb2tlbiIsImFjY2Vzc190b2tlbiIsInJlZ2lzdGVyV2l0aElkZW50aXR5U2VydmVyIiwiaWRlbnRpdHlBY2Nlc3NUb2tlbiJdLCJzb3VyY2VzIjpbIi4uL3NyYy9JZGVudGl0eUF1dGhDbGllbnQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE5IFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFNFUlZJQ0VfVFlQRVMsIGNyZWF0ZUNsaWVudCwgTWF0cml4Q2xpZW50LCBNYXRyaXhFcnJvciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcblxuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSBcIi4vTWF0cml4Q2xpZW50UGVnXCI7XG5pbXBvcnQgTW9kYWwgZnJvbSBcIi4vTW9kYWxcIjtcbmltcG9ydCB7IF90IH0gZnJvbSBcIi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgeyBTZXJ2aWNlLCBzdGFydFRlcm1zRmxvdywgVGVybXNOb3RTaWduZWRFcnJvciB9IGZyb20gXCIuL1Rlcm1zXCI7XG5pbXBvcnQge1xuICAgIGRvZXNBY2NvdW50RGF0YUhhdmVJZGVudGl0eVNlcnZlcixcbiAgICBkb2VzSWRlbnRpdHlTZXJ2ZXJIYXZlVGVybXMsXG4gICAgc2V0VG9EZWZhdWx0SWRlbnRpdHlTZXJ2ZXIsXG59IGZyb20gXCIuL3V0aWxzL0lkZW50aXR5U2VydmVyVXRpbHNcIjtcbmltcG9ydCBRdWVzdGlvbkRpYWxvZyBmcm9tIFwiLi9jb21wb25lbnRzL3ZpZXdzL2RpYWxvZ3MvUXVlc3Rpb25EaWFsb2dcIjtcbmltcG9ydCB7IGFiYnJldmlhdGVVcmwgfSBmcm9tIFwiLi91dGlscy9VcmxVdGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgQWJvcnRlZElkZW50aXR5QWN0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJZGVudGl0eUF1dGhDbGllbnQge1xuICAgIHByaXZhdGUgYWNjZXNzVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgdGVtcENsaWVudD86IE1hdHJpeENsaWVudDtcbiAgICBwcml2YXRlIGF1dGhFbmFibGVkID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgYXV0aCBjbGllbnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWRlbnRpdHlVcmwgVGhlIFVSTCB0byBjb250YWN0IHRoZSBpZGVudGl0eSBzZXJ2ZXIgd2l0aC5cbiAgICAgKiBXaGVuIHByb3ZpZGVkLCB0aGlzIGNsYXNzIHdpbGwgb3BlcmF0ZSBzb2xlbHkgd2l0aGluIG1lbW9yeSwgcmVmdXNpbmcgdG9cbiAgICAgKiBwZXJzaXN0IGFueSBpbmZvcm1hdGlvbiBzdWNoIGFzIHRva2Vucy4gRGVmYXVsdCBudWxsIChub3QgcHJvdmlkZWQpLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihpZGVudGl0eVVybD86IHN0cmluZykge1xuICAgICAgICBpZiAoaWRlbnRpdHlVcmwpIHtcbiAgICAgICAgICAgIC8vIFhYWDogV2Ugc2hvdWxkbid0IGhhdmUgdG8gY3JlYXRlIGEgd2hvbGUgbmV3IE1hdHJpeENsaWVudCBqdXN0IHRvXG4gICAgICAgICAgICAvLyBkbyBpZGVudGl0eSBzZXJ2ZXIgYXV0aC4gVGhlIGZ1bmN0aW9ucyBkb24ndCB0YWtlIGFuIGlkZW50aXR5IFVSTFxuICAgICAgICAgICAgLy8gdGhvdWdoLCBhbmQgbWFraW5nIGFsbCBvZiB0aGVtIHRha2Ugb25lIGNvdWxkIGxlYWQgdG8gZGV2ZWxvcGVyXG4gICAgICAgICAgICAvLyBjb25mdXNpb24gYWJvdXQgd2hhdCB0aGUgaWRCYXNlVXJsIGRvZXMgb24gYSBjbGllbnQuIFRoZXJlZm9yZSwgd2VcbiAgICAgICAgICAgIC8vIGp1c3QgbWFrZSBhIG5ldyBjbGllbnQgYW5kIGxpdmUgd2l0aCBpdC5cbiAgICAgICAgICAgIHRoaXMudGVtcENsaWVudCA9IGNyZWF0ZUNsaWVudCh7XG4gICAgICAgICAgICAgICAgYmFzZVVybDogXCJcIiwgLy8gaW52YWxpZCBieSBkZXNpZ25cbiAgICAgICAgICAgICAgICBpZEJhc2VVcmw6IGlkZW50aXR5VXJsLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGlzIGNsaWVudCBtdXN0IG5vdCBiZSB1c2VkIGZvciBnZW5lcmFsIG9wZXJhdGlvbnMgYXMgaXQgbWF5IG5vdCBoYXZlIGEgYmFzZVVybCBvciBiZSBydW5uaW5nICh0ZW1wQ2xpZW50KS5cbiAgICBwcml2YXRlIGdldCBpZGVudGl0eUNsaWVudCgpOiBNYXRyaXhDbGllbnQge1xuICAgICAgICByZXR1cm4gdGhpcy50ZW1wQ2xpZW50ID8/IHRoaXMubWF0cml4Q2xpZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IG1hdHJpeENsaWVudCgpOiBNYXRyaXhDbGllbnQge1xuICAgICAgICByZXR1cm4gTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlVG9rZW4oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnRlbXBDbGllbnQpIHJldHVybjsgLy8gdGVtcG9yYXJ5IGNsaWVudDogaWdub3JlXG4gICAgICAgIGlmICh0aGlzLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJteF9pc19hY2Nlc3NfdG9rZW5cIiwgdGhpcy5hY2Nlc3NUb2tlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJteF9pc19hY2Nlc3NfdG9rZW5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRUb2tlbigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMudGVtcENsaWVudCkgcmV0dXJuIG51bGw7IC8vIHRlbXBvcmFyeSBjbGllbnQ6IGlnbm9yZVxuICAgICAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFwibXhfaXNfYWNjZXNzX3Rva2VuXCIpO1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGFjY2Vzc190b2tlbiBzdHJpbmcgZnJvbSB0aGUgSVNcbiAgICBwdWJsaWMgYXN5bmMgZ2V0QWNjZXNzVG9rZW4oeyBjaGVjayA9IHRydWUgfSA9IHt9KTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgICAgIGlmICghdGhpcy5hdXRoRW5hYmxlZCkge1xuICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgSVMgZG9lc24ndCBzdXBwb3J0IGF1dGhlbnRpY2F0aW9uXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0b2tlbjogc3RyaW5nIHwgbnVsbCA9IHRoaXMuYWNjZXNzVG9rZW47XG4gICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgIHRva2VuID0gdGhpcy5yZWFkVG9rZW4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgIHRva2VuID0gYXdhaXQgdGhpcy5yZWdpc3RlckZvclRva2VuKGNoZWNrKTtcbiAgICAgICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlVG9rZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGVjaykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrVG9rZW4odG9rZW4pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgVGVybXNOb3RTaWduZWRFcnJvciB8fCBlIGluc3RhbmNlb2YgQWJvcnRlZElkZW50aXR5QWN0aW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmV0cnlpbmcgd29uJ3QgaGVscCB0aGlzXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFJldHJ5IGluIGNhc2UgdG9rZW4gZXhwaXJlZFxuICAgICAgICAgICAgICAgIHRva2VuID0gYXdhaXQgdGhpcy5yZWdpc3RlckZvclRva2VuKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZVRva2VuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY2hlY2tUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGlkZW50aXR5U2VydmVyVXJsID0gdGhpcy5pZGVudGl0eUNsaWVudC5nZXRJZGVudGl0eVNlcnZlclVybCgpITtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5pZGVudGl0eUNsaWVudC5nZXRJZGVudGl0eUFjY291bnQodG9rZW4pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIE1hdHJpeEVycm9yICYmIGUuZXJyY29kZSA9PT0gXCJNX1RFUk1TX05PVF9TSUdORURcIikge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coXCJJZGVudGl0eSBzZXJ2ZXIgcmVxdWlyZXMgbmV3IHRlcm1zIHRvIGJlIGFncmVlZCB0b1wiKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBzdGFydFRlcm1zRmxvdyh0aGlzLm1hdHJpeENsaWVudCwgW25ldyBTZXJ2aWNlKFNFUlZJQ0VfVFlQRVMuSVMsIGlkZW50aXR5U2VydmVyVXJsLCB0b2tlbildKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMudGVtcENsaWVudCAmJlxuICAgICAgICAgICAgIWRvZXNBY2NvdW50RGF0YUhhdmVJZGVudGl0eVNlcnZlcih0aGlzLm1hdHJpeENsaWVudCkgJiZcbiAgICAgICAgICAgICEoYXdhaXQgZG9lc0lkZW50aXR5U2VydmVySGF2ZVRlcm1zKHRoaXMubWF0cml4Q2xpZW50LCBpZGVudGl0eVNlcnZlclVybCkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgeyBmaW5pc2hlZCB9ID0gTW9kYWwuY3JlYXRlRGlhbG9nKFF1ZXN0aW9uRGlhbG9nLCB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IF90KFwidGVybXN8aWRlbnRpdHlfc2VydmVyX25vX3Rlcm1zX3RpdGxlXCIpLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7X3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidGVybXN8aWRlbnRpdHlfc2VydmVyX25vX3Rlcm1zX2Rlc2NyaXB0aW9uXzFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcjogKCkgPT4gPHN0cm9uZz57YWJicmV2aWF0ZVVybChpZGVudGl0eVNlcnZlclVybCl9PC9zdHJvbmc+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cD57X3QoXCJ0ZXJtc3xpZGVudGl0eV9zZXJ2ZXJfbm9fdGVybXNfZGVzY3JpcHRpb25fMlwiKX08L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgYnV0dG9uOiBfdChcImFjdGlvbnx0cnVzdFwiKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgW2NvbmZpcm1lZF0gPSBhd2FpdCBmaW5pc2hlZDtcbiAgICAgICAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgICAgICAgICBzZXRUb0RlZmF1bHRJZGVudGl0eVNlcnZlcih0aGlzLm1hdHJpeENsaWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBYm9ydGVkSWRlbnRpdHlBY3Rpb25FcnJvcihcIlVzZXIgYWJvcnRlZCBpZGVudGl0eSBzZXJ2ZXIgYWN0aW9uIHdpdGhvdXQgdGVybXNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBzaG91bGQgZW5zdXJlIHRoZSB0b2tlbiBpbiBgbG9jYWxTdG9yYWdlYCBpcyBjbGVhcmVkXG4gICAgICAgIC8vIGFwcHJvcHJpYXRlbHkuIFdlIGFscmVhZHkgY2xlYXIgc3RvcmFnZSBvbiBzaWduIG91dCwgYnV0IHdlJ2xsIG5lZWRcbiAgICAgICAgLy8gYWRkaXRpb25hbCBjbGVhcmluZyB3aGVuIGNoYW5naW5nIElTZXMgaW4gc2V0dGluZ3MgYXMgcGFydCBvZiBmdXR1cmVcbiAgICAgICAgLy8gcHJpdmFjeSB3b3JrLlxuICAgICAgICAvLyBTZWUgYWxzbyBodHRwczovL2dpdGh1Yi5jb20vdmVjdG9yLWltL2VsZW1lbnQtd2ViL2lzc3Vlcy8xMDQ1NS5cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJGb3JUb2tlbihjaGVjayA9IHRydWUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBoc09wZW5JZFRva2VuID0gYXdhaXQgTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5nZXRPcGVuSWRUb2tlbigpO1xuICAgICAgICAvLyBYWFg6IFRoZSBzcGVjIGlzIGB0b2tlbmAsIGJ1dCB3ZSB1c2VkIGBhY2Nlc3NfdG9rZW5gIGZvciBhIFN5ZGVudCByZWxlYXNlLlxuICAgICAgICBjb25zdCB7IGFjY2Vzc190b2tlbjogYWNjZXNzVG9rZW4sIHRva2VuIH0gPVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pZGVudGl0eUNsaWVudC5yZWdpc3RlcldpdGhJZGVudGl0eVNlcnZlcihoc09wZW5JZFRva2VuKTtcbiAgICAgICAgY29uc3QgaWRlbnRpdHlBY2Nlc3NUb2tlbiA9IHRva2VuID8gdG9rZW4gOiBhY2Nlc3NUb2tlbjtcbiAgICAgICAgaWYgKGNoZWNrKSBhd2FpdCB0aGlzLmNoZWNrVG9rZW4oaWRlbnRpdHlBY2Nlc3NUb2tlbik7XG4gICAgICAgIHJldHVybiBpZGVudGl0eUFjY2Vzc1Rva2VuO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFRQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFFQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksTUFBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssZ0JBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLE1BQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLG9CQUFBLEdBQUFQLE9BQUE7QUFLQSxJQUFBUSxlQUFBLEdBQUFULHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUyxTQUFBLEdBQUFULE9BQUE7QUF0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBa0JPLE1BQU1VLDBCQUEwQixTQUFTQyxLQUFLLENBQUM7QUFBRUMsT0FBQSxDQUFBRiwwQkFBQSxHQUFBQSwwQkFBQTtBQUV6QyxNQUFNRyxrQkFBa0IsQ0FBQztFQUtwQztBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDV0MsV0FBV0EsQ0FBQ0MsV0FBb0IsRUFBRTtJQUFBLElBQUFDLGdCQUFBLENBQUFDLE9BQUEsdUJBVkosSUFBSTtJQUFBLElBQUFELGdCQUFBLENBQUFDLE9BQUE7SUFBQSxJQUFBRCxnQkFBQSxDQUFBQyxPQUFBLHVCQUVuQixJQUFJO0lBU3RCLElBQUlGLFdBQVcsRUFBRTtNQUNiO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQSxJQUFJLENBQUNHLFVBQVUsR0FBRyxJQUFBQyxvQkFBWSxFQUFDO1FBQzNCQyxPQUFPLEVBQUUsRUFBRTtRQUFFO1FBQ2JDLFNBQVMsRUFBRU47TUFDZixDQUFDLENBQUM7SUFDTjtFQUNKOztFQUVBO0VB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