matrix-react-sdk
Version:
SDK for matrix.org using React
211 lines (207 loc) • 30.9 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _languageHandler = require("../../../languageHandler");
var _Validation = _interopRequireDefault(require("./Validation"));
var _Field = _interopRequireDefault(require("./Field"));
var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext"));
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 2019-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.
*/
// Controlled form component wrapping Field for inputting a room alias scoped to a given domain
class RoomAliasField extends _react.default.PureComponent {
constructor(props, context) {
super(props, context);
(0, _defineProperty2.default)(this, "fieldRef", /*#__PURE__*/(0, _react.createRef)());
(0, _defineProperty2.default)(this, "onChange", ev => {
this.props.onChange?.(this.asFullAlias(ev.target.value));
});
(0, _defineProperty2.default)(this, "onValidate", async fieldState => {
const result = await this.validationRules(fieldState);
this.setState({
isValid: !!result.valid
});
return result;
});
(0, _defineProperty2.default)(this, "validationRules", (0, _Validation.default)({
rules: [{
key: "hasDomain",
test: async ({
value
}) => {
// Ignore if we have passed domain
if (!value || this.props.domain) {
return true;
}
if (value.split(":").length < 2) {
return false;
}
return true;
},
invalid: () => (0, _languageHandler._t)("room_settings|general|alias_field_has_domain_invalid")
}, {
key: "hasLocalpart",
test: async ({
value
}) => {
if (!value || this.props.domain) {
return true;
}
const split = value.split(":");
if (split.length < 2) {
return true; // hasDomain check will fail here instead
}
// Define the value invalid if there's no first part (roomname)
if (split[0].length < 1) {
return false;
}
return true;
},
invalid: () => (0, _languageHandler._t)("room_settings|general|alias_field_has_localpart_invalid")
}, {
key: "safeLocalpart",
test: async ({
value
}) => {
if (!value) {
return true;
}
if (!this.props.domain) {
return true;
} else {
const fullAlias = this.asFullAlias(value);
const hasColon = this.props.domain ? !value.includes(":") : true;
// XXX: FIXME https://github.com/matrix-org/matrix-doc/issues/668
// NOTE: We could probably use linkifyjs to parse those aliases here?
return !value.includes("#") && hasColon && !value.includes(",") && encodeURI(fullAlias) === fullAlias;
}
},
invalid: () => (0, _languageHandler._t)("room_settings|general|alias_field_safe_localpart_invalid")
}, {
key: "required",
test: async ({
value,
allowEmpty
}) => allowEmpty || !!value,
invalid: () => (0, _languageHandler._t)("room_settings|general|alias_field_required_invalid")
}, this.props.roomId ? {
key: "matches",
final: true,
test: async ({
value
}) => {
if (!value) {
return true;
}
const client = this.context;
try {
const result = await client.getRoomIdForAlias(this.asFullAlias(value));
return result.room_id === this.props.roomId;
} catch (err) {
console.log(err);
return false;
}
},
invalid: () => (0, _languageHandler._t)("room_settings|general|alias_field_matches_invalid")
} : {
key: "taken",
final: true,
test: async ({
value
}) => {
if (!value) {
return true;
}
const client = this.context;
try {
await client.getRoomIdForAlias(this.asFullAlias(value));
// we got a room id, so the alias is taken
return false;
} catch (err) {
console.log(err);
// any server error code will do,
// either it M_NOT_FOUND or the alias is invalid somehow,
// in which case we don't want to show the invalid message
return err instanceof _matrix.MatrixError;
}
},
valid: () => (0, _languageHandler._t)("room_settings|general|alias_field_taken_valid"),
invalid: () => this.props.domain ? (0, _languageHandler._t)("room_settings|general|alias_field_taken_invalid_domain") : (0, _languageHandler._t)("room_settings|general|alias_field_taken_invalid")
}]
}));
this.state = {
isValid: true
};
}
asFullAlias(localpart) {
const hashAlias = `#${localpart}`;
if (this.props.domain) {
return `${hashAlias}:${this.props.domain}`;
}
return hashAlias;
}
get domainProps() {
const {
domain
} = this.props;
const prefix = /*#__PURE__*/_react.default.createElement("span", null, "#");
const postfix = domain ? /*#__PURE__*/_react.default.createElement("span", {
title: `:${domain}`
}, `:${domain}`) : /*#__PURE__*/_react.default.createElement("span", null);
const maxlength = domain ? 255 - domain.length - 2 : 255 - 1; // 2 for # and :
const value = domain ? this.props.value.substring(1, this.props.value.length - domain.length - 1) : this.props.value.substring(1);
return {
prefix,
postfix,
value,
maxlength
};
}
render() {
const {
prefix,
postfix,
value,
maxlength
} = this.domainProps;
return /*#__PURE__*/_react.default.createElement(_Field.default, {
label: this.props.label || (0, _languageHandler._t)("room_settings|general|alias_heading"),
className: "mx_RoomAliasField",
prefixComponent: prefix,
postfixComponent: postfix,
ref: this.fieldRef,
onValidate: this.onValidate,
placeholder: this.props.placeholder || (0, _languageHandler._t)("room_settings|general|alias_field_placeholder_default"),
onChange: this.onChange,
value: value,
maxLength: maxlength,
disabled: this.props.disabled,
autoComplete: "off",
onKeyDown: this.props.onKeyDown
});
}
get isValid() {
return this.state.isValid;
}
async validate(options) {
const val = await this.fieldRef.current?.validate(options);
return val ?? false;
}
focus() {
this.fieldRef.current?.focus();
}
}
exports.default = RoomAliasField;
(0, _defineProperty2.default)(RoomAliasField, "contextType", _MatrixClientContext.default);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbWF0cml4IiwiX2xhbmd1YWdlSGFuZGxlciIsIl9WYWxpZGF0aW9uIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9GaWVsZCIsIl9NYXRyaXhDbGllbnRDb250ZXh0IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiUm9vbUFsaWFzRmllbGQiLCJSZWFjdCIsIlB1cmVDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiY29udGV4dCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJjcmVhdGVSZWYiLCJldiIsIm9uQ2hhbmdlIiwiYXNGdWxsQWxpYXMiLCJ0YXJnZXQiLCJ2YWx1ZSIsImZpZWxkU3RhdGUiLCJyZXN1bHQiLCJ2YWxpZGF0aW9uUnVsZXMiLCJzZXRTdGF0ZSIsImlzVmFsaWQiLCJ2YWxpZCIsIndpdGhWYWxpZGF0aW9uIiwicnVsZXMiLCJrZXkiLCJ0ZXN0IiwiZG9tYWluIiwic3BsaXQiLCJsZW5ndGgiLCJpbnZhbGlkIiwiX3QiLCJmdWxsQWxpYXMiLCJoYXNDb2xvbiIsImluY2x1ZGVzIiwiZW5jb2RlVVJJIiwiYWxsb3dFbXB0eSIsInJvb21JZCIsImZpbmFsIiwiY2xpZW50IiwiZ2V0Um9vbUlkRm9yQWxpYXMiLCJyb29tX2lkIiwiZXJyIiwiY29uc29sZSIsImxvZyIsIk1hdHJpeEVycm9yIiwic3RhdGUiLCJsb2NhbHBhcnQiLCJoYXNoQWxpYXMiLCJkb21haW5Qcm9wcyIsInByZWZpeCIsImNyZWF0ZUVsZW1lbnQiLCJwb3N0Zml4IiwidGl0bGUiLCJtYXhsZW5ndGgiLCJzdWJzdHJpbmciLCJyZW5kZXIiLCJsYWJlbCIsImNsYXNzTmFtZSIsInByZWZpeENvbXBvbmVudCIsInBvc3RmaXhDb21wb25lbnQiLCJyZWYiLCJmaWVsZFJlZiIsIm9uVmFsaWRhdGUiLCJwbGFjZWhvbGRlciIsIm1heExlbmd0aCIsImRpc2FibGVkIiwiYXV0b0NvbXBsZXRlIiwib25LZXlEb3duIiwidmFsaWRhdGUiLCJvcHRpb25zIiwidmFsIiwiY3VycmVudCIsImZvY3VzIiwiZXhwb3J0cyIsIk1hdHJpeENsaWVudENvbnRleHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWV3cy9lbGVtZW50cy9Sb29tQWxpYXNGaWVsZC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTktMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHsgY3JlYXRlUmVmLCBLZXlib2FyZEV2ZW50SGFuZGxlciB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgTWF0cml4RXJyb3IgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5cbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IHdpdGhWYWxpZGF0aW9uLCB7IElGaWVsZFN0YXRlLCBJVmFsaWRhdGlvblJlc3VsdCB9IGZyb20gXCIuL1ZhbGlkYXRpb25cIjtcbmltcG9ydCBGaWVsZCwgeyBJVmFsaWRhdGVPcHRzIH0gZnJvbSBcIi4vRmllbGRcIjtcbmltcG9ydCBNYXRyaXhDbGllbnRDb250ZXh0IGZyb20gXCIuLi8uLi8uLi9jb250ZXh0cy9NYXRyaXhDbGllbnRDb250ZXh0XCI7XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIGRvbWFpbj86IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIGxhYmVsPzogc3RyaW5nO1xuICAgIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAgIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgICAvLyBpZiByb29tSWQgaXMgcGFzc2VkIHRoZW4gdGhlIGVudGVyZWQgYWxpYXMgaXMgY2hlY2tlZCB0byBwb2ludCB0byB0aGlzIHJvb21JZCwgZWxzZSBtdXN0IGJlIHVuYXNzaWduZWRcbiAgICByb29tSWQ/OiBzdHJpbmc7XG4gICAgb25LZXlEb3duPzogS2V5Ym9hcmRFdmVudEhhbmRsZXI7XG4gICAgb25DaGFuZ2U/KHZhbHVlOiBzdHJpbmcpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBpc1ZhbGlkOiBib29sZWFuO1xufVxuXG4vLyBDb250cm9sbGVkIGZvcm0gY29tcG9uZW50IHdyYXBwaW5nIEZpZWxkIGZvciBpbnB1dHRpbmcgYSByb29tIGFsaWFzIHNjb3BlZCB0byBhIGdpdmVuIGRvbWFpblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9vbUFsaWFzRmllbGQgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50PElQcm9wcywgSVN0YXRlPiB7XG4gICAgcHVibGljIHN0YXRpYyBjb250ZXh0VHlwZSA9IE1hdHJpeENsaWVudENvbnRleHQ7XG4gICAgcHVibGljIGRlY2xhcmUgY29udGV4dDogUmVhY3QuQ29udGV4dFR5cGU8dHlwZW9mIE1hdHJpeENsaWVudENvbnRleHQ+O1xuXG4gICAgcHJpdmF0ZSBmaWVsZFJlZiA9IGNyZWF0ZVJlZjxGaWVsZD4oKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogSVByb3BzLCBjb250ZXh0OiBSZWFjdC5Db250ZXh0VHlwZTx0eXBlb2YgTWF0cml4Q2xpZW50Q29udGV4dD4pIHtcbiAgICAgICAgc3VwZXIocHJvcHMsIGNvbnRleHQpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBpc1ZhbGlkOiB0cnVlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXNGdWxsQWxpYXMobG9jYWxwYXJ0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBoYXNoQWxpYXMgPSBgIyR7bG9jYWxwYXJ0fWA7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmRvbWFpbikge1xuICAgICAgICAgICAgcmV0dXJuIGAke2hhc2hBbGlhc306JHt0aGlzLnByb3BzLmRvbWFpbn1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNoQWxpYXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgZG9tYWluUHJvcHMoKToge1xuICAgICAgICBwcmVmaXg6IEpTWC5FbGVtZW50O1xuICAgICAgICBwb3N0Zml4OiBKU1guRWxlbWVudDtcbiAgICAgICAgdmFsdWU6IHN0cmluZztcbiAgICAgICAgbWF4bGVuZ3RoOiBudW1iZXI7XG4gICAgfSB7XG4gICAgICAgIGNvbnN0IHsgZG9tYWluIH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBjb25zdCBwcmVmaXggPSA8c3Bhbj4jPC9zcGFuPjtcbiAgICAgICAgY29uc3QgcG9zdGZpeCA9IGRvbWFpbiA/IDxzcGFuIHRpdGxlPXtgOiR7ZG9tYWlufWB9PntgOiR7ZG9tYWlufWB9PC9zcGFuPiA6IDxzcGFuIC8+O1xuICAgICAgICBjb25zdCBtYXhsZW5ndGggPSBkb21haW4gPyAyNTUgLSBkb21haW4ubGVuZ3RoIC0gMiA6IDI1NSAtIDE7IC8vIDIgZm9yICMgYW5kIDpcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkb21haW5cbiAgICAgICAgICAgID8gdGhpcy5wcm9wcy52YWx1ZS5zdWJzdHJpbmcoMSwgdGhpcy5wcm9wcy52YWx1ZS5sZW5ndGggLSBkb21haW4ubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgIDogdGhpcy5wcm9wcy52YWx1ZS5zdWJzdHJpbmcoMSk7XG5cbiAgICAgICAgcmV0dXJuIHsgcHJlZml4LCBwb3N0Zml4LCB2YWx1ZSwgbWF4bGVuZ3RoIH07XG4gICAgfVxuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBjb25zdCB7IHByZWZpeCwgcG9zdGZpeCwgdmFsdWUsIG1heGxlbmd0aCB9ID0gdGhpcy5kb21haW5Qcm9wcztcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxGaWVsZFxuICAgICAgICAgICAgICAgIGxhYmVsPXt0aGlzLnByb3BzLmxhYmVsIHx8IF90KFwicm9vbV9zZXR0aW5nc3xnZW5lcmFsfGFsaWFzX2hlYWRpbmdcIil9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfUm9vbUFsaWFzRmllbGRcIlxuICAgICAgICAgICAgICAgIHByZWZpeENvbXBvbmVudD17cHJlZml4fVxuICAgICAgICAgICAgICAgIHBvc3RmaXhDb21wb25lbnQ9e3Bvc3RmaXh9XG4gICAgICAgICAgICAgICAgcmVmPXt0aGlzLmZpZWxkUmVmfVxuICAgICAgICAgICAgICAgIG9uVmFsaWRhdGU9e3RoaXMub25WYWxpZGF0ZX1cbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17dGhpcy5wcm9wcy5wbGFjZWhvbGRlciB8fCBfdChcInJvb21fc2V0dGluZ3N8Z2VuZXJhbHxhbGlhc19maWVsZF9wbGFjZWhvbGRlcl9kZWZhdWx0XCIpfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlfVxuICAgICAgICAgICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgICAgICAgICBtYXhMZW5ndGg9e21heGxlbmd0aH1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5wcm9wcy5kaXNhYmxlZH1cbiAgICAgICAgICAgICAgICBhdXRvQ29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgIG9uS2V5RG93bj17dGhpcy5wcm9wcy5vbktleURvd259XG4gICAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25DaGFuZ2UgPSAoZXY6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2U/Lih0aGlzLmFzRnVsbEFsaWFzKGV2LnRhcmdldC52YWx1ZSkpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uVmFsaWRhdGUgPSBhc3luYyAoZmllbGRTdGF0ZTogSUZpZWxkU3RhdGUpOiBQcm9taXNlPElWYWxpZGF0aW9uUmVzdWx0PiA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdGlvblJ1bGVzKGZpZWxkU3RhdGUpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNWYWxpZDogISFyZXN1bHQudmFsaWQgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIHByaXZhdGUgdmFsaWRhdGlvblJ1bGVzID0gd2l0aFZhbGlkYXRpb24oe1xuICAgICAgICBydWxlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogXCJoYXNEb21haW5cIixcbiAgICAgICAgICAgICAgICB0ZXN0OiBhc3luYyAoeyB2YWx1ZSB9KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpZiB3ZSBoYXZlIHBhc3NlZCBkb21haW5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSB8fCB0aGlzLnByb3BzLmRvbWFpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuc3BsaXQoXCI6XCIpLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGludmFsaWQ6ICgpID0+IF90KFwicm9vbV9zZXR0aW5nc3xnZW5lcmFsfGFsaWFzX2ZpZWxkX2hhc19kb21haW5faW52YWxpZFwiKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAga2V5OiBcImhhc0xvY2FscGFydFwiLFxuICAgICAgICAgICAgICAgIHRlc3Q6IGFzeW5jICh7IHZhbHVlIH0pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSB8fCB0aGlzLnByb3BzLmRvbWFpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzcGxpdCA9IHZhbHVlLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBoYXNEb21haW4gY2hlY2sgd2lsbCBmYWlsIGhlcmUgaW5zdGVhZFxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRGVmaW5lIHRoZSB2YWx1ZSBpbnZhbGlkIGlmIHRoZXJlJ3Mgbm8gZmlyc3QgcGFydCAocm9vbW5hbWUpXG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGxpdFswXS5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbnZhbGlkOiAoKSA9PiBfdChcInJvb21fc2V0dGluZ3N8Z2VuZXJhbHxhbGlhc19maWVsZF9oYXNfbG9jYWxwYXJ0X2ludmFsaWRcIiksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogXCJzYWZlTG9jYWxwYXJ0XCIsXG4gICAgICAgICAgICAgICAgdGVzdDogYXN5bmMgKHsgdmFsdWUgfSk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucHJvcHMuZG9tYWluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxBbGlhcyA9IHRoaXMuYXNGdWxsQWxpYXModmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzQ29sb24gPSB0aGlzLnByb3BzLmRvbWFpbiA/ICF2YWx1ZS5pbmNsdWRlcyhcIjpcIikgOiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gWFhYOiBGSVhNRSBodHRwczovL2dpdGh1Yi5jb20vbWF0cml4LW9yZy9tYXRyaXgtZG9jL2lzc3Vlcy82NjhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IFdlIGNvdWxkIHByb2JhYmx5IHVzZSBsaW5raWZ5anMgdG8gcGFyc2UgdGhvc2UgYWxpYXNlcyBoZXJlP1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdmFsdWUuaW5jbHVkZXMoXCIjXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ29sb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdmFsdWUuaW5jbHVkZXMoXCIsXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJKGZ1bGxBbGlhcykgPT09IGZ1bGxBbGlhc1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW52YWxpZDogKCkgPT4gX3QoXCJyb29tX3NldHRpbmdzfGdlbmVyYWx8YWxpYXNfZmllbGRfc2FmZV9sb2NhbHBhcnRfaW52YWxpZFwiKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAga2V5OiBcInJlcXVpcmVkXCIsXG4gICAgICAgICAgICAgICAgdGVzdDogYXN5bmMgKHsgdmFsdWUsIGFsbG93RW1wdHkgfSkgPT4gYWxsb3dFbXB0eSB8fCAhIXZhbHVlLFxuICAgICAgICAgICAgICAgIGludmFsaWQ6ICgpID0+IF90KFwicm9vbV9zZXR0aW5nc3xnZW5lcmFsfGFsaWFzX2ZpZWxkX3JlcXVpcmVkX2ludmFsaWRcIiksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5wcm9wcy5yb29tSWRcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICBrZXk6IFwibWF0Y2hlc1wiLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbmFsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIHRlc3Q6IGFzeW5jICh7IHZhbHVlIH0pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xpZW50ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmdldFJvb21JZEZvckFsaWFzKHRoaXMuYXNGdWxsQWxpYXModmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucm9vbV9pZCA9PT0gdGhpcy5wcm9wcy5yb29tSWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgaW52YWxpZDogKCkgPT4gX3QoXCJyb29tX3NldHRpbmdzfGdlbmVyYWx8YWxpYXNfZmllbGRfbWF0Y2hlc19pbnZhbGlkXCIpLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgIGtleTogXCJ0YWtlblwiLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbmFsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIHRlc3Q6IGFzeW5jICh7IHZhbHVlIH0pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xpZW50ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LmdldFJvb21JZEZvckFsaWFzKHRoaXMuYXNGdWxsQWxpYXModmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGdvdCBhIHJvb20gaWQsIHNvIHRoZSBhbGlhcyBpcyB0YWtlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnkgc2VydmVyIGVycm9yIGNvZGUgd2lsbCBkbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVpdGhlciBpdCBNX05PVF9GT1VORCBvciB0aGUgYWxpYXMgaXMgaW52YWxpZCBzb21laG93LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCB3YW50IHRvIHNob3cgdGhlIGludmFsaWQgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVyciBpbnN0YW5jZW9mIE1hdHJpeEVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZDogKCkgPT4gX3QoXCJyb29tX3NldHRpbmdzfGdlbmVyYWx8YWxpYXNfZmllbGRfdGFrZW5fdmFsaWRcIiksXG4gICAgICAgICAgICAgICAgICAgICAgaW52YWxpZDogKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5kb21haW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX3QoXCJyb29tX3NldHRpbmdzfGdlbmVyYWx8YWxpYXNfZmllbGRfdGFrZW5faW52YWxpZF9kb21haW5cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX3QoXCJyb29tX3NldHRpbmdzfGdlbmVyYWx8YWxpYXNfZmllbGRfdGFrZW5faW52YWxpZFwiKSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBwdWJsaWMgZ2V0IGlzVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmlzVmFsaWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHZhbGlkYXRlKG9wdGlvbnM6IElWYWxpZGF0ZU9wdHMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgdmFsID0gYXdhaXQgdGhpcy5maWVsZFJlZi5jdXJyZW50Py52YWxpZGF0ZShvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHZhbCA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm9jdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmllbGRSZWYuY3VycmVudD8uZm9jdXMoKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsZ0JBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFLLE1BQUEsR0FBQUQsc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFNLG9CQUFBLEdBQUFGLHNCQUFBLENBQUFKLE9BQUE7QUFBd0UsU0FBQU8seUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENB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