matrix-react-sdk
Version:
SDK for matrix.org using React
192 lines (188 loc) • 34.6 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.ERROR_USER_CANCELLED = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _interactiveAuth = require("matrix-js-sdk/src/interactive-auth");
var _logger = require("matrix-js-sdk/src/logger");
var _InteractiveAuthEntryComponents = _interopRequireDefault(require("../views/auth/InteractiveAuthEntryComponents"));
var _Spinner = _interopRequireDefault(require("../views/elements/Spinner"));
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
/*
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 ERROR_USER_CANCELLED = exports.ERROR_USER_CANCELLED = new Error("User cancelled auth session");
class InteractiveAuthComponent extends _react.default.Component {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "authLogic", void 0);
(0, _defineProperty2.default)(this, "intervalId", null);
(0, _defineProperty2.default)(this, "stageComponent", /*#__PURE__*/(0, _react.createRef)());
(0, _defineProperty2.default)(this, "unmounted", false);
(0, _defineProperty2.default)(this, "requestEmailToken", async (email, secret, attempt, session) => {
this.setState({
busy: true
});
try {
// We know this method only gets called on flows where requestEmailToken is passed but types don't
return await this.props.requestEmailToken(email, secret, attempt, session);
} finally {
this.setState({
busy: false
});
}
});
(0, _defineProperty2.default)(this, "authStateUpdated", (stageType, stageState) => {
const oldStage = this.state.authStage;
this.setState({
busy: false,
authStage: stageType,
stageState: stageState,
errorText: stageState.error,
errorCode: stageState.errcode
}, () => {
if (oldStage !== stageType) {
this.setFocus();
} else if (!stageState.error) {
this.stageComponent.current?.attemptFailed?.();
}
});
});
(0, _defineProperty2.default)(this, "requestCallback", (auth, background) => {
// This wrapper just exists because the js-sdk passes a second
// 'busy' param for backwards compat. This throws the tests off
// so discard it here.
return this.props.makeRequest(auth);
});
(0, _defineProperty2.default)(this, "onBusyChanged", busy => {
// if we've started doing stuff, reset the error messages
// The JS SDK eagerly reports itself as "not busy" right after any
// immediate work has completed, but that's not really what we want at
// the UI layer, so we ignore this signal and show a spinner until
// there's a new screen to show the user. This is implemented by setting
// `busy: false` in `authStateUpdated`.
// See also https://github.com/vector-im/element-web/issues/12546
if (busy) {
this.setState({
busy: true,
errorText: undefined,
errorCode: undefined
});
}
// authStateUpdated is not called during sso flows
if (!busy && (this.state.authStage === _interactiveAuth.AuthType.Sso || this.state.authStage === _interactiveAuth.AuthType.SsoUnstable)) {
this.setState({
busy
});
}
});
(0, _defineProperty2.default)(this, "submitAuthDict", authData => {
this.authLogic.submitAuthDict(authData);
});
(0, _defineProperty2.default)(this, "onPhaseChange", newPhase => {
this.props.onStagePhaseChange?.(this.state.authStage ?? null, newPhase || 0);
});
(0, _defineProperty2.default)(this, "onStageCancel", async () => {
await this.props.onAuthFinished(false, ERROR_USER_CANCELLED);
});
(0, _defineProperty2.default)(this, "onAuthStageFailed", async e => {
await this.props.onAuthFinished(false, e);
});
(0, _defineProperty2.default)(this, "setEmailSid", sid => {
this.authLogic.setEmailSid(sid);
});
this.state = {
busy: false,
submitButtonEnabled: false
};
this.authLogic = new _interactiveAuth.InteractiveAuth({
authData: this.props.authData,
doRequest: this.requestCallback,
busyChanged: this.onBusyChanged,
inputs: this.props.inputs,
stateUpdated: this.authStateUpdated,
matrixClient: this.props.matrixClient,
sessionId: this.props.sessionId,
clientSecret: this.props.clientSecret,
emailSid: this.props.emailSid,
requestEmailToken: this.requestEmailToken,
supportedStages: [_interactiveAuth.AuthType.Password, _interactiveAuth.AuthType.Recaptcha, _interactiveAuth.AuthType.Email, _interactiveAuth.AuthType.Msisdn, _interactiveAuth.AuthType.Terms, _interactiveAuth.AuthType.RegistrationToken, _interactiveAuth.AuthType.UnstableRegistrationToken, _interactiveAuth.AuthType.Sso, _interactiveAuth.AuthType.SsoUnstable]
});
if (this.props.poll) {
this.intervalId = window.setInterval(() => {
this.authLogic.poll();
}, 2000);
}
}
componentDidMount() {
this.authLogic.attemptAuth().then(async result => {
const extra = {
emailSid: this.authLogic.getEmailSid(),
clientSecret: this.authLogic.getClientSecret()
};
await this.props.onAuthFinished(true, result, extra);
}).catch(async error => {
await this.props.onAuthFinished(false, error);
_logger.logger.error("Error during user-interactive auth:", error);
if (this.unmounted) {
return;
}
const msg = error.message || error.toString();
this.setState({
errorText: msg,
errorCode: error.errcode
});
});
}
componentWillUnmount() {
this.unmounted = true;
if (this.intervalId !== null) {
clearInterval(this.intervalId);
}
}
setFocus() {
this.stageComponent.current?.focus?.();
}
render() {
const stage = this.state.authStage;
if (!stage) {
if (this.state.busy) {
return /*#__PURE__*/_react.default.createElement(_Spinner.default, null);
} else {
return null;
}
}
const StageComponent = (0, _InteractiveAuthEntryComponents.default)(stage);
return /*#__PURE__*/_react.default.createElement(StageComponent, {
ref: this.stageComponent,
loginType: stage,
matrixClient: this.props.matrixClient,
authSessionId: this.authLogic.getSessionId(),
clientSecret: this.authLogic.getClientSecret(),
stageParams: this.authLogic.getStageParams(stage),
submitAuthDict: this.submitAuthDict,
errorText: this.state.errorText,
errorCode: this.state.errorCode,
busy: this.state.busy,
inputs: this.props.inputs,
stageState: this.state.stageState,
fail: this.onAuthStageFailed,
setEmailSid: this.setEmailSid,
showContinue: !this.props.continueIsManaged,
onPhaseChange: this.onPhaseChange,
requestEmailToken: this.authLogic.requestEmailToken,
continueText: this.props.continueText,
continueKind: this.props.continueKind,
onCancel: this.onStageCancel
});
}
}
exports.default = InteractiveAuthComponent;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfaW50ZXJhY3RpdmVBdXRoIiwiX2xvZ2dlciIsIl9JbnRlcmFjdGl2ZUF1dGhFbnRyeUNvbXBvbmVudHMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX1NwaW5uZXIiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJFUlJPUl9VU0VSX0NBTkNFTExFRCIsImV4cG9ydHMiLCJFcnJvciIsIkludGVyYWN0aXZlQXV0aENvbXBvbmVudCIsIlJlYWN0IiwiQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJjcmVhdGVSZWYiLCJlbWFpbCIsInNlY3JldCIsImF0dGVtcHQiLCJzZXNzaW9uIiwic2V0U3RhdGUiLCJidXN5IiwicmVxdWVzdEVtYWlsVG9rZW4iLCJzdGFnZVR5cGUiLCJzdGFnZVN0YXRlIiwib2xkU3RhZ2UiLCJzdGF0ZSIsImF1dGhTdGFnZSIsImVycm9yVGV4dCIsImVycm9yIiwiZXJyb3JDb2RlIiwiZXJyY29kZSIsInNldEZvY3VzIiwic3RhZ2VDb21wb25lbnQiLCJjdXJyZW50IiwiYXR0ZW1wdEZhaWxlZCIsImF1dGgiLCJiYWNrZ3JvdW5kIiwibWFrZVJlcXVlc3QiLCJ1bmRlZmluZWQiLCJBdXRoVHlwZSIsIlNzbyIsIlNzb1Vuc3RhYmxlIiwiYXV0aERhdGEiLCJhdXRoTG9naWMiLCJzdWJtaXRBdXRoRGljdCIsIm5ld1BoYXNlIiwib25TdGFnZVBoYXNlQ2hhbmdlIiwib25BdXRoRmluaXNoZWQiLCJzaWQiLCJzZXRFbWFpbFNpZCIsInN1Ym1pdEJ1dHRvbkVuYWJsZWQiLCJJbnRlcmFjdGl2ZUF1dGgiLCJkb1JlcXVlc3QiLCJyZXF1ZXN0Q2FsbGJhY2siLCJidXN5Q2hhbmdlZCIsIm9uQnVzeUNoYW5nZWQiLCJpbnB1dHMiLCJzdGF0ZVVwZGF0ZWQiLCJhdXRoU3RhdGVVcGRhdGVkIiwibWF0cml4Q2xpZW50Iiwic2Vzc2lvbklkIiwiY2xpZW50U2VjcmV0IiwiZW1haWxTaWQiLCJzdXBwb3J0ZWRTdGFnZXMiLCJQYXNzd29yZCIsIlJlY2FwdGNoYSIsIkVtYWlsIiwiTXNpc2RuIiwiVGVybXMiLCJSZWdpc3RyYXRpb25Ub2tlbiIsIlVuc3RhYmxlUmVnaXN0cmF0aW9uVG9rZW4iLCJwb2xsIiwiaW50ZXJ2YWxJZCIsIndpbmRvdyIsInNldEludGVydmFsIiwiY29tcG9uZW50RGlkTW91bnQiLCJhdHRlbXB0QXV0aCIsInRoZW4iLCJyZXN1bHQiLCJleHRyYSIsImdldEVtYWlsU2lkIiwiZ2V0Q2xpZW50U2VjcmV0IiwiY2F0Y2giLCJsb2dnZXIiLCJ1bm1vdW50ZWQiLCJtc2ciLCJtZXNzYWdlIiwidG9TdHJpbmciLCJjb21wb25lbnRXaWxsVW5tb3VudCIsImNsZWFySW50ZXJ2YWwiLCJmb2N1cyIsInJlbmRlciIsInN0YWdlIiwiY3JlYXRlRWxlbWVudCIsIlN0YWdlQ29tcG9uZW50IiwiZ2V0RW50cnlDb21wb25lbnRGb3JMb2dpblR5cGUiLCJyZWYiLCJsb2dpblR5cGUiLCJhdXRoU2Vzc2lvbklkIiwiZ2V0U2Vzc2lvbklkIiwic3RhZ2VQYXJhbXMiLCJnZXRTdGFnZVBhcmFtcyIsImZhaWwiLCJvbkF1dGhTdGFnZUZhaWxlZCIsInNob3dDb250aW51ZSIsImNvbnRpbnVlSXNNYW5hZ2VkIiwib25QaGFzZUNoYW5nZSIsImNvbnRpbnVlVGV4dCIsImNvbnRpbnVlS2luZCIsIm9uQ2FuY2VsIiwib25TdGFnZUNhbmNlbCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3N0cnVjdHVyZXMvSW50ZXJhY3RpdmVBdXRoLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxNy0yMDIxIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCwgeyBjcmVhdGVSZWYgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7XG4gICAgQXV0aFR5cGUsXG4gICAgSUF1dGhEYXRhLFxuICAgIEF1dGhEaWN0LFxuICAgIElJbnB1dHMsXG4gICAgSW50ZXJhY3RpdmVBdXRoLFxuICAgIElTdGFnZVN0YXR1cyxcbn0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2ludGVyYWN0aXZlLWF1dGhcIjtcbmltcG9ydCB7IE1hdHJpeENsaWVudCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcblxuaW1wb3J0IGdldEVudHJ5Q29tcG9uZW50Rm9yTG9naW5UeXBlLCB7XG4gICAgQ29udGludWVLaW5kLFxuICAgIEN1c3RvbUF1dGhUeXBlLFxuICAgIElTdGFnZUNvbXBvbmVudCxcbn0gZnJvbSBcIi4uL3ZpZXdzL2F1dGgvSW50ZXJhY3RpdmVBdXRoRW50cnlDb21wb25lbnRzXCI7XG5pbXBvcnQgU3Bpbm5lciBmcm9tIFwiLi4vdmlld3MvZWxlbWVudHMvU3Bpbm5lclwiO1xuXG5leHBvcnQgY29uc3QgRVJST1JfVVNFUl9DQU5DRUxMRUQgPSBuZXcgRXJyb3IoXCJVc2VyIGNhbmNlbGxlZCBhdXRoIHNlc3Npb25cIik7XG5cbnR5cGUgSW50ZXJhY3RpdmVBdXRoQ2FsbGJhY2tTdWNjZXNzPFQ+ID0gKFxuICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgcmVzcG9uc2U6IFQsXG4gICAgZXh0cmE/OiB7IGVtYWlsU2lkPzogc3RyaW5nOyBjbGllbnRTZWNyZXQ/OiBzdHJpbmcgfSxcbikgPT4gUHJvbWlzZTx2b2lkPjtcbnR5cGUgSW50ZXJhY3RpdmVBdXRoQ2FsbGJhY2tGYWlsdXJlID0gKHN1Y2Nlc3M6IGZhbHNlLCByZXNwb25zZTogSUF1dGhEYXRhIHwgRXJyb3IpID0+IFByb21pc2U8dm9pZD47XG5leHBvcnQgdHlwZSBJbnRlcmFjdGl2ZUF1dGhDYWxsYmFjazxUPiA9IEludGVyYWN0aXZlQXV0aENhbGxiYWNrU3VjY2VzczxUPiAmIEludGVyYWN0aXZlQXV0aENhbGxiYWNrRmFpbHVyZTtcblxuZXhwb3J0IGludGVyZmFjZSBJbnRlcmFjdGl2ZUF1dGhQcm9wczxUPiB7XG4gICAgLy8gbWF0cml4IGNsaWVudCB0byB1c2UgZm9yIFVJIGF1dGggcmVxdWVzdHNcbiAgICBtYXRyaXhDbGllbnQ6IE1hdHJpeENsaWVudDtcbiAgICAvLyByZXNwb25zZSBmcm9tIGluaXRpYWwgcmVxdWVzdC4gSWYgbm90IHN1cHBsaWVkLCB3aWxsIGRvIGEgcmVxdWVzdCBvbiBtb3VudC5cbiAgICBhdXRoRGF0YT86IElBdXRoRGF0YTtcbiAgICAvLyBJbnB1dHMgcHJvdmlkZWQgYnkgdGhlIHVzZXIgdG8gdGhlIGF1dGggcHJvY2Vzc1xuICAgIC8vIGFuZCB1c2VkIGJ5IHZhcmlvdXMgc3RhZ2VzLiBBcyBwYXNzZWQgdG8ganMtc2RrXG4gICAgLy8gaW50ZXJhY3RpdmUtYXV0aFxuICAgIGlucHV0cz86IElJbnB1dHM7XG4gICAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICAgIGNsaWVudFNlY3JldD86IHN0cmluZztcbiAgICBlbWFpbFNpZD86IHN0cmluZztcbiAgICAvLyBJZiB0cnVlLCBwb2xsIHRvIHNlZSBpZiB0aGUgYXV0aCBmbG93IGhhcyBiZWVuIGNvbXBsZXRlZCBvdXQtb2YtYmFuZFxuICAgIHBvbGw/OiBib29sZWFuO1xuICAgIC8vIElmIHRydWUsIGNvbXBvbmVudHMgd2lsbCBiZSB0b2xkIHRoYXQgdGhlICdDb250aW51ZScgYnV0dG9uXG4gICAgLy8gaXMgbWFuYWdlZCBieSBzb21lIG90aGVyIHBhcnR5IGFuZCBzaG91bGQgbm90IGJlIG1hbmFnZWQgYnlcbiAgICAvLyB0aGUgY29tcG9uZW50IGl0c2VsZi5cbiAgICBjb250aW51ZUlzTWFuYWdlZD86IGJvb2xlYW47XG4gICAgLy8gY29udGludWVUZXh0IGFuZCBjb250aW51ZUtpbmQgYXJlIHBhc3NlZCBzdHJhaWdodCB0aHJvdWdoIHRvIHRoZSBBdXRoRW50cnlDb21wb25lbnQuXG4gICAgY29udGludWVUZXh0Pzogc3RyaW5nO1xuICAgIGNvbnRpbnVlS2luZD86IENvbnRpbnVlS2luZDtcbiAgICAvLyBjYWxsYmFja1xuICAgIG1ha2VSZXF1ZXN0KGF1dGg6IEF1dGhEaWN0IHwgbnVsbCk6IFByb21pc2U8VD47XG4gICAgLy8gY2FsbGJhY2sgY2FsbGVkIHdoZW4gdGhlIGF1dGggcHJvY2VzcyBoYXMgZmluaXNoZWQsXG4gICAgLy8gc3VjY2Vzc2Z1bGx5IG9yIHVuc3VjY2Vzc2Z1bGx5LlxuICAgIC8vIEBwYXJhbSB7Ym9vbGVhbn0gc3RhdHVzIFRydWUgaWYgdGhlIG9wZXJhdGlvbiByZXF1aXJpbmdcbiAgICAvLyAgICAgYXV0aCB3YXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgZmFsc2UgaWYgY2FuY2VsZWQuXG4gICAgLy8gQHBhcmFtIHtvYmplY3R9IHJlc3VsdCBUaGUgcmVzdWx0IG9mIHRoZSBhdXRoZW50aWNhdGVkIGNhbGxcbiAgICAvLyAgICAgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIHRoZSBlcnJvciBvYmplY3QuXG4gICAgLy8gQHBhcmFtIHtvYmplY3R9IGV4dHJhIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFVJIEF1dGhcbiAgICAvLyAgICAgcHJvY2VzczpcbiAgICAvLyAgICAgICogZW1haWxTaWQge3N0cmluZ30gSWYgZW1haWwgYXV0aCB3YXMgcGVyZm9ybWVkLCB0aGUgc2lkIG9mXG4gICAgLy8gICAgICAgICAgICB0aGUgYXV0aCBzZXNzaW9uLlxuICAgIC8vICAgICAgKiBjbGllbnRTZWNyZXQge3N0cmluZ30gVGhlIGNsaWVudCBzZWNyZXQgdXNlZCBpbiBhdXRoXG4gICAgLy8gICAgICAgICAgICBzZXNzaW9ucyB3aXRoIHRoZSBJRCBzZXJ2ZXIuXG4gICAgb25BdXRoRmluaXNoZWQ6IEludGVyYWN0aXZlQXV0aENhbGxiYWNrPFQ+O1xuICAgIC8vIEFzIGpzLXNkayBpbnRlcmFjdGl2ZS1hdXRoXG4gICAgcmVxdWVzdEVtYWlsVG9rZW4/KGVtYWlsOiBzdHJpbmcsIHNlY3JldDogc3RyaW5nLCBhdHRlbXB0OiBudW1iZXIsIHNlc3Npb246IHN0cmluZyk6IFByb21pc2U8eyBzaWQ6IHN0cmluZyB9PjtcbiAgICAvLyBDYWxsZWQgd2hlbiB0aGUgc3RhZ2UgY2hhbmdlcywgb3IgdGhlIHN0YWdlJ3MgcGhhc2UgY2hhbmdlcy4gRmlyc3RcbiAgICAvLyBhcmd1bWVudCBpcyB0aGUgc3RhZ2UsIHNlY29uZCBpcyB0aGUgcGhhc2UuIFNvbWUgc3RhZ2VzIGRvIG5vdCBoYXZlXG4gICAgLy8gcGhhc2VzIGFuZCB3aWxsIGJlIGNvdW50ZWQgYXMgMCAobnVtZXJpYykuXG4gICAgb25TdGFnZVBoYXNlQ2hhbmdlPyhzdGFnZTogQXV0aFR5cGUgfCBDdXN0b21BdXRoVHlwZSB8IG51bGwsIHBoYXNlOiBudW1iZXIpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBhdXRoU3RhZ2U/OiBDdXN0b21BdXRoVHlwZSB8IEF1dGhUeXBlO1xuICAgIHN0YWdlU3RhdGU/OiBJU3RhZ2VTdGF0dXM7XG4gICAgYnVzeTogYm9vbGVhbjtcbiAgICBlcnJvclRleHQ/OiBzdHJpbmc7XG4gICAgZXJyb3JDb2RlPzogc3RyaW5nO1xuICAgIHN1Ym1pdEJ1dHRvbkVuYWJsZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEludGVyYWN0aXZlQXV0aENvbXBvbmVudDxUPiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxJbnRlcmFjdGl2ZUF1dGhQcm9wczxUPiwgSVN0YXRlPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBhdXRoTG9naWM6IEludGVyYWN0aXZlQXV0aDxUPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGludGVydmFsSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhZ2VDb21wb25lbnQgPSBjcmVhdGVSZWY8SVN0YWdlQ29tcG9uZW50PigpO1xuXG4gICAgcHJpdmF0ZSB1bm1vdW50ZWQgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogSW50ZXJhY3RpdmVBdXRoUHJvcHM8VD4pIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBidXN5OiBmYWxzZSxcbiAgICAgICAgICAgIHN1Ym1pdEJ1dHRvbkVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuYXV0aExvZ2ljID0gbmV3IEludGVyYWN0aXZlQXV0aDxUPih7XG4gICAgICAgICAgICBhdXRoRGF0YTogdGhpcy5wcm9wcy5hdXRoRGF0YSxcbiAgICAgICAgICAgIGRvUmVxdWVzdDogdGhpcy5yZXF1ZXN0Q2FsbGJhY2ssXG4gICAgICAgICAgICBidXN5Q2hhbmdlZDogdGhpcy5vbkJ1c3lDaGFuZ2VkLFxuICAgICAgICAgICAgaW5wdXRzOiB0aGlzLnByb3BzLmlucHV0cyxcbiAgICAgICAgICAgIHN0YXRlVXBkYXRlZDogdGhpcy5hdXRoU3RhdGVVcGRhdGVkLFxuICAgICAgICAgICAgbWF0cml4Q2xpZW50OiB0aGlzLnByb3BzLm1hdHJpeENsaWVudCxcbiAgICAgICAgICAgIHNlc3Npb25JZDogdGhpcy5wcm9wcy5zZXNzaW9uSWQsXG4gICAgICAgICAgICBjbGllbnRTZWNyZXQ6IHRoaXMucHJvcHMuY2xpZW50U2VjcmV0LFxuICAgICAgICAgICAgZW1haWxTaWQ6IHRoaXMucHJvcHMuZW1haWxTaWQsXG4gICAgICAgICAgICByZXF1ZXN0RW1haWxUb2tlbjogdGhpcy5yZXF1ZXN0RW1haWxUb2tlbixcbiAgICAgICAgICAgIHN1cHBvcnRlZFN0YWdlczogW1xuICAgICAgICAgICAgICAgIEF1dGhUeXBlLlBhc3N3b3JkLFxuICAgICAgICAgICAgICAgIEF1dGhUeXBlLlJlY2FwdGNoYSxcbiAgICAgICAgICAgICAgICBBdXRoVHlwZS5FbWFpbCxcbiAgICAgICAgICAgICAgICBBdXRoVHlwZS5Nc2lzZG4sXG4gICAgICAgICAgICAgICAgQXV0aFR5cGUuVGVybXMsXG4gICAgICAgICAgICAgICAgQXV0aFR5cGUuUmVnaXN0cmF0aW9uVG9rZW4sXG4gICAgICAgICAgICAgICAgQXV0aFR5cGUuVW5zdGFibGVSZWdpc3RyYXRpb25Ub2tlbixcbiAgICAgICAgICAgICAgICBBdXRoVHlwZS5Tc28sXG4gICAgICAgICAgICAgICAgQXV0aFR5cGUuU3NvVW5zdGFibGUsXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5wcm9wcy5wb2xsKSB7XG4gICAgICAgICAgICB0aGlzLmludGVydmFsSWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYXV0aExvZ2ljLnBvbGwoKTtcbiAgICAgICAgICAgIH0sIDIwMDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudERpZE1vdW50KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmF1dGhMb2dpY1xuICAgICAgICAgICAgLmF0dGVtcHRBdXRoKClcbiAgICAgICAgICAgIC50aGVuKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHRyYSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZW1haWxTaWQ6IHRoaXMuYXV0aExvZ2ljLmdldEVtYWlsU2lkKCksXG4gICAgICAgICAgICAgICAgICAgIGNsaWVudFNlY3JldDogdGhpcy5hdXRoTG9naWMuZ2V0Q2xpZW50U2VjcmV0KCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb3BzLm9uQXV0aEZpbmlzaGVkKHRydWUsIHJlc3VsdCwgZXh0cmEpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChhc3luYyAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb3BzLm9uQXV0aEZpbmlzaGVkKGZhbHNlLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgZHVyaW5nIHVzZXItaW50ZXJhY3RpdmUgYXV0aDpcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVubW91bnRlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gZXJyb3IubWVzc2FnZSB8fCBlcnJvci50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICBlcnJvclRleHQ6IG1zZyxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlOiBlcnJvci5lcnJjb2RlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVubW91bnRlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWxJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXF1ZXN0RW1haWxUb2tlbiA9IGFzeW5jIChcbiAgICAgICAgZW1haWw6IHN0cmluZyxcbiAgICAgICAgc2VjcmV0OiBzdHJpbmcsXG4gICAgICAgIGF0dGVtcHQ6IG51bWJlcixcbiAgICAgICAgc2Vzc2lvbjogc3RyaW5nLFxuICAgICk6IFByb21pc2U8eyBzaWQ6IHN0cmluZyB9PiA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgYnVzeTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXZSBrbm93IHRoaXMgbWV0aG9kIG9ubHkgZ2V0cyBjYWxsZWQgb24gZmxvd3Mgd2hlcmUgcmVxdWVzdEVtYWlsVG9rZW4gaXMgcGFzc2VkIGJ1dCB0eXBlcyBkb24ndFxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvcHMucmVxdWVzdEVtYWlsVG9rZW4hKGVtYWlsLCBzZWNyZXQsIGF0dGVtcHQsIHNlc3Npb24pO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgYnVzeTogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIGF1dGhTdGF0ZVVwZGF0ZWQgPSAoc3RhZ2VUeXBlOiBBdXRoVHlwZSwgc3RhZ2VTdGF0ZTogSVN0YWdlU3RhdHVzKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IG9sZFN0YWdlID0gdGhpcy5zdGF0ZS5hdXRoU3RhZ2U7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYnVzeTogZmFsc2UsXG4gICAgICAgICAgICAgICAgYXV0aFN0YWdlOiBzdGFnZVR5cGUsXG4gICAgICAgICAgICAgICAgc3RhZ2VTdGF0ZTogc3RhZ2VTdGF0ZSxcbiAgICAgICAgICAgICAgICBlcnJvclRleHQ6IHN0YWdlU3RhdGUuZXJyb3IsXG4gICAgICAgICAgICAgICAgZXJyb3JDb2RlOiBzdGFnZVN0YXRlLmVycmNvZGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChvbGRTdGFnZSAhPT0gc3RhZ2VUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdGFnZVN0YXRlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhZ2VDb21wb25lbnQuY3VycmVudD8uYXR0ZW1wdEZhaWxlZD8uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSByZXF1ZXN0Q2FsbGJhY2sgPSAoYXV0aDogQXV0aERpY3QgfCBudWxsLCBiYWNrZ3JvdW5kOiBib29sZWFuKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgICAgIC8vIFRoaXMgd3JhcHBlciBqdXN0IGV4aXN0cyBiZWNhdXNlIHRoZSBqcy1zZGsgcGFzc2VzIGEgc2Vjb25kXG4gICAgICAgIC8vICdidXN5JyBwYXJhbSBmb3IgYmFja3dhcmRzIGNvbXBhdC4gVGhpcyB0aHJvd3MgdGhlIHRlc3RzIG9mZlxuICAgICAgICAvLyBzbyBkaXNjYXJkIGl0IGhlcmUuXG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLm1ha2VSZXF1ZXN0KGF1dGgpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uQnVzeUNoYW5nZWQgPSAoYnVzeTogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICAvLyBpZiB3ZSd2ZSBzdGFydGVkIGRvaW5nIHN0dWZmLCByZXNldCB0aGUgZXJyb3IgbWVzc2FnZXNcbiAgICAgICAgLy8gVGhlIEpTIFNESyBlYWdlcmx5IHJlcG9ydHMgaXRzZWxmIGFzIFwibm90IGJ1c3lcIiByaWdodCBhZnRlciBhbnlcbiAgICAgICAgLy8gaW1tZWRpYXRlIHdvcmsgaGFzIGNvbXBsZXRlZCwgYnV0IHRoYXQncyBub3QgcmVhbGx5IHdoYXQgd2Ugd2FudCBhdFxuICAgICAgICAvLyB0aGUgVUkgbGF5ZXIsIHNvIHdlIGlnbm9yZSB0aGlzIHNpZ25hbCBhbmQgc2hvdyBhIHNwaW5uZXIgdW50aWxcbiAgICAgICAgLy8gdGhlcmUncyBhIG5ldyBzY3JlZW4gdG8gc2hvdyB0aGUgdXNlci4gVGhpcyBpcyBpbXBsZW1lbnRlZCBieSBzZXR0aW5nXG4gICAgICAgIC8vIGBidXN5OiBmYWxzZWAgaW4gYGF1dGhTdGF0ZVVwZGF0ZWRgLlxuICAgICAgICAvLyBTZWUgYWxzbyBodHRwczovL2dpdGh1Yi5jb20vdmVjdG9yLWltL2VsZW1lbnQtd2ViL2lzc3Vlcy8xMjU0NlxuICAgICAgICBpZiAoYnVzeSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgYnVzeTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBlcnJvclRleHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBlcnJvckNvZGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXV0aFN0YXRlVXBkYXRlZCBpcyBub3QgY2FsbGVkIGR1cmluZyBzc28gZmxvd3NcbiAgICAgICAgaWYgKCFidXN5ICYmICh0aGlzLnN0YXRlLmF1dGhTdGFnZSA9PT0gQXV0aFR5cGUuU3NvIHx8IHRoaXMuc3RhdGUuYXV0aFN0YWdlID09PSBBdXRoVHlwZS5Tc29VbnN0YWJsZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBidXN5IH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgc2V0Rm9jdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RhZ2VDb21wb25lbnQuY3VycmVudD8uZm9jdXM/LigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3VibWl0QXV0aERpY3QgPSAoYXV0aERhdGE6IEF1dGhEaWN0KTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuYXV0aExvZ2ljLnN1Ym1pdEF1dGhEaWN0KGF1dGhEYXRhKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvblBoYXNlQ2hhbmdlID0gKG5ld1BoYXNlOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5wcm9wcy5vblN0YWdlUGhhc2VDaGFuZ2U/Lih0aGlzLnN0YXRlLmF1dGhTdGFnZSA/PyBudWxsLCBuZXdQaGFzZSB8fCAwKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvblN0YWdlQ2FuY2VsID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnByb3BzLm9uQXV0aEZpbmlzaGVkKGZhbHNlLCBFUlJPUl9VU0VSX0NBTkNFTExFRCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25BdXRoU3RhZ2VGYWlsZWQgPSBhc3luYyAoZTogRXJyb3IpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm9wcy5vbkF1dGhGaW5pc2hlZChmYWxzZSwgZSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgc2V0RW1haWxTaWQgPSAoc2lkOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5hdXRoTG9naWMuc2V0RW1haWxTaWQoc2lkKTtcbiAgICB9O1xuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBjb25zdCBzdGFnZSA9IHRoaXMuc3RhdGUuYXV0aFN0YWdlO1xuICAgICAgICBpZiAoIXN0YWdlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5idXN5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDxTcGlubmVyIC8+O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFN0YWdlQ29tcG9uZW50ID0gZ2V0RW50cnlDb21wb25lbnRGb3JMb2dpblR5cGUoc3RhZ2UpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPFN0YWdlQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgcmVmPXt0aGlzLnN0YWdlQ29tcG9uZW50IGFzIGFueX1cbiAgICAgICAgICAgICAgICBsb2dpblR5cGU9e3N0YWdlfVxuICAgICAgICAgICAgICAgIG1hdHJpeENsaWVudD17dGhpcy5wcm9wcy5tYXRyaXhDbGllbnR9XG4gICAgICAgICAgICAgICAgYXV0aFNlc3Npb25JZD17dGhpcy5hdXRoTG9naWMuZ2V0U2Vzc2lvbklkKCl9XG4gICAgICAgICAgICAgICAgY2xpZW50U2VjcmV0PXt0aGlzLmF1dGhMb2dpYy5nZXRDbGllbnRTZWNyZXQoKX1cbiAgICAgICAgICAgICAgICBzdGFnZVBhcmFtcz17dGhpcy5hdXRoTG9naWMuZ2V0U3RhZ2VQYXJhbXMoc3RhZ2UpfVxuICAgICAgICAgICAgICAgIHN1Ym1pdEF1dGhEaWN0PXt0aGlzLnN1Ym1pdEF1dGhEaWN0fVxuICAgICAgICAgICAgICAgIGVycm9yVGV4dD17dGhpcy5zdGF0ZS5lcnJvclRleHR9XG4gICAgICAgICAgICAgICAgZXJyb3JDb2RlPXt0aGlzLnN0YXRlLmVycm9yQ29kZX1cbiAgICAgICAgICAgICAgICBidXN5PXt0aGlzLnN0YXRlLmJ1c3l9XG4gICAgICAgICAgICAgICAgaW5wdXRzPXt0aGlzLnByb3BzLmlucHV0c31cbiAgICAgICAgICAgICAgICBzdGFnZVN0YXRlPXt0aGlzLnN0YXRlLnN0YWdlU3RhdGV9XG4gICAgICAgICAgICAgICAgZmFpbD17dGhpcy5vbkF1dGhTdGFnZUZhaWxlZH1cbiAgICAgICAgICAgICAgICBzZXRFbWFpbFNpZD17dGhpcy5zZXRFbWFpbFNpZH1cbiAgICAgICAgICAgICAgICBzaG93Q29udGludWU9eyF0aGlzLnByb3BzLmNvbnRpbnVlSXNNYW5hZ2VkfVxuICAgICAgICAgICAgICAgIG9uUGhhc2VDaGFuZ2U9e3RoaXMub25QaGFzZUNoYW5nZX1cbiAgICAgICAgICAgICAgICByZXF1ZXN0RW1haWxUb2tlbj17dGhpcy5hdXRoTG9naWMucmVxdWVzdEVtYWlsVG9rZW59XG4gICAgICAgICAgICAgICAgY29udGludWVUZXh0PXt0aGlzLnByb3BzLmNvbnRpbnVlVGV4dH1cbiAgICAgICAgICAgICAgICBjb250aW51ZUtpbmQ9e3RoaXMucHJvcHMuY29udGludWVLaW5kfVxuICAgICAgICAgICAgICAgIG9uQ2FuY2VsPXt0aGlzLm9uU3RhZ2VDYW5jZWx9XG4gICAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFRQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxnQkFBQSxHQUFBRCxPQUFBO0FBU0EsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBRUEsSUFBQUcsK0JBQUEsR0FBQUMsc0JBQUEsQ0FBQUosT0FBQTtBQUtBLElBQUFLLFFBQUEsR0FBQUQsc0JBQUEsQ0FBQUosT0FBQTtBQUFnRCxTQUFBTSx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSxDQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBUix3QkFBQVEsQ0FBQSxFQUFBRSxDQUFBLFNBQUFBLENBQUEsSUFBQUYsQ0FBQSxJQUFBQSxDQUFBLENBQUFJLFVBQUEsU0FBQUosQ0FBQSxlQUFBQSxDQUFBLHVCQUFBQSxDQUFBLHlCQUFBQSxDQUFBLFdBQUFLLE9BQUEsRUFBQUwsQ0FBQSxRQUFBRyxDQUFBLEdBQUFKLHdCQUFBLENBQUFHLENBQUEsT0FBQUMsQ0FBQSxJQUFBQSxDQUFBLENBQUFHLEdBQUEsQ0FBQU4sQ0FBQSxVQUFBRyxD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