UNPKG

matrix-react-sdk

Version:
161 lines (156 loc) 24.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; exports.tEmoji = tEmoji; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _sasEmoji = _interopRequireDefault(require("@matrix-org/spec/sas-emoji.json")); var _languageHandler = require("../../../languageHandler"); var _EncryptionInfo = require("../right_panel/EncryptionInfo"); var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton")); var _FontManager = require("../../../utils/FontManager"); /* Copyright 2024 New Vector Ltd. Copyright 2019 Vector Creations Ltd SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ const SasEmojiMap = new Map(_sasEmoji.default.map(({ description, translated_descriptions: translations }) => [description.toLowerCase(), { description, // Normalize the translation keys translations: Object.keys(translations).reduce((o, k) => { for (const key of (0, _languageHandler.getNormalizedLanguageKeys)(k)) { o[key] = translations[k]; } return o; }, {}) }])); /** * Translate given EmojiMapping into the target locale * @param mapping - the given EmojiMapping to translate * @param locale - the BCP 47 locale to translate to, will fall back to English as the base locale for Matrix SAS Emoji. */ function tEmoji(mapping, locale) { const name = mapping[1]; const emoji = SasEmojiMap.get(name.toLowerCase()); if (!emoji) { console.warn("Emoji not found for translation", name); return name; } for (const key of (0, _languageHandler.getNormalizedLanguageKeys)(locale)) { if (!!emoji.translations[key]) { return emoji.translations[key]; } } return emoji.description; } class VerificationShowSas extends _react.default.Component { constructor(props) { super(props); (0, _defineProperty2.default)(this, "onMatchClick", () => { this.setState({ pending: true }); this.props.onDone(); }); (0, _defineProperty2.default)(this, "onDontMatchClick", () => { this.setState({ cancelling: true }); this.props.onCancel(); }); this.state = { pending: false }; // As this component is also used before login (during complete security), // also make sure we have a working emoji font to display the SAS emojis here. // This is also done from LoggedInView. (0, _FontManager.fixupColorFonts)(); } render() { const locale = (0, _languageHandler.getUserLanguage)(); let sasDisplay; let sasCaption; if (this.props.sas.emoji) { const emojiBlocks = this.props.sas.emoji.map((emoji, i) => /*#__PURE__*/_react.default.createElement("div", { className: "mx_VerificationShowSas_emojiSas_block", key: i }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_VerificationShowSas_emojiSas_emoji" }, emoji[0]), /*#__PURE__*/_react.default.createElement("div", { className: "mx_VerificationShowSas_emojiSas_label" }, tEmoji(emoji, locale)))); sasDisplay = /*#__PURE__*/_react.default.createElement("div", { className: "mx_VerificationShowSas_emojiSas" }, emojiBlocks.slice(0, 4), /*#__PURE__*/_react.default.createElement("div", { className: "mx_VerificationShowSas_emojiSas_break" }), emojiBlocks.slice(4)); sasCaption = this.props.isSelf ? (0, _languageHandler._t)("encryption|verification|sas_emoji_caption_self") : (0, _languageHandler._t)("encryption|verification|sas_emoji_caption_user"); } else if (this.props.sas.decimal) { const numberBlocks = this.props.sas.decimal.map((num, i) => /*#__PURE__*/_react.default.createElement("span", { key: i }, num)); sasDisplay = /*#__PURE__*/_react.default.createElement("div", { className: "mx_VerificationShowSas_decimalSas" }, numberBlocks); sasCaption = this.props.isSelf ? (0, _languageHandler._t)("encryption|verification|sas_caption_self") : (0, _languageHandler._t)("encryption|verification|sas_caption_user"); } else { return /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("encryption|verification|unsupported_method"), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { kind: "primary", onClick: this.props.onCancel }, (0, _languageHandler._t)("action|cancel"))); } let confirm; if (this.state.pending && this.props.isSelf) { let text; // device shouldn't be null in this situation but it can be, eg. if the device is // logged out during verification const otherDevice = this.props.otherDeviceDetails; if (otherDevice) { text = (0, _languageHandler._t)("encryption|verification|waiting_other_device_details", { deviceName: otherDevice.displayName, deviceId: otherDevice.deviceId }); } else { text = (0, _languageHandler._t)("encryption|verification|waiting_other_device"); } confirm = /*#__PURE__*/_react.default.createElement("p", null, text); } else if (this.state.pending || this.state.cancelling) { let text; if (this.state.pending) { const { displayName } = this.props; text = (0, _languageHandler._t)("encryption|verification|waiting_other_user", { displayName }); } else { text = (0, _languageHandler._t)("encryption|verification|cancelling"); } confirm = /*#__PURE__*/_react.default.createElement(_EncryptionInfo.PendingActionSpinner, { text: text }); } else { confirm = /*#__PURE__*/_react.default.createElement("div", { className: "mx_VerificationShowSas_buttonRow" }, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { onClick: this.onDontMatchClick, kind: "danger" }, (0, _languageHandler._t)("encryption|verification|sas_no_match")), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { onClick: this.onMatchClick, kind: "primary" }, (0, _languageHandler._t)("encryption|verification|sas_match"))); } return /*#__PURE__*/_react.default.createElement("div", { className: "mx_VerificationShowSas" }, /*#__PURE__*/_react.default.createElement("p", null, sasCaption), sasDisplay, /*#__PURE__*/_react.default.createElement("p", null, this.props.isSelf ? "" : (0, _languageHandler._t)("encryption|verification|in_person")), confirm); } } exports.default = VerificationShowSas; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9zYXNFbW9qaSIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfRW5jcnlwdGlvbkluZm8iLCJfQWNjZXNzaWJsZUJ1dHRvbiIsIl9Gb250TWFuYWdlciIsIlNhc0Vtb2ppTWFwIiwiTWFwIiwiU2FzRW1vamkiLCJtYXAiLCJkZXNjcmlwdGlvbiIsInRyYW5zbGF0ZWRfZGVzY3JpcHRpb25zIiwidHJhbnNsYXRpb25zIiwidG9Mb3dlckNhc2UiLCJPYmplY3QiLCJrZXlzIiwicmVkdWNlIiwibyIsImsiLCJrZXkiLCJnZXROb3JtYWxpemVkTGFuZ3VhZ2VLZXlzIiwidEVtb2ppIiwibWFwcGluZyIsImxvY2FsZSIsIm5hbWUiLCJlbW9qaSIsImdldCIsImNvbnNvbGUiLCJ3YXJuIiwiVmVyaWZpY2F0aW9uU2hvd1NhcyIsIlJlYWN0IiwiQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0Iiwic2V0U3RhdGUiLCJwZW5kaW5nIiwib25Eb25lIiwiY2FuY2VsbGluZyIsIm9uQ2FuY2VsIiwic3RhdGUiLCJmaXh1cENvbG9yRm9udHMiLCJyZW5kZXIiLCJnZXRVc2VyTGFuZ3VhZ2UiLCJzYXNEaXNwbGF5Iiwic2FzQ2FwdGlvbiIsInNhcyIsImVtb2ppQmxvY2tzIiwiaSIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJzbGljZSIsImlzU2VsZiIsIl90IiwiZGVjaW1hbCIsIm51bWJlckJsb2NrcyIsIm51bSIsImtpbmQiLCJvbkNsaWNrIiwiY29uZmlybSIsInRleHQiLCJvdGhlckRldmljZSIsIm90aGVyRGV2aWNlRGV0YWlscyIsImRldmljZU5hbWUiLCJkaXNwbGF5TmFtZSIsImRldmljZUlkIiwiUGVuZGluZ0FjdGlvblNwaW5uZXIiLCJvbkRvbnRNYXRjaENsaWNrIiwib25NYXRjaENsaWNrIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3ZlcmlmaWNhdGlvbi9WZXJpZmljYXRpb25TaG93U2FzLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxOSBWZWN0b3IgQ3JlYXRpb25zIEx0ZFxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBEZXZpY2UgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5pbXBvcnQgeyBHZW5lcmF0ZWRTYXMsIEVtb2ppTWFwcGluZyB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9jcnlwdG8tYXBpXCI7XG5pbXBvcnQgU2FzRW1vamkgZnJvbSBcIkBtYXRyaXgtb3JnL3NwZWMvc2FzLWVtb2ppLmpzb25cIjtcblxuaW1wb3J0IHsgX3QsIGdldE5vcm1hbGl6ZWRMYW5ndWFnZUtleXMsIGdldFVzZXJMYW5ndWFnZSB9IGZyb20gXCIuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7IFBlbmRpbmdBY3Rpb25TcGlubmVyIH0gZnJvbSBcIi4uL3JpZ2h0X3BhbmVsL0VuY3J5cHRpb25JbmZvXCI7XG5pbXBvcnQgQWNjZXNzaWJsZUJ1dHRvbiBmcm9tIFwiLi4vZWxlbWVudHMvQWNjZXNzaWJsZUJ1dHRvblwiO1xuaW1wb3J0IHsgZml4dXBDb2xvckZvbnRzIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL0ZvbnRNYW5hZ2VyXCI7XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIHBlbmRpbmc/OiBib29sZWFuO1xuICAgIGRpc3BsYXlOYW1lPzogc3RyaW5nOyAvLyByZXF1aXJlZCBpZiBwZW5kaW5nIGlzIHRydWVcblxuICAgIC8qKiBEZXRhaWxzIG9mIHRoZSBvdGhlciBkZXZpY2UgaW52b2x2ZWQgaW4gdGhlIHZlcmlmaWNhdGlvbiwgaWYga25vd24gKi9cbiAgICBvdGhlckRldmljZURldGFpbHM/OiBEZXZpY2U7XG5cbiAgICBvbkRvbmU6ICgpID0+IHZvaWQ7XG4gICAgb25DYW5jZWw6ICgpID0+IHZvaWQ7XG4gICAgc2FzOiBHZW5lcmF0ZWRTYXM7XG4gICAgaXNTZWxmPzogYm9vbGVhbjtcbiAgICBpbkRpYWxvZz86IGJvb2xlYW47IC8vIHdoZXRoZXIgdGhpcyBjb21wb25lbnQgaXMgYmVpbmcgc2hvd24gaW4gYSBkaWFsb2cgYW5kIHRvIHVzZSBEaWFsb2dCdXR0b25zXG59XG5cbmludGVyZmFjZSBJU3RhdGUge1xuICAgIHBlbmRpbmc6IGJvb2xlYW47XG4gICAgY2FuY2VsbGluZz86IGJvb2xlYW47XG59XG5cbmNvbnN0IFNhc0Vtb2ppTWFwID0gbmV3IE1hcDxcbiAgICBzdHJpbmcsIC8vIGxvd2VyY2FzZVxuICAgIHtcbiAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgICAgdHJhbnNsYXRpb25zOiB7XG4gICAgICAgICAgICBbbm9ybWFsaXplZExhbmd1YWdlS2V5OiBzdHJpbmddOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgfVxuPihcbiAgICBTYXNFbW9qaS5tYXAoKHsgZGVzY3JpcHRpb24sIHRyYW5zbGF0ZWRfZGVzY3JpcHRpb25zOiB0cmFuc2xhdGlvbnMgfSkgPT4gW1xuICAgICAgICBkZXNjcmlwdGlvbi50b0xvd2VyQ2FzZSgpLFxuICAgICAgICB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgdHJhbnNsYXRpb24ga2V5c1xuICAgICAgICAgICAgdHJhbnNsYXRpb25zOiBPYmplY3Qua2V5cyh0cmFuc2xhdGlvbnMpLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigobywgaykgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGdldE5vcm1hbGl6ZWRMYW5ndWFnZUtleXMoaykpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdHJhbnNsYXRpb25zW2sgYXMga2V5b2YgdHlwZW9mIHRyYW5zbGF0aW9uc10hO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbztcbiAgICAgICAgICAgIH0sIHt9KSxcbiAgICAgICAgfSxcbiAgICBdKSxcbik7XG5cbi8qKlxuICogVHJhbnNsYXRlIGdpdmVuIEVtb2ppTWFwcGluZyBpbnRvIHRoZSB0YXJnZXQgbG9jYWxlXG4gKiBAcGFyYW0gbWFwcGluZyAtIHRoZSBnaXZlbiBFbW9qaU1hcHBpbmcgdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0gbG9jYWxlIC0gdGhlIEJDUCA0NyBsb2NhbGUgdG8gdHJhbnNsYXRlIHRvLCB3aWxsIGZhbGwgYmFjayB0byBFbmdsaXNoIGFzIHRoZSBiYXNlIGxvY2FsZSBmb3IgTWF0cml4IFNBUyBFbW9qaS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRFbW9qaShtYXBwaW5nOiBFbW9qaU1hcHBpbmcsIGxvY2FsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gbWFwcGluZ1sxXTtcbiAgICBjb25zdCBlbW9qaSA9IFNhc0Vtb2ppTWFwLmdldChuYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgIGlmICghZW1vamkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiRW1vamkgbm90IGZvdW5kIGZvciB0cmFuc2xhdGlvblwiLCBuYW1lKTtcbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgZ2V0Tm9ybWFsaXplZExhbmd1YWdlS2V5cyhsb2NhbGUpKSB7XG4gICAgICAgIGlmICghIWVtb2ppLnRyYW5zbGF0aW9uc1trZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gZW1vamkudHJhbnNsYXRpb25zW2tleV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW1vamkuZGVzY3JpcHRpb247XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlcmlmaWNhdGlvblNob3dTYXMgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8SVByb3BzLCBJU3RhdGU+IHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHM6IElQcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHBlbmRpbmc6IGZhbHNlLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEFzIHRoaXMgY29tcG9uZW50IGlzIGFsc28gdXNlZCBiZWZvcmUgbG9naW4gKGR1cmluZyBjb21wbGV0ZSBzZWN1cml0eSksXG4gICAgICAgIC8vIGFsc28gbWFrZSBzdXJlIHdlIGhhdmUgYSB3b3JraW5nIGVtb2ppIGZvbnQgdG8gZGlzcGxheSB0aGUgU0FTIGVtb2ppcyBoZXJlLlxuICAgICAgICAvLyBUaGlzIGlzIGFsc28gZG9uZSBmcm9tIExvZ2dlZEluVmlldy5cbiAgICAgICAgZml4dXBDb2xvckZvbnRzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbk1hdGNoQ2xpY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBwZW5kaW5nOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnByb3BzLm9uRG9uZSgpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uRG9udE1hdGNoQ2xpY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBjYW5jZWxsaW5nOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnByb3BzLm9uQ2FuY2VsKCk7XG4gICAgfTtcblxuICAgIHB1YmxpYyByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAgICAgY29uc3QgbG9jYWxlID0gZ2V0VXNlckxhbmd1YWdlKCk7XG5cbiAgICAgICAgbGV0IHNhc0Rpc3BsYXk7XG4gICAgICAgIGxldCBzYXNDYXB0aW9uO1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5zYXMuZW1vamkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVtb2ppQmxvY2tzID0gdGhpcy5wcm9wcy5zYXMuZW1vamkubWFwKChlbW9qaSwgaSkgPT4gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfVmVyaWZpY2F0aW9uU2hvd1Nhc19lbW9qaVNhc19ibG9ja1wiIGtleT17aX0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfVmVyaWZpY2F0aW9uU2hvd1Nhc19lbW9qaVNhc19lbW9qaVwiPntlbW9qaVswXX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9WZXJpZmljYXRpb25TaG93U2FzX2Vtb2ppU2FzX2xhYmVsXCI+e3RFbW9qaShlbW9qaSwgbG9jYWxlKX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgc2FzRGlzcGxheSA9IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1ZlcmlmaWNhdGlvblNob3dTYXNfZW1vamlTYXNcIj5cbiAgICAgICAgICAgICAgICAgICAge2Vtb2ppQmxvY2tzLnNsaWNlKDAsIDQpfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1ZlcmlmaWNhdGlvblNob3dTYXNfZW1vamlTYXNfYnJlYWtcIiAvPlxuICAgICAgICAgICAgICAgICAgICB7ZW1vamlCbG9ja3Muc2xpY2UoNCl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgc2FzQ2FwdGlvbiA9IHRoaXMucHJvcHMuaXNTZWxmXG4gICAgICAgICAgICAgICAgPyBfdChcImVuY3J5cHRpb258dmVyaWZpY2F0aW9ufHNhc19lbW9qaV9jYXB0aW9uX3NlbGZcIilcbiAgICAgICAgICAgICAgICA6IF90KFwiZW5jcnlwdGlvbnx2ZXJpZmljYXRpb258c2FzX2Vtb2ppX2NhcHRpb25fdXNlclwiKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnNhcy5kZWNpbWFsKSB7XG4gICAgICAgICAgICBjb25zdCBudW1iZXJCbG9ja3MgPSB0aGlzLnByb3BzLnNhcy5kZWNpbWFsLm1hcCgobnVtLCBpKSA9PiA8c3BhbiBrZXk9e2l9PntudW19PC9zcGFuPik7XG4gICAgICAgICAgICBzYXNEaXNwbGF5ID0gPGRpdiBjbGFzc05hbWU9XCJteF9WZXJpZmljYXRpb25TaG93U2FzX2RlY2ltYWxTYXNcIj57bnVtYmVyQmxvY2tzfTwvZGl2PjtcbiAgICAgICAgICAgIHNhc0NhcHRpb24gPSB0aGlzLnByb3BzLmlzU2VsZlxuICAgICAgICAgICAgICAgID8gX3QoXCJlbmNyeXB0aW9ufHZlcmlmaWNhdGlvbnxzYXNfY2FwdGlvbl9zZWxmXCIpXG4gICAgICAgICAgICAgICAgOiBfdChcImVuY3J5cHRpb258dmVyaWZpY2F0aW9ufHNhc19jYXB0aW9uX3VzZXJcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIHtfdChcImVuY3J5cHRpb258dmVyaWZpY2F0aW9ufHVuc3VwcG9ydGVkX21ldGhvZFwiKX1cbiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b24ga2luZD1cInByaW1hcnlcIiBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2FuY2VsfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcImFjdGlvbnxjYW5jZWxcIil9XG4gICAgICAgICAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29uZmlybTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUucGVuZGluZyAmJiB0aGlzLnByb3BzLmlzU2VsZikge1xuICAgICAgICAgICAgbGV0IHRleHQ7XG4gICAgICAgICAgICAvLyBkZXZpY2Ugc2hvdWxkbid0IGJlIG51bGwgaW4gdGhpcyBzaXR1YXRpb24gYnV0IGl0IGNhbiBiZSwgZWcuIGlmIHRoZSBkZXZpY2UgaXNcbiAgICAgICAgICAgIC8vIGxvZ2dlZCBvdXQgZHVyaW5nIHZlcmlmaWNhdGlvblxuICAgICAgICAgICAgY29uc3Qgb3RoZXJEZXZpY2UgPSB0aGlzLnByb3BzLm90aGVyRGV2aWNlRGV0YWlscztcbiAgICAgICAgICAgIGlmIChvdGhlckRldmljZSkge1xuICAgICAgICAgICAgICAgIHRleHQgPSBfdChcImVuY3J5cHRpb258dmVyaWZpY2F0aW9ufHdhaXRpbmdfb3RoZXJfZGV2aWNlX2RldGFpbHNcIiwge1xuICAgICAgICAgICAgICAgICAgICBkZXZpY2VOYW1lOiBvdGhlckRldmljZS5kaXNwbGF5TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQ6IG90aGVyRGV2aWNlLmRldmljZUlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0ZXh0ID0gX3QoXCJlbmNyeXB0aW9ufHZlcmlmaWNhdGlvbnx3YWl0aW5nX290aGVyX2RldmljZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpcm0gPSA8cD57dGV4dH08L3A+O1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUucGVuZGluZyB8fCB0aGlzLnN0YXRlLmNhbmNlbGxpbmcpIHtcbiAgICAgICAgICAgIGxldCB0ZXh0O1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUucGVuZGluZykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGlzcGxheU5hbWUgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgICAgICAgICAgdGV4dCA9IF90KFwiZW5jcnlwdGlvbnx2ZXJpZmljYXRpb258d2FpdGluZ19vdGhlcl91c2VyXCIsIHsgZGlzcGxheU5hbWUgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRleHQgPSBfdChcImVuY3J5cHRpb258dmVyaWZpY2F0aW9ufGNhbmNlbGxpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25maXJtID0gPFBlbmRpbmdBY3Rpb25TcGlubmVyIHRleHQ9e3RleHR9IC8+O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlybSA9IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1ZlcmlmaWNhdGlvblNob3dTYXNfYnV0dG9uUm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uIG9uQ2xpY2s9e3RoaXMub25Eb250TWF0Y2hDbGlja30ga2luZD1cImRhbmdlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge190KFwiZW5jcnlwdGlvbnx2ZXJpZmljYXRpb258c2FzX25vX21hdGNoXCIpfVxuICAgICAgICAgICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uIG9uQ2xpY2s9e3RoaXMub25NYXRjaENsaWNrfSBraW5kPVwicHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge190KFwiZW5jcnlwdGlvbnx2ZXJpZmljYXRpb258c2FzX21hdGNoXCIpfVxuICAgICAgICAgICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfVmVyaWZpY2F0aW9uU2hvd1Nhc1wiPlxuICAgICAgICAgICAgICAgIDxwPntzYXNDYXB0aW9ufTwvcD5cbiAgICAgICAgICAgICAgICB7c2FzRGlzcGxheX1cbiAgICAgICAgICAgICAgICA8cD57dGhpcy5wcm9wcy5pc1NlbGYgPyBcIlwiIDogX3QoXCJlbmNyeXB0aW9ufHZlcmlmaWNhdGlvbnxpbl9wZXJzb25cIil9PC9wPlxuICAgICAgICAgICAgICAgIHtjb25maXJtfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFRQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFHQSxJQUFBQyxTQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBRSxnQkFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsZUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksaUJBQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFLLFlBQUEsR0FBQUwsT0FBQTtBQWhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUErQkEsTUFBTU0sV0FBVyxHQUFHLElBQUlDLEdBQUcsQ0FTdkJDLGlCQUFRLENBQUNDLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLFdBQVc7RUFBRUMsdUJBQXVCLEVBQUVDO0FBQWEsQ0FBQyxLQUFLLENBQ3JFRixXQUFXLENBQUNHLFdBQVcsQ0FBQyxDQUFDLEVBQ3pCO0VBQ0lILFdBQVc7RUFDWDtFQUNBRSxZQUFZLEVBQUVFLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDSCxZQUFZLENBQUMsQ0FBQ0ksTUFBTSxDQUF5QixDQUFDQyxDQUFDLEVBQUVDLENBQUMsS0FBSztJQUM3RSxLQUFLLE1BQU1DLEdBQUcsSUFBSSxJQUFBQywwQ0FBeUIsRUFBQ0YsQ0FBQyxDQUFDLEVBQUU7TUFDNUNELENBQUMsQ0FBQ0UsR0FBRyxDQUFDLEdBQUdQLFlBQVksQ0FBQ00sQ0FBQyxDQUErQjtJQUMxRDtJQUNBLE9BQU9ELENBQUM7RUFDWixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ1QsQ0FBQyxDQUNK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