matrix-react-sdk
Version:
SDK for matrix.org using React
250 lines (210 loc) • 29.9 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _autodiscovery = require("matrix-js-sdk/src/autodiscovery");
var _AutoDiscoveryUtils = _interopRequireDefault(require("../../../utils/AutoDiscoveryUtils"));
var _BaseDialog = _interopRequireDefault(require("./BaseDialog"));
var _languageHandler = require("../../../languageHandler");
var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton"));
var _SdkConfig = _interopRequireDefault(require("../../../SdkConfig"));
var _Field = _interopRequireDefault(require("../elements/Field"));
var _StyledRadioButton = _interopRequireDefault(require("../elements/StyledRadioButton"));
var _TextWithTooltip = _interopRequireDefault(require("../elements/TextWithTooltip"));
var _Validation = _interopRequireDefault(require("../elements/Validation"));
var _replaceableComponent = require("../../../utils/replaceableComponent");
var _dec, _class, _temp;
let ServerPickerDialog = (_dec = (0, _replaceableComponent.replaceableComponent)("views.dialogs.ServerPickerDialog"), _dec(_class = (_temp = class ServerPickerDialog extends _react.default.PureComponent
/*:: <IProps, IState>*/
{
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "defaultServer", void 0);
(0, _defineProperty2.default)(this, "fieldRef", /*#__PURE__*/(0, _react.createRef)());
(0, _defineProperty2.default)(this, "validatedConf", void 0);
(0, _defineProperty2.default)(this, "onDefaultChosen", () => {
this.setState({
defaultChosen: true
});
});
(0, _defineProperty2.default)(this, "onOtherChosen", () => {
this.setState({
defaultChosen: false
});
});
(0, _defineProperty2.default)(this, "onHomeserverChange", ev => {
this.setState({
otherHomeserver: ev.target.value
});
});
(0, _defineProperty2.default)(this, "validate", (0, _Validation.default)({
deriveData: async ({
value
}) => {
let hsUrl = value.trim(); // trim to account for random whitespace
// if the URL has no protocol, try validate it as a serverName via well-known
if (!hsUrl.includes("://")) {
try {
const discoveryResult = await _autodiscovery.AutoDiscovery.findClientConfig(hsUrl);
this.validatedConf = _AutoDiscoveryUtils.default.buildValidatedConfigFromDiscovery(hsUrl, discoveryResult);
return {}; // we have a validated config, we don't need to try the other paths
} catch (e) {
console.error(`Attempted ${hsUrl} as a server_name but it failed`, e);
}
} // if we got to this stage then either the well-known failed or the URL had a protocol specified,
// so validate statically only. If the URL has no protocol, default to https.
if (!hsUrl.includes("://")) {
hsUrl = "https://" + hsUrl;
}
try {
this.validatedConf = await _AutoDiscoveryUtils.default.validateServerConfigWithStaticUrls(hsUrl);
return {};
} catch (e) {
console.error(e);
const stateForError = _AutoDiscoveryUtils.default.authComponentStateForError(e);
if (stateForError.serverErrorIsFatal) {
let error = (0, _languageHandler._t)("Unable to validate homeserver");
if (e.translatedMessage) {
error = e.translatedMessage;
}
return {
error
};
} // try to carry on anyway
try {
this.validatedConf = await _AutoDiscoveryUtils.default.validateServerConfigWithStaticUrls(hsUrl, null, true);
return {};
} catch (e) {
console.error(e);
return {
error: (0, _languageHandler._t)("Invalid URL")
};
}
}
},
rules: [{
key: "required",
test: ({
value,
allowEmpty
}) => allowEmpty || !!value,
invalid: () => (0, _languageHandler._t)("Specify a homeserver")
}, {
key: "valid",
test: async function ({
value
}, {
error
}) {
if (!value) return true;
return !error;
},
invalid: function ({
error
}) {
return error;
}
}]
}));
(0, _defineProperty2.default)(this, "onHomeserverValidate", (fieldState
/*: IFieldState*/
) => this.validate(fieldState));
(0, _defineProperty2.default)(this, "onSubmit", async ev => {
ev.preventDefault();
const valid = await this.fieldRef.current.validate({
allowEmpty: false
});
if (!valid && !this.state.defaultChosen) {
this.fieldRef.current.focus();
this.fieldRef.current.validate({
allowEmpty: false,
focused: true
});
return;
}
this.props.onFinished(this.state.defaultChosen ? this.defaultServer : this.validatedConf);
});
const config = _SdkConfig.default.get();
this.defaultServer = config["validated_server_config"];
const {
serverConfig
} = this.props;
let otherHomeserver = "";
if (!serverConfig.isDefault) {
if (serverConfig.isNameResolvable && serverConfig.hsName) {
otherHomeserver = serverConfig.hsName;
} else {
otherHomeserver = serverConfig.hsUrl;
}
}
this.state = {
defaultChosen: serverConfig.isDefault,
otherHomeserver
};
}
render() {
let text;
if (this.defaultServer.hsName === "matrix.org") {
text = (0, _languageHandler._t)("Matrix.org is the biggest public homeserver in the world, so it’s a good place for many.");
}
let defaultServerName
/*: React.ReactNode*/
= this.defaultServer.hsName;
if (this.defaultServer.hsNameIsDifferent) {
defaultServerName = /*#__PURE__*/_react.default.createElement(_TextWithTooltip.default, {
class: "mx_Login_underlinedServerName",
tooltip: this.defaultServer.hsUrl
}, this.defaultServer.hsName);
}
return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, {
title: this.props.title || (0, _languageHandler._t)("Sign into your homeserver"),
className: "mx_ServerPickerDialog",
contentId: "mx_ServerPickerDialog",
onFinished: this.props.onFinished,
fixedWidth: false,
hasCancel: true
}, /*#__PURE__*/_react.default.createElement("form", {
className: "mx_Dialog_content",
id: "mx_ServerPickerDialog",
onSubmit: this.onSubmit
}, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("We call the places where you can host your account ‘homeservers’."), " ", text), /*#__PURE__*/_react.default.createElement(_StyledRadioButton.default, {
name: "defaultChosen",
value: "true",
checked: this.state.defaultChosen,
onChange: this.onDefaultChosen
}, defaultServerName), /*#__PURE__*/_react.default.createElement(_StyledRadioButton.default, {
name: "defaultChosen",
value: "false",
className: "mx_ServerPickerDialog_otherHomeserverRadio",
checked: !this.state.defaultChosen,
onChange: this.onOtherChosen
}, /*#__PURE__*/_react.default.createElement(_Field.default, {
type: "text",
className: "mx_ServerPickerDialog_otherHomeserver",
label: (0, _languageHandler._t)("Other homeserver"),
onChange: this.onHomeserverChange,
onClick: this.onOtherChosen,
ref: this.fieldRef,
onValidate: this.onHomeserverValidate,
value: this.state.otherHomeserver,
validateOnChange: false,
validateOnFocus: false,
id: "mx_homeserverInput"
})), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("Use your preferred Matrix homeserver if you have one, or host your own.")), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_ServerPickerDialog_continue",
kind: "primary",
onClick: this.onSubmit
}, (0, _languageHandler._t)("Continue")), /*#__PURE__*/_react.default.createElement("h4", null, (0, _languageHandler._t)("Learn more")), /*#__PURE__*/_react.default.createElement("a", {
href: "https://matrix.org/faq/#what-is-a-homeserver%3F",
target: "_blank",
rel: "noreferrer noopener"
}, (0, _languageHandler._t)("About homeservers"))));
}
}, _temp)) || _class);
exports.default = ServerPickerDialog;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2RpYWxvZ3MvU2VydmVyUGlja2VyRGlhbG9nLnRzeCJdLCJuYW1lcyI6WyJTZXJ2ZXJQaWNrZXJEaWFsb2ciLCJSZWFjdCIsIlB1cmVDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwic2V0U3RhdGUiLCJkZWZhdWx0Q2hvc2VuIiwiZXYiLCJvdGhlckhvbWVzZXJ2ZXIiLCJ0YXJnZXQiLCJ2YWx1ZSIsImRlcml2ZURhdGEiLCJoc1VybCIsInRyaW0iLCJpbmNsdWRlcyIsImRpc2NvdmVyeVJlc3VsdCIsIkF1dG9EaXNjb3ZlcnkiLCJmaW5kQ2xpZW50Q29uZmlnIiwidmFsaWRhdGVkQ29uZiIsIkF1dG9EaXNjb3ZlcnlVdGlscyIsImJ1aWxkVmFsaWRhdGVkQ29uZmlnRnJvbURpc2NvdmVyeSIsImUiLCJjb25zb2xlIiwiZXJyb3IiLCJ2YWxpZGF0ZVNlcnZlckNvbmZpZ1dpdGhTdGF0aWNVcmxzIiwic3RhdGVGb3JFcnJvciIsImF1dGhDb21wb25lbnRTdGF0ZUZvckVycm9yIiwic2VydmVyRXJyb3JJc0ZhdGFsIiwidHJhbnNsYXRlZE1lc3NhZ2UiLCJydWxlcyIsImtleSIsInRlc3QiLCJhbGxvd0VtcHR5IiwiaW52YWxpZCIsImZpZWxkU3RhdGUiLCJ2YWxpZGF0ZSIsInByZXZlbnREZWZhdWx0IiwidmFsaWQiLCJmaWVsZFJlZiIsImN1cnJlbnQiLCJzdGF0ZSIsImZvY3VzIiwiZm9jdXNlZCIsIm9uRmluaXNoZWQiLCJkZWZhdWx0U2VydmVyIiwiY29uZmlnIiwiU2RrQ29uZmlnIiwiZ2V0Iiwic2VydmVyQ29uZmlnIiwiaXNEZWZhdWx0IiwiaXNOYW1lUmVzb2x2YWJsZSIsImhzTmFtZSIsInJlbmRlciIsInRleHQiLCJkZWZhdWx0U2VydmVyTmFtZSIsImhzTmFtZUlzRGlmZmVyZW50IiwidGl0bGUiLCJvblN1Ym1pdCIsIm9uRGVmYXVsdENob3NlbiIsIm9uT3RoZXJDaG9z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SUFBSSxFQUFDLE1BRFQ7QUFFSSxNQUFBLFNBQVMsRUFBQyx1Q0FGZDtBQUdJLE1BQUEsS0FBSyxFQUFFLHlCQUFHLGtCQUFILENBSFg7QUFJSSxNQUFBLFFBQVEsRUFBRSxLQUFLQyxrQkFKbkI7QUFLSSxNQUFBLE9BQU8sRUFBRSxLQUFLRCxhQUxsQjtBQU1JLE1BQUEsR0FBRyxFQUFFLEtBQUtyQixRQU5kO0FBT0ksTUFBQSxVQUFVLEVBQUUsS0FBS3VCLG9CQVByQjtBQVFJLE1BQUEsS0FBSyxFQUFFLEtBQUtyQixLQUFMLENBQVdoQyxlQVJ0QjtBQVNJLE1BQUEsZ0JBQWdCLEVBQUUsS0FUdEI7QUFVSSxNQUFBLGVBQWUsRUFBRSxLQVZyQjtBQVdJLE1BQUEsRUFBRSxFQUFDO0FBWFAsTUFQSixDQWRKLGVBbUNJLHdDQUNLLHlCQUFHLHlFQUFILENBREwsQ0FuQ0osZUF1Q0ksNkJBQUMseUJBQUQ7QUFBa0IsTUFBQSxTQUFTLEVBQUMsZ0NBQTVCO0FBQTZELE1BQUEsSUFBSSxFQUFDLFNBQWxFO0FBQTRFLE1BQUEsT0FBTyxFQUFFLEtBQUtpRDtBQUExRixPQUNLLHlCQUFHLFVBQUgsQ0FETCxDQXZDSixlQTJDSSx5Q0FBSyx5QkFBRyxZQUFILENBQUwsQ0EzQ0osZUE0Q0k7QUFBRyxNQUFBLElBQUksRUFBQyxpREFBUjtBQUEwRCxNQUFBLE1BQU0sRUFBQyxRQUFqRTtBQUEwRSxNQUFBLEdBQUcsRUFBQztBQUE5RSxPQUNLLHlCQUFHLG1CQUFILENBREwsQ0E1Q0osQ0FSRyxDQUFQO0FBeURIOztBQWxNK0UsQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyMC0yMDIxIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7Y3JlYXRlUmVmfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7QXV0b0Rpc2NvdmVyeX0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2F1dG9kaXNjb3ZlcnlcIjtcblxuaW1wb3J0IEF1dG9EaXNjb3ZlcnlVdGlscywge1ZhbGlkYXRlZFNlcnZlckNvbmZpZ30gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL0F1dG9EaXNjb3ZlcnlVdGlsc1wiO1xuaW1wb3J0IEJhc2VEaWFsb2cgZnJvbSAnLi9CYXNlRGlhbG9nJztcbmltcG9ydCB7IF90IH0gZnJvbSAnLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyJztcbmltcG9ydCBBY2Nlc3NpYmxlQnV0dG9uIGZyb20gXCIuLi9lbGVtZW50cy9BY2Nlc3NpYmxlQnV0dG9uXCI7XG5pbXBvcnQgU2RrQ29uZmlnIGZyb20gXCIuLi8uLi8uLi9TZGtDb25maWdcIjtcbmltcG9ydCBGaWVsZCBmcm9tIFwiLi4vZWxlbWVudHMvRmllbGRcIjtcbmltcG9ydCBTdHlsZWRSYWRpb0J1dHRvbiBmcm9tIFwiLi4vZWxlbWVudHMvU3R5bGVkUmFkaW9CdXR0b25cIjtcbmltcG9ydCBUZXh0V2l0aFRvb2x0aXAgZnJvbSBcIi4uL2VsZW1lbnRzL1RleHRXaXRoVG9vbHRpcFwiO1xuaW1wb3J0IHdpdGhWYWxpZGF0aW9uLCB7SUZpZWxkU3RhdGV9IGZyb20gXCIuLi9lbGVtZW50cy9WYWxpZGF0aW9uXCI7XG5pbXBvcnQge3JlcGxhY2VhYmxlQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmVwbGFjZWFibGVDb21wb25lbnRcIjtcblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgc2VydmVyQ29uZmlnOiBWYWxpZGF0ZWRTZXJ2ZXJDb25maWc7XG4gICAgb25GaW5pc2hlZChjb25maWc/OiBWYWxpZGF0ZWRTZXJ2ZXJDb25maWcpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBkZWZhdWx0Q2hvc2VuOiBib29sZWFuO1xuICAgIG90aGVySG9tZXNlcnZlcjogc3RyaW5nO1xufVxuXG5AcmVwbGFjZWFibGVDb21wb25lbnQoXCJ2aWV3cy5kaWFsb2dzLlNlcnZlclBpY2tlckRpYWxvZ1wiKVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VydmVyUGlja2VyRGlhbG9nIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFNlcnZlcjogVmFsaWRhdGVkU2VydmVyQ29uZmlnO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZmllbGRSZWYgPSBjcmVhdGVSZWY8RmllbGQ+KCk7XG4gICAgcHJpdmF0ZSB2YWxpZGF0ZWRDb25mOiBWYWxpZGF0ZWRTZXJ2ZXJDb25maWc7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgY29uc3QgY29uZmlnID0gU2RrQ29uZmlnLmdldCgpO1xuICAgICAgICB0aGlzLmRlZmF1bHRTZXJ2ZXIgPSBjb25maWdbXCJ2YWxpZGF0ZWRfc2VydmVyX2NvbmZpZ1wiXSBhcyBWYWxpZGF0ZWRTZXJ2ZXJDb25maWc7XG4gICAgICAgIGNvbnN0IHsgc2VydmVyQ29uZmlnIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICAgIGxldCBvdGhlckhvbWVzZXJ2ZXIgPSBcIlwiO1xuICAgICAgICBpZiAoIXNlcnZlckNvbmZpZy5pc0RlZmF1bHQpIHtcbiAgICAgICAgICAgIGlmIChzZXJ2ZXJDb25maWcuaXNOYW1lUmVzb2x2YWJsZSAmJiBzZXJ2ZXJDb25maWcuaHNOYW1lKSB7XG4gICAgICAgICAgICAgICAgb3RoZXJIb21lc2VydmVyID0gc2VydmVyQ29uZmlnLmhzTmFtZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3RoZXJIb21lc2VydmVyID0gc2VydmVyQ29uZmlnLmhzVXJsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGRlZmF1bHRDaG9zZW46IHNlcnZlckNvbmZpZy5pc0RlZmF1bHQsXG4gICAgICAgICAgICBvdGhlckhvbWVzZXJ2ZXIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkRlZmF1bHRDaG9zZW4gPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBkZWZhdWx0Q2hvc2VuOiB0cnVlIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uT3RoZXJDaG9zZW4gPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBkZWZhdWx0Q2hvc2VuOiBmYWxzZSB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkhvbWVzZXJ2ZXJDaGFuZ2UgPSAoZXYpID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IG90aGVySG9tZXNlcnZlcjogZXYudGFyZ2V0LnZhbHVlIH0pO1xuICAgIH07XG5cbiAgICAvLyBUT0RPOiBEbyB3ZSB3YW50IHRvIHN1cHBvcnQgLndlbGwta25vd24gbG9va3VwcyBoZXJlP1xuICAgIC8vIElmIGZvciBzb21lIHJlYXNvbiBzb21lb25lIGVudGVycyBcIm1hdHJpeC5vcmdcIiBmb3IgYSBVUkwsIHdlIGNvdWxkIGRvIGEgbG9va3VwIHRvXG4gICAgLy8gZmluZCB0aGVpciBob21lc2VydmVyIHdpdGhvdXQgZGVtYW5kaW5nIHRoZXkgdXNlIFwiaHR0cHM6Ly9tYXRyaXgub3JnXCJcbiAgICBwcml2YXRlIHZhbGlkYXRlID0gd2l0aFZhbGlkYXRpb248dGhpcywgeyBlcnJvcj86IHN0cmluZyB9Pih7XG4gICAgICAgIGRlcml2ZURhdGE6IGFzeW5jICh7IHZhbHVlIH0pID0+IHtcbiAgICAgICAgICAgIGxldCBoc1VybCA9IHZhbHVlLnRyaW0oKTsgLy8gdHJpbSB0byBhY2NvdW50IGZvciByYW5kb20gd2hpdGVzcGFjZVxuXG4gICAgICAgICAgICAvLyBpZiB0aGUgVVJMIGhhcyBubyBwcm90b2NvbCwgdHJ5IHZhbGlkYXRlIGl0IGFzIGEgc2VydmVyTmFtZSB2aWEgd2VsbC1rbm93blxuICAgICAgICAgICAgaWYgKCFoc1VybC5pbmNsdWRlcyhcIjovL1wiKSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc2NvdmVyeVJlc3VsdCA9IGF3YWl0IEF1dG9EaXNjb3ZlcnkuZmluZENsaWVudENvbmZpZyhoc1VybCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVkQ29uZiA9IEF1dG9EaXNjb3ZlcnlVdGlscy5idWlsZFZhbGlkYXRlZENvbmZpZ0Zyb21EaXNjb3ZlcnkoaHNVcmwsIGRpc2NvdmVyeVJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTsgLy8gd2UgaGF2ZSBhIHZhbGlkYXRlZCBjb25maWcsIHdlIGRvbid0IG5lZWQgdG8gdHJ5IHRoZSBvdGhlciBwYXRoc1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQXR0ZW1wdGVkICR7aHNVcmx9IGFzIGEgc2VydmVyX25hbWUgYnV0IGl0IGZhaWxlZGAsIGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgd2UgZ290IHRvIHRoaXMgc3RhZ2UgdGhlbiBlaXRoZXIgdGhlIHdlbGwta25vd24gZmFpbGVkIG9yIHRoZSBVUkwgaGFkIGEgcHJvdG9jb2wgc3BlY2lmaWVkLFxuICAgICAgICAgICAgLy8gc28gdmFsaWRhdGUgc3RhdGljYWxseSBvbmx5LiBJZiB0aGUgVVJMIGhhcyBubyBwcm90b2NvbCwgZGVmYXVsdCB0byBodHRwcy5cbiAgICAgICAgICAgIGlmICghaHNVcmwuaW5jbHVkZXMoXCI6Ly9cIikpIHtcbiAgICAgICAgICAgICAgICBoc1VybCA9IFwiaHR0cHM6Ly9cIiArIGhzVXJsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVkQ29uZiA9IGF3YWl0IEF1dG9EaXNjb3ZlcnlVdGlscy52YWxpZGF0ZVNlcnZlckNvbmZpZ1dpdGhTdGF0aWNVcmxzKGhzVXJsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlRm9yRXJyb3IgPSBBdXRvRGlzY292ZXJ5VXRpbHMuYXV0aENvbXBvbmVudFN0YXRlRm9yRXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlRm9yRXJyb3Iuc2VydmVyRXJyb3JJc0ZhdGFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IF90KFwiVW5hYmxlIHRvIHZhbGlkYXRlIGhvbWVzZXJ2ZXJcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLnRyYW5zbGF0ZWRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGUudHJhbnNsYXRlZE1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3IgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyB0cnkgdG8gY2Fycnkgb24gYW55d2F5XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZWRDb25mID0gYXdhaXQgQXV0b0Rpc2NvdmVyeVV0aWxzLnZhbGlkYXRlU2VydmVyQ29uZmlnV2l0aFN0YXRpY1VybHMoaHNVcmwsIG51bGwsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogX3QoXCJJbnZhbGlkIFVSTFwiKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcnVsZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwicmVxdWlyZWRcIixcbiAgICAgICAgICAgICAgICB0ZXN0OiAoeyB2YWx1ZSwgYWxsb3dFbXB0eSB9KSA9PiBhbGxvd0VtcHR5IHx8ICEhdmFsdWUsXG4gICAgICAgICAgICAgICAgaW52YWxpZDogKCkgPT4gX3QoXCJTcGVjaWZ5IGEgaG9tZXNlcnZlclwiKSxcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwidmFsaWRcIixcbiAgICAgICAgICAgICAgICB0ZXN0OiBhc3luYyBmdW5jdGlvbih7IHZhbHVlIH0sIHsgZXJyb3IgfSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFlcnJvcjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGludmFsaWQ6IGZ1bmN0aW9uKHsgZXJyb3IgfSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBwcml2YXRlIG9uSG9tZXNlcnZlclZhbGlkYXRlID0gKGZpZWxkU3RhdGU6IElGaWVsZFN0YXRlKSA9PiB0aGlzLnZhbGlkYXRlKGZpZWxkU3RhdGUpO1xuXG4gICAgcHJpdmF0ZSBvblN1Ym1pdCA9IGFzeW5jIChldikgPT4ge1xuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGNvbnN0IHZhbGlkID0gYXdhaXQgdGhpcy5maWVsZFJlZi5jdXJyZW50LnZhbGlkYXRlKHsgYWxsb3dFbXB0eTogZmFsc2UgfSk7XG5cbiAgICAgICAgaWYgKCF2YWxpZCAmJiAhdGhpcy5zdGF0ZS5kZWZhdWx0Q2hvc2VuKSB7XG4gICAgICAgICAgICB0aGlzLmZpZWxkUmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMuZmllbGRSZWYuY3VycmVudC52YWxpZGF0ZSh7IGFsbG93RW1wdHk6IGZhbHNlLCBmb2N1c2VkOiB0cnVlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9wcy5vbkZpbmlzaGVkKHRoaXMuc3RhdGUuZGVmYXVsdENob3NlbiA/IHRoaXMuZGVmYXVsdFNlcnZlciA6IHRoaXMudmFsaWRhdGVkQ29uZik7XG4gICAgfTtcblxuICAgIHB1YmxpYyByZW5kZXIoKSB7XG4gICAgICAgIGxldCB0ZXh0O1xuICAgICAgICBpZiAodGhpcy5kZWZhdWx0U2VydmVyLmhzTmFtZSA9PT0gXCJtYXRyaXgub3JnXCIpIHtcbiAgICAgICAgICAgIHRleHQgPSBfdChcIk1hdHJpeC5vcmcgaXMgdGhlIGJpZ2dlc3QgcHVibGljIGhvbWVzZXJ2ZXIgaW4gdGhlIHdvcmxkLCBzbyBpdOKAmXMgYSBnb29kIHBsYWNlIGZvciBtYW55LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkZWZhdWx0U2VydmVyTmFtZTogUmVhY3QuUmVhY3ROb2RlID0gdGhpcy5kZWZhdWx0U2VydmVyLmhzTmFtZTtcbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFNlcnZlci5oc05hbWVJc0RpZmZlcmVudCkge1xuICAgICAgICAgICAgZGVmYXVsdFNlcnZlck5hbWUgPSAoXG4gICAgICAgICAgICAgICAgPFRleHRXaXRoVG9vbHRpcCBjbGFzcz1cIm14X0xvZ2luX3VuZGVybGluZWRTZXJ2ZXJOYW1lXCIgdG9vbHRpcD17dGhpcy5kZWZhdWx0U2VydmVyLmhzVXJsfT5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMuZGVmYXVsdFNlcnZlci5oc05hbWV9XG4gICAgICAgICAgICAgICAgPC9UZXh0V2l0aFRvb2x0aXA+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDxCYXNlRGlhbG9nXG4gICAgICAgICAgICB0aXRsZT17dGhpcy5wcm9wcy50aXRsZSB8fCBfdChcIlNpZ24gaW50byB5b3VyIGhvbWVzZXJ2ZXJcIil9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJteF9TZXJ2ZXJQaWNrZXJEaWFsb2dcIlxuICAgICAgICAgICAgY29udGVudElkPVwibXhfU2VydmVyUGlja2VyRGlhbG9nXCJcbiAgICAgICAgICAgIG9uRmluaXNoZWQ9e3RoaXMucHJvcHMub25GaW5pc2hlZH1cbiAgICAgICAgICAgIGZpeGVkV2lkdGg9e2ZhbHNlfVxuICAgICAgICAgICAgaGFzQ2FuY2VsPXt0cnVlfVxuICAgICAgICA+XG4gICAgICAgICAgICA8Zm9ybSBjbGFzc05hbWU9XCJteF9EaWFsb2dfY29udGVudFwiIGlkPVwibXhfU2VydmVyUGlja2VyRGlhbG9nXCIgb25TdWJtaXQ9e3RoaXMub25TdWJtaXR9PlxuICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgICB7X3QoXCJXZSBjYWxsIHRoZSBwbGFjZXMgd2hlcmUgeW91IGNhbiBob3N0IHlvdXIgYWNjb3VudCDigJhob21lc2VydmVyc+KAmS5cIil9IHt0ZXh0fVxuICAgICAgICAgICAgICAgIDwvcD5cblxuICAgICAgICAgICAgICAgIDxTdHlsZWRSYWRpb0J1dHRvblxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZGVmYXVsdENob3NlblwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3RoaXMuc3RhdGUuZGVmYXVsdENob3Nlbn1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMub25EZWZhdWx0Q2hvc2VufVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge2RlZmF1bHRTZXJ2ZXJOYW1lfVxuICAgICAgICAgICAgICAgIDwvU3R5bGVkUmFkaW9CdXR0b24+XG5cbiAgICAgICAgICAgICAgICA8U3R5bGVkUmFkaW9CdXR0b25cbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cImRlZmF1bHRDaG9zZW5cIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfU2VydmVyUGlja2VyRGlhbG9nX290aGVySG9tZXNlcnZlclJhZGlvXCJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17IXRoaXMuc3RhdGUuZGVmYXVsdENob3Nlbn1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMub25PdGhlckNob3Nlbn1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfU2VydmVyUGlja2VyRGlhbG9nX290aGVySG9tZXNlcnZlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJPdGhlciBob21lc2VydmVyXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMub25Ib21lc2VydmVyQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5vbk90aGVyQ2hvc2VufVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmPXt0aGlzLmZpZWxkUmVmfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25WYWxpZGF0ZT17dGhpcy5vbkhvbWVzZXJ2ZXJWYWxpZGF0ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLm90aGVySG9tZXNlcnZlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlT25DaGFuZ2U9e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVPbkZvY3VzPXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwibXhfaG9tZXNlcnZlcklucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L1N0eWxlZFJhZGlvQnV0dG9uPlxuICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgICB7X3QoXCJVc2UgeW91ciBwcmVmZXJyZWQgTWF0cml4IGhvbWVzZXJ2ZXIgaWYgeW91IGhhdmUgb25lLCBvciBob3N0IHlvdXIgb3duLlwiKX1cbiAgICAgICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvbiBjbGFzc05hbWU9XCJteF9TZXJ2ZXJQaWNrZXJEaWFsb2dfY29udGludWVcIiBraW5kPVwicHJpbWFyeVwiIG9uQ2xpY2s9e3RoaXMub25TdWJtaXR9PlxuICAgICAgICAgICAgICAgICAgICB7X3QoXCJDb250aW51ZVwiKX1cbiAgICAgICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG5cbiAgICAgICAgICAgICAgICA8aDQ+e190KFwiTGVhcm4gbW9yZVwiKX08L2g0PlxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL21hdHJpeC5vcmcvZmFxLyN3aGF0LWlzLWEtaG9tZXNlcnZlciUzRlwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vcmVmZXJyZXIgbm9vcGVuZXJcIj5cbiAgICAgICAgICAgICAgICAgICAge190KFwiQWJvdXQgaG9tZXNlcnZlcnNcIil9XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L0Jhc2VEaWFsb2c+O1xuICAgIH1cbn1cbiJdfQ==