matrix-react-sdk
Version:
SDK for matrix.org using React
396 lines (366 loc) • 41.4 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.registerShortcut = exports.toggleDialog = exports.CMD_OR_CTRL = exports.Modifiers = exports.Categories = void 0;
var React = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var sdk = _interopRequireWildcard(require("../index"));
var _Modal = _interopRequireDefault(require("../Modal"));
var _languageHandler = require("../languageHandler");
var _Keyboard = require("../Keyboard");
/*
Copyright 2020 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// TS: once languageHandler is TS we can probably inline this into the enum
(0, _languageHandler._td)("Navigation");
(0, _languageHandler._td)("Calls");
(0, _languageHandler._td)("Composer");
(0, _languageHandler._td)("Room List");
(0, _languageHandler._td)("Autocomplete");
let Categories; // TS: once languageHandler is TS we can probably inline this into the enum
exports.Categories = Categories;
(function (Categories) {
Categories["NAVIGATION"] = "Navigation";
Categories["CALLS"] = "Calls";
Categories["COMPOSER"] = "Composer";
Categories["ROOM_LIST"] = "Room List";
Categories["ROOM"] = "Room";
Categories["AUTOCOMPLETE"] = "Autocomplete";
})(Categories || (exports.Categories = Categories = {}));
(0, _languageHandler._td)("Alt");
(0, _languageHandler._td)("Alt Gr");
(0, _languageHandler._td)("Shift");
(0, _languageHandler._td)("Super");
(0, _languageHandler._td)("Ctrl");
let Modifiers; // Meta-modifier: isMac ? CMD : CONTROL
exports.Modifiers = Modifiers;
(function (Modifiers) {
Modifiers["ALT"] = "Alt";
Modifiers["ALT_GR"] = "Alt Gr";
Modifiers["SHIFT"] = "Shift";
Modifiers["SUPER"] = "Super";
Modifiers["COMMAND"] = "Command";
Modifiers["CONTROL"] = "Ctrl";
})(Modifiers || (exports.Modifiers = Modifiers = {}));
const CMD_OR_CTRL = _Keyboard.isMac ? Modifiers.COMMAND : Modifiers.CONTROL;
exports.CMD_OR_CTRL = CMD_OR_CTRL;
const shortcuts
/*: Record<Categories, IShortcut[]>*/
= {
[Categories.COMPOSER]: [{
keybinds: [{
modifiers: [CMD_OR_CTRL],
key: _Keyboard.Key.B
}],
description: (0, _languageHandler._td)("Toggle Bold")
}, {
keybinds: [{
modifiers: [CMD_OR_CTRL],
key: _Keyboard.Key.I
}],
description: (0, _languageHandler._td)("Toggle Italics")
}, {
keybinds: [{
modifiers: [CMD_OR_CTRL],
key: _Keyboard.Key.GREATER_THAN
}],
description: (0, _languageHandler._td)("Toggle Quote")
}, {
keybinds: [{
modifiers: [Modifiers.SHIFT],
key: _Keyboard.Key.ENTER
}],
description: (0, _languageHandler._td)("New line")
}, {
keybinds: [{
key: _Keyboard.Key.ARROW_UP
}, {
key: _Keyboard.Key.ARROW_DOWN
}],
description: (0, _languageHandler._td)("Navigate recent messages to edit")
}, {
keybinds: [{
modifiers: [CMD_OR_CTRL],
key: _Keyboard.Key.HOME
}, {
modifiers: [CMD_OR_CTRL],
key: _Keyboard.Key.END
}],
description: (0, _languageHandler._td)("Jump to start/end of the composer")
}, {
keybinds: [{
modifiers: [Modifiers.CONTROL, Modifiers.ALT],
key: _Keyboard.Key.ARROW_UP
}, {
modifiers: [Modifiers.CONTROL, Modifiers.ALT],
key: _Keyboard.Key.ARROW_DOWN
}],
description: (0, _languageHandler._td)("Navigate composer history")
}, {
keybinds: [{
key: _Keyboard.Key.ESCAPE
}],
description: (0, _languageHandler._td)("Cancel replying to a message")
}],
[Categories.CALLS]: [{
keybinds: [{
modifiers: [CMD_OR_CTRL],
key: _Keyboard.Key.D
}],
description: (0, _languageHandler._td)("Toggle microphone mute")
}, {
keybinds: [{
modifiers: [CMD_OR_CTRL],
key: _Keyboard.Key.E
}],
description: (0, _languageHandler._td)("Toggle video on/off")
}],
[Categories.ROOM]: [{
keybinds: [{
key: _Keyboard.Key.PAGE_UP
}, {
key: _Keyboard.Key.PAGE_DOWN
}],
description: (0, _languageHandler._td)("Scroll up/down in the timeline")
}, {
keybinds: [{
key: _Keyboard.Key.ESCAPE
}],
description: (0, _languageHandler._td)("Dismiss read marker and jump to bottom")
}, {
keybinds: [{
modifiers: [Modifiers.SHIFT],
key: _Keyboard.Key.PAGE_UP
}],
description: (0, _languageHandler._td)("Jump to oldest unread message")
}, {
keybinds: [{
modifiers: [CMD_OR_CTRL, Modifiers.SHIFT],
key: _Keyboard.Key.U
}],
description: (0, _languageHandler._td)("Upload a file")
}, {
keybinds: [{
modifiers: [CMD_OR_CTRL],
key: _Keyboard.Key.F
}],
description: (0, _languageHandler._td)("Search (must be enabled)")
}],
[Categories.ROOM_LIST]: [{
keybinds: [{
modifiers: [CMD_OR_CTRL],
key: _Keyboard.Key.K
}],
description: (0, _languageHandler._td)("Jump to room search")
}, {
keybinds: [{
key: _Keyboard.Key.ARROW_UP
}, {
key: _Keyboard.Key.ARROW_DOWN
}],
description: (0, _languageHandler._td)("Navigate up/down in the room list")
}, {
keybinds: [{
key: _Keyboard.Key.ENTER
}],
description: (0, _languageHandler._td)("Select room from the room list")
}, {
keybinds: [{
key: _Keyboard.Key.ARROW_LEFT
}],
description: (0, _languageHandler._td)("Collapse room list section")
}, {
keybinds: [{
key: _Keyboard.Key.ARROW_RIGHT
}],
description: (0, _languageHandler._td)("Expand room list section")
}, {
keybinds: [{
key: _Keyboard.Key.ESCAPE
}],
description: (0, _languageHandler._td)("Clear room list filter field")
}],
[Categories.NAVIGATION]: [{
keybinds: [{
modifiers: [Modifiers.ALT, Modifiers.SHIFT],
key: _Keyboard.Key.ARROW_UP
}, {
modifiers: [Modifiers.ALT, Modifiers.SHIFT],
key: _Keyboard.Key.ARROW_DOWN
}],
description: (0, _languageHandler._td)("Previous/next unread room or DM")
}, {
keybinds: [{
modifiers: [Modifiers.ALT],
key: _Keyboard.Key.ARROW_UP
}, {
modifiers: [Modifiers.ALT],
key: _Keyboard.Key.ARROW_DOWN
}],
description: (0, _languageHandler._td)("Previous/next room or DM")
}, {
keybinds: [{
modifiers: [CMD_OR_CTRL],
key: _Keyboard.Key.BACKTICK
}],
description: (0, _languageHandler._td)("Toggle the top left menu")
}, {
keybinds: [{
key: _Keyboard.Key.ESCAPE
}],
description: (0, _languageHandler._td)("Close dialog or context menu")
}, {
keybinds: [{
key: _Keyboard.Key.ENTER
}, {
key: _Keyboard.Key.SPACE
}],
description: (0, _languageHandler._td)("Activate selected button")
}, {
keybinds: [{
modifiers: [CMD_OR_CTRL],
key: _Keyboard.Key.PERIOD
}],
description: (0, _languageHandler._td)("Toggle right panel")
}, {
keybinds: [{
modifiers: [CMD_OR_CTRL],
key: _Keyboard.Key.SLASH
}],
description: (0, _languageHandler._td)("Toggle this dialog")
}, {
keybinds: [{
modifiers: [Modifiers.CONTROL, _Keyboard.isMac ? Modifiers.SHIFT : Modifiers.ALT],
key: _Keyboard.Key.H
}],
description: (0, _languageHandler._td)("Go to Home View")
}],
[Categories.AUTOCOMPLETE]: [{
keybinds: [{
key: _Keyboard.Key.ARROW_UP
}, {
key: _Keyboard.Key.ARROW_DOWN
}],
description: (0, _languageHandler._td)("Move autocomplete selection up/down")
}, {
keybinds: [{
key: _Keyboard.Key.ESCAPE
}],
description: (0, _languageHandler._td)("Cancel autocomplete")
}]
};
const categoryOrder = [Categories.COMPOSER, Categories.AUTOCOMPLETE, Categories.ROOM, Categories.ROOM_LIST, Categories.NAVIGATION, Categories.CALLS];
const modifierIcon
/*: Record<string, string>*/
= {
[Modifiers.COMMAND]: "⌘"
};
if (_Keyboard.isMac) {
modifierIcon[Modifiers.ALT] = "⌥";
}
const alternateKeyName
/*: Record<string, string>*/
= {
[_Keyboard.Key.PAGE_UP]: (0, _languageHandler._td)("Page Up"),
[_Keyboard.Key.PAGE_DOWN]: (0, _languageHandler._td)("Page Down"),
[_Keyboard.Key.ESCAPE]: (0, _languageHandler._td)("Esc"),
[_Keyboard.Key.ENTER]: (0, _languageHandler._td)("Enter"),
[_Keyboard.Key.SPACE]: (0, _languageHandler._td)("Space"),
[_Keyboard.Key.HOME]: (0, _languageHandler._td)("Home"),
[_Keyboard.Key.END]: (0, _languageHandler._td)("End")
};
const keyIcon
/*: Record<string, string>*/
= {
[_Keyboard.Key.ARROW_UP]: "↑",
[_Keyboard.Key.ARROW_DOWN]: "↓",
[_Keyboard.Key.ARROW_LEFT]: "←",
[_Keyboard.Key.ARROW_RIGHT]: "→"
};
const Shortcut
/*: React.FC<{
shortcut: IShortcut;
}>*/
= ({
shortcut
}) => {
const classes = (0, _classnames.default)({
"mx_KeyboardShortcutsDialog_inline": shortcut.keybinds.every(k => !k.modifiers || k.modifiers.length === 0)
});
return /*#__PURE__*/React.createElement("div", {
className: classes
}, /*#__PURE__*/React.createElement("h5", null, (0, _languageHandler._t)(shortcut.description)), shortcut.keybinds.map(s => {
let text = s.key;
if (alternateKeyName[s.key]) {
text = (0, _languageHandler._t)(alternateKeyName[s.key]);
} else if (keyIcon[s.key]) {
text = keyIcon[s.key];
}
return /*#__PURE__*/React.createElement("div", {
key: s.key
}, s.modifiers && s.modifiers.map(m => {
return /*#__PURE__*/React.createElement(React.Fragment, {
key: m
}, /*#__PURE__*/React.createElement("kbd", null, modifierIcon[m] || (0, _languageHandler._t)(m)), "+");
}), /*#__PURE__*/React.createElement("kbd", null, text));
}));
};
let activeModal
/*: IModal*/
= null;
const toggleDialog = () => {
if (activeModal) {
activeModal.close();
activeModal = null;
return;
}
const sections = categoryOrder.map(category => {
const list = shortcuts[category];
return /*#__PURE__*/React.createElement("div", {
className: "mx_KeyboardShortcutsDialog_category",
key: category
}, /*#__PURE__*/React.createElement("h3", null, (0, _languageHandler._t)(category)), /*#__PURE__*/React.createElement("div", null, list.map(shortcut => /*#__PURE__*/React.createElement(Shortcut, {
key: shortcut.description,
shortcut: shortcut
}))));
});
const InfoDialog = sdk.getComponent('dialogs.InfoDialog');
activeModal = _Modal.default.createTrackedDialog("Keyboard Shortcuts", "", InfoDialog, {
className: "mx_KeyboardShortcutsDialog",
title: (0, _languageHandler._t)("Keyboard Shortcuts"),
description: sections,
hasCloseButton: true,
onKeyDown: ev => {
if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey && ev.key === _Keyboard.Key.SLASH) {
// Ctrl + /
ev.stopPropagation();
activeModal.close();
}
},
onFinished: () => {
activeModal = null;
}
});
};
exports.toggleDialog = toggleDialog;
const registerShortcut = (category
/*: Categories*/
, defn
/*: IShortcut*/
) => {
shortcuts[category].push(defn);
};
exports.registerShortcut = registerShortcut;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY2Nlc3NpYmlsaXR5L0tleWJvYXJkU2hvcnRjdXRzLnRzeCJdLCJuYW1lcyI6WyJDYXRlZ29yaWVzIiwiTW9kaWZpZXJzIiwiQ01EX09SX0NUUkwiLCJpc01hYyIsIkNPTU1BTkQiLCJDT05UUk9MIiwic2hvcnRjdXRzIiwiQ09NUE9TRVIiLCJrZXliaW5kcyIsIm1vZGlmaWVycyIsImtleSIsIktleSIsIkIiLCJkZXNjcmlwdGlvbiIsIkkiLCJHUkVBVEVSX1RIQU4iLCJTSElGVCIsIkVOVEVSIiwiQVJST1dfVVAiLCJBUlJPV19ET1dOIiwiSE9NRSIsIkVORCIsIkFMVCIsIkVTQ0FQRSIsIkNBTExTIiwiRCIsIkUiLCJST09NIiwiUEFHRV9VUCIsIlBBR0VfRE9XTiIsIlUiLCJGIiwiUk9PTV9MSVNUIiwiSyIsIkFSUk9XX0xFRlQiLCJBUlJPV19SSUdIVCIsIk5BVklHQVRJT04iLCJCQUNLVElDSyIsIlNQQUNFIiwiUEVSSU9EIiwiU0xBU0giLCJIIiwiQVVUT0NPTVBMRVRFIiwiY2F0ZWdvcnlPcmRlciIsIm1vZGlmaWVySWNvbiIsImFsdGVybmF0ZUtleU5hbWUiLCJrZXlJY29uIiwiU2hvcnRjdXQiLCJzaG9ydGN1dCIsImNsYXNzZXMiLCJldmVyeSIsImsiLCJsZW5ndGgiLCJtYXAiLCJzIiwidGV4dCIsIm0iLCJhY3RpdmVNb2RhbCIsInRvZ2dsZURpYWxvZyIsImNsb3NlIiwic2VjdGlvbnMiLCJjYXRlZ29yeSIsImxpc3QiLCJJbmZvRGlhbG9nIiwic2RrIiwiZ2V0Q29tcG9uZW50IiwiTW9kYWwiLCJjcmVhdGVUcmFja2VkRGlhbG9nIiwiY2xhc3NOYW1lIiwidGl0bGUiLCJoYXNDbG9zZUJ1dHRvbiIsIm9uS2V5RG93biIsImV2IiwiY3RybEtleSIsInNoaWZ0S2V5IiwiYWx0S2V5IiwibWV0YUtleSIsInN0b3BQcm9wYWdhdGlvbiIsIm9uRmluaXNoZWQiLCJyZWdpc3RlclNob3J0Y3V0IiwiZGVmbiIsInB1c2giXSwi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RUFBRSxDQUFDRSxRQUFsQixJQUE4QixDQUFDRixFQUFFLENBQUNHLE1BQWxDLElBQTRDLENBQUNILEVBQUUsQ0FBQ0ksT0FBaEQsSUFBMkRKLEVBQUUsQ0FBQzlELEdBQUgsS0FBV0MsY0FBSTZCLEtBQTlFLEVBQXFGO0FBQUU7QUFDbkZnQyxRQUFBQSxFQUFFLENBQUNLLGVBQUg7QUFDQXBCLFFBQUFBLFdBQVcsQ0FBQ0UsS0FBWjtBQUNIO0FBQ0osS0FWeUU7QUFXMUVtQixJQUFBQSxVQUFVLEVBQUUsTUFBTTtBQUNkckIsTUFBQUEsV0FBVyxHQUFHLElBQWQ7QUFDSDtBQWJ5RSxHQUFoRSxDQUFkO0FBZUgsQ0EvQk07Ozs7QUFpQ0EsTUFBTXNCLGdCQUFnQixHQUFHLENBQUNsQjtBQUFEO0FBQUEsRUFBdUJtQjtBQUF2QjtBQUFBLEtBQTJDO0FBQ3ZFMUUsRUFBQUEsU0FBUyxDQUFDdUQsUUFBRCxDQUFULENBQW9Cb0IsSUFBcEIsQ0FBeUJELElBQXpCO0FBQ0gsQ0FGTSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyMCBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSBcImNsYXNzbmFtZXNcIjtcblxuaW1wb3J0ICogYXMgc2RrIGZyb20gXCIuLi9pbmRleFwiO1xuaW1wb3J0IE1vZGFsIGZyb20gXCIuLi9Nb2RhbFwiO1xuaW1wb3J0IHsgX3QsIF90ZCB9IGZyb20gXCIuLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7aXNNYWMsIEtleX0gZnJvbSBcIi4uL0tleWJvYXJkXCI7XG5cbi8vIFRTOiBvbmNlIGxhbmd1YWdlSGFuZGxlciBpcyBUUyB3ZSBjYW4gcHJvYmFibHkgaW5saW5lIHRoaXMgaW50byB0aGUgZW51bVxuX3RkKFwiTmF2aWdhdGlvblwiKTtcbl90ZChcIkNhbGxzXCIpO1xuX3RkKFwiQ29tcG9zZXJcIik7XG5fdGQoXCJSb29tIExpc3RcIik7XG5fdGQoXCJBdXRvY29tcGxldGVcIik7XG5cbmV4cG9ydCBlbnVtIENhdGVnb3JpZXMge1xuICAgIE5BVklHQVRJT04gPSBcIk5hdmlnYXRpb25cIixcbiAgICBDQUxMUyA9IFwiQ2FsbHNcIixcbiAgICBDT01QT1NFUiA9IFwiQ29tcG9zZXJcIixcbiAgICBST09NX0xJU1QgPSBcIlJvb20gTGlzdFwiLFxuICAgIFJPT00gPSBcIlJvb21cIixcbiAgICBBVVRPQ09NUExFVEUgPSBcIkF1dG9jb21wbGV0ZVwiLFxufVxuXG4vLyBUUzogb25jZSBsYW5ndWFnZUhhbmRsZXIgaXMgVFMgd2UgY2FuIHByb2JhYmx5IGlubGluZSB0aGlzIGludG8gdGhlIGVudW1cbl90ZChcIkFsdFwiKTtcbl90ZChcIkFsdCBHclwiKTtcbl90ZChcIlNoaWZ0XCIpO1xuX3RkKFwiU3VwZXJcIik7XG5fdGQoXCJDdHJsXCIpO1xuXG5leHBvcnQgZW51bSBNb2RpZmllcnMge1xuICAgIEFMVCA9IFwiQWx0XCIsIC8vIE9wdGlvbiBvbiBNYWMgYW5kIGRpc3BsYXllZCBhcyBhbiBJY29uXG4gICAgQUxUX0dSID0gXCJBbHQgR3JcIixcbiAgICBTSElGVCA9IFwiU2hpZnRcIixcbiAgICBTVVBFUiA9IFwiU3VwZXJcIiwgLy8gc2hvdWxkIHRoaXMgYmUgXCJXaW5kb3dzXCI/XG4gICAgLy8gSW5zdGVhZCBvZiB1c2luZyBiZWxvdywgY29uc2lkZXIgQ01EX09SX0NUUkxcbiAgICBDT01NQU5EID0gXCJDb21tYW5kXCIsIC8vIFRoaXMgZ2V0cyBkaXNwbGF5ZWQgYXMgYW4gSWNvblxuICAgIENPTlRST0wgPSBcIkN0cmxcIixcbn1cblxuLy8gTWV0YS1tb2RpZmllcjogaXNNYWMgPyBDTUQgOiBDT05UUk9MXG5leHBvcnQgY29uc3QgQ01EX09SX0NUUkwgPSBpc01hYyA/IE1vZGlmaWVycy5DT01NQU5EIDogTW9kaWZpZXJzLkNPTlRST0w7XG5cbmludGVyZmFjZSBJS2V5YmluZCB7XG4gICAgbW9kaWZpZXJzPzogTW9kaWZpZXJzW107XG4gICAga2V5OiBzdHJpbmc7IC8vIFRTOiBmaXggdGhpcyBvbmNlIEtleSBpcyBhbiBlbnVtXG59XG5cbmludGVyZmFjZSBJU2hvcnRjdXQge1xuICAgIGtleWJpbmRzOiBJS2V5YmluZFtdO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG5cbmNvbnN0IHNob3J0Y3V0czogUmVjb3JkPENhdGVnb3JpZXMsIElTaG9ydGN1dFtdPiA9IHtcbiAgICBbQ2F0ZWdvcmllcy5DT01QT1NFUl06IFtcbiAgICAgICAge1xuICAgICAgICAgICAga2V5YmluZHM6IFt7XG4gICAgICAgICAgICAgICAgbW9kaWZpZXJzOiBbQ01EX09SX0NUUkxdLFxuICAgICAgICAgICAgICAgIGtleTogS2V5LkIsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJUb2dnbGUgQm9sZFwiKSxcbiAgICAgICAgfSwge1xuICAgICAgICAgICAga2V5YmluZHM6IFt7XG4gICAgICAgICAgICAgICAgbW9kaWZpZXJzOiBbQ01EX09SX0NUUkxdLFxuICAgICAgICAgICAgICAgIGtleTogS2V5LkksXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJUb2dnbGUgSXRhbGljc1wiKSxcbiAgICAgICAgfSwge1xuICAgICAgICAgICAga2V5YmluZHM6IFt7XG4gICAgICAgICAgICAgICAgbW9kaWZpZXJzOiBbQ01EX09SX0NUUkxdLFxuICAgICAgICAgICAgICAgIGtleTogS2V5LkdSRUFURVJfVEhBTixcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIlRvZ2dsZSBRdW90ZVwiKSxcbiAgICAgICAgfSwge1xuICAgICAgICAgICAga2V5YmluZHM6IFt7XG4gICAgICAgICAgICAgICAgbW9kaWZpZXJzOiBbTW9kaWZpZXJzLlNISUZUXSxcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5FTlRFUixcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIk5ldyBsaW5lXCIpLFxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBrZXliaW5kczogW3tcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5BUlJPV19VUCxcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5BUlJPV19ET1dOLFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwiTmF2aWdhdGUgcmVjZW50IG1lc3NhZ2VzIHRvIGVkaXRcIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW0NNRF9PUl9DVFJMXSxcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5IT01FLFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW0NNRF9PUl9DVFJMXSxcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5FTkQsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJKdW1wIHRvIHN0YXJ0L2VuZCBvZiB0aGUgY29tcG9zZXJcIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW01vZGlmaWVycy5DT05UUk9MLCBNb2RpZmllcnMuQUxUXSxcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5BUlJPV19VUCxcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBtb2RpZmllcnM6IFtNb2RpZmllcnMuQ09OVFJPTCwgTW9kaWZpZXJzLkFMVF0sXG4gICAgICAgICAgICAgICAga2V5OiBLZXkuQVJST1dfRE9XTixcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIk5hdmlnYXRlIGNvbXBvc2VyIGhpc3RvcnlcIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIGtleTogS2V5LkVTQ0FQRSxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIkNhbmNlbCByZXBseWluZyB0byBhIG1lc3NhZ2VcIiksXG4gICAgICAgIH0sXG4gICAgXSxcblxuICAgIFtDYXRlZ29yaWVzLkNBTExTXTogW1xuICAgICAgICB7XG4gICAgICAgICAgICBrZXliaW5kczogW3tcbiAgICAgICAgICAgICAgICBtb2RpZmllcnM6IFtDTURfT1JfQ1RSTF0sXG4gICAgICAgICAgICAgICAga2V5OiBLZXkuRCxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIlRvZ2dsZSBtaWNyb3Bob25lIG11dGVcIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW0NNRF9PUl9DVFJMXSxcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5FLFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwiVG9nZ2xlIHZpZGVvIG9uL29mZlwiKSxcbiAgICAgICAgfSxcbiAgICBdLFxuXG4gICAgW0NhdGVnb3JpZXMuUk9PTV06IFtcbiAgICAgICAge1xuICAgICAgICAgICAga2V5YmluZHM6IFt7XG4gICAgICAgICAgICAgICAga2V5OiBLZXkuUEFHRV9VUCxcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5QQUdFX0RPV04sXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJTY3JvbGwgdXAvZG93biBpbiB0aGUgdGltZWxpbmVcIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIGtleTogS2V5LkVTQ0FQRSxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIkRpc21pc3MgcmVhZCBtYXJrZXIgYW5kIGp1bXAgdG8gYm90dG9tXCIpLFxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBrZXliaW5kczogW3tcbiAgICAgICAgICAgICAgICBtb2RpZmllcnM6IFtNb2RpZmllcnMuU0hJRlRdLFxuICAgICAgICAgICAgICAgIGtleTogS2V5LlBBR0VfVVAsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwiSnVtcCB0byBvbGRlc3QgdW5yZWFkIG1lc3NhZ2VcIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW0NNRF9PUl9DVFJMLCBNb2RpZmllcnMuU0hJRlRdLFxuICAgICAgICAgICAgICAgIGtleTogS2V5LlUsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJVcGxvYWQgYSBmaWxlXCIpLFxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBrZXliaW5kczogW3tcbiAgICAgICAgICAgICAgICBtb2RpZmllcnM6IFtDTURfT1JfQ1RSTF0sXG4gICAgICAgICAgICAgICAga2V5OiBLZXkuRixcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIlNlYXJjaCAobXVzdCBiZSBlbmFibGVkKVwiKSxcbiAgICAgICAgfSxcbiAgICBdLFxuXG4gICAgW0NhdGVnb3JpZXMuUk9PTV9MSVNUXTogW1xuICAgICAgICB7XG4gICAgICAgICAgICBrZXliaW5kczogW3tcbiAgICAgICAgICAgICAgICBtb2RpZmllcnM6IFtDTURfT1JfQ1RSTF0sXG4gICAgICAgICAgICAgICAga2V5OiBLZXkuSyxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIkp1bXAgdG8gcm9vbSBzZWFyY2hcIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIGtleTogS2V5LkFSUk9XX1VQLFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogS2V5LkFSUk9XX0RPV04sXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJOYXZpZ2F0ZSB1cC9kb3duIGluIHRoZSByb29tIGxpc3RcIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIGtleTogS2V5LkVOVEVSLFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwiU2VsZWN0IHJvb20gZnJvbSB0aGUgcm9vbSBsaXN0XCIpLFxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBrZXliaW5kczogW3tcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5BUlJPV19MRUZULFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwiQ29sbGFwc2Ugcm9vbSBsaXN0IHNlY3Rpb25cIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIGtleTogS2V5LkFSUk9XX1JJR0hULFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwiRXhwYW5kIHJvb20gbGlzdCBzZWN0aW9uXCIpLFxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBrZXliaW5kczogW3tcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5FU0NBUEUsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJDbGVhciByb29tIGxpc3QgZmlsdGVyIGZpZWxkXCIpLFxuICAgICAgICB9LFxuICAgIF0sXG5cbiAgICBbQ2F0ZWdvcmllcy5OQVZJR0FUSU9OXTogW1xuICAgICAgICB7XG4gICAgICAgICAgICBrZXliaW5kczogW3tcbiAgICAgICAgICAgICAgICBtb2RpZmllcnM6IFtNb2RpZmllcnMuQUxULCBNb2RpZmllcnMuU0hJRlRdLFxuICAgICAgICAgICAgICAgIGtleTogS2V5LkFSUk9XX1VQLFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW01vZGlmaWVycy5BTFQsIE1vZGlmaWVycy5TSElGVF0sXG4gICAgICAgICAgICAgICAga2V5OiBLZXkuQVJST1dfRE9XTixcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIlByZXZpb3VzL25leHQgdW5yZWFkIHJvb20gb3IgRE1cIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW01vZGlmaWVycy5BTFRdLFxuICAgICAgICAgICAgICAgIGtleTogS2V5LkFSUk9XX1VQLFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW01vZGlmaWVycy5BTFRdLFxuICAgICAgICAgICAgICAgIGtleTogS2V5LkFSUk9XX0RPV04sXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJQcmV2aW91cy9uZXh0IHJvb20gb3IgRE1cIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW0NNRF9PUl9DVFJMXSxcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5CQUNLVElDSyxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIlRvZ2dsZSB0aGUgdG9wIGxlZnQgbWVudVwiKSxcbiAgICAgICAgfSwge1xuICAgICAgICAgICAga2V5YmluZHM6IFt7XG4gICAgICAgICAgICAgICAga2V5OiBLZXkuRVNDQVBFLFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwiQ2xvc2UgZGlhbG9nIG9yIGNvbnRleHQgbWVudVwiKSxcbiAgICAgICAgfSwge1xuICAgICAgICAgICAga2V5YmluZHM6IFt7XG4gICAgICAgICAgICAgICAga2V5OiBLZXkuRU5URVIsXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBLZXkuU1BBQ0UsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJBY3RpdmF0ZSBzZWxlY3RlZCBidXR0b25cIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW0NNRF9PUl9DVFJMXSxcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5QRVJJT0QsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJUb2dnbGUgcmlnaHQgcGFuZWxcIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogW0NNRF9PUl9DVFJMXSxcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5TTEFTSCxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIlRvZ2dsZSB0aGlzIGRpYWxvZ1wiKSxcbiAgICAgICAgfSwge1xuICAgICAgICAgICAga2V5YmluZHM6IFt7XG4gICAgICAgICAgICAgICAgbW9kaWZpZXJzOiBbTW9kaWZpZXJzLkNPTlRST0wsIGlzTWFjID8gTW9kaWZpZXJzLlNISUZUIDogTW9kaWZpZXJzLkFMVF0sXG4gICAgICAgICAgICAgICAga2V5OiBLZXkuSCxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIkdvIHRvIEhvbWUgVmlld1wiKSxcbiAgICAgICAgfSxcbiAgICBdLFxuXG4gICAgW0NhdGVnb3JpZXMuQVVUT0NPTVBMRVRFXTogW1xuICAgICAgICB7XG4gICAgICAgICAgICBrZXliaW5kczogW3tcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5BUlJPV19VUCxcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IEtleS5BUlJPV19ET1dOLFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwiTW92ZSBhdXRvY29tcGxldGUgc2VsZWN0aW9uIHVwL2Rvd25cIiksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleWJpbmRzOiBbe1xuICAgICAgICAgICAgICAgIGtleTogS2V5LkVTQ0FQRSxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90ZChcIkNhbmNlbCBhdXRvY29tcGxldGVcIiksXG4gICAgICAgIH0sXG4gICAgXSxcbn07XG5cbmNvbnN0IGNhdGVnb3J5T3JkZXIgPSBbXG4gICAgQ2F0ZWdvcmllcy5DT01QT1NFUixcbiAgICBDYXRlZ29yaWVzLkFVVE9DT01QTEVURSxcbiAgICBDYXRlZ29yaWVzLlJPT00sXG4gICAgQ2F0ZWdvcmllcy5ST09NX0xJU1QsXG4gICAgQ2F0ZWdvcmllcy5OQVZJR0FUSU9OLFxuICAgIENhdGVnb3JpZXMuQ0FMTFMsXG5dO1xuXG5pbnRlcmZhY2UgSU1vZGFsIHtcbiAgICBjbG9zZTogKCkgPT4gdm9pZDtcbiAgICBmaW5pc2hlZDogUHJvbWlzZTxhbnlbXT47XG59XG5cbmNvbnN0IG1vZGlmaWVySWNvbjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBbTW9kaWZpZXJzLkNPTU1BTkRdOiBcIuKMmFwiLFxufTtcblxuaWYgKGlzTWFjKSB7XG4gICAgbW9kaWZpZXJJY29uW01vZGlmaWVycy5BTFRdID0gXCLijKVcIjtcbn1cblxuY29uc3QgYWx0ZXJuYXRlS2V5TmFtZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBbS2V5LlBBR0VfVVBdOiBfdGQoXCJQYWdlIFVwXCIpLFxuICAgIFtLZXkuUEFHRV9ET1dOXTogX3RkKFwiUGFnZSBEb3duXCIpLFxuICAgIFtLZXkuRVNDQVBFXTogX3RkKFwiRXNjXCIpLFxuICAgIFtLZXkuRU5URVJdOiBfdGQoXCJFbnRlclwiKSxcbiAgICBbS2V5LlNQQUNFXTogX3RkKFwiU3BhY2VcIiksXG4gICAgW0tleS5IT01FXTogX3RkKFwiSG9tZVwiKSxcbiAgICBbS2V5LkVORF06IF90ZChcIkVuZFwiKSxcbn07XG5jb25zdCBrZXlJY29uOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIFtLZXkuQVJST1dfVVBdOiBcIuKGkVwiLFxuICAgIFtLZXkuQVJST1dfRE9XTl06IFwi4oaTXCIsXG4gICAgW0tleS5BUlJPV19MRUZUXTogXCLihpBcIixcbiAgICBbS2V5LkFSUk9XX1JJR0hUXTogXCLihpJcIixcbn07XG5cbmNvbnN0IFNob3J0Y3V0OiBSZWFjdC5GQzx7XG4gICAgc2hvcnRjdXQ6IElTaG9ydGN1dDtcbn0+ID0gKHtzaG9ydGN1dH0pID0+IHtcbiAgICBjb25zdCBjbGFzc2VzID0gY2xhc3NOYW1lcyh7XG4gICAgICAgIFwibXhfS2V5Ym9hcmRTaG9ydGN1dHNEaWFsb2dfaW5saW5lXCI6IHNob3J0Y3V0LmtleWJpbmRzLmV2ZXJ5KGsgPT4gIWsubW9kaWZpZXJzIHx8IGsubW9kaWZpZXJzLmxlbmd0aCA9PT0gMCksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e2NsYXNzZXN9PlxuICAgICAgICA8aDU+eyBfdChzaG9ydGN1dC5kZXNjcmlwdGlvbikgfTwvaDU+XG4gICAgICAgIHsgc2hvcnRjdXQua2V5YmluZHMubWFwKHMgPT4ge1xuICAgICAgICAgICAgbGV0IHRleHQgPSBzLmtleTtcbiAgICAgICAgICAgIGlmIChhbHRlcm5hdGVLZXlOYW1lW3Mua2V5XSkge1xuICAgICAgICAgICAgICAgIHRleHQgPSBfdChhbHRlcm5hdGVLZXlOYW1lW3Mua2V5XSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGtleUljb25bcy5rZXldKSB7XG4gICAgICAgICAgICAgICAgdGV4dCA9IGtleUljb25bcy5rZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gPGRpdiBrZXk9e3Mua2V5fT5cbiAgICAgICAgICAgICAgICB7IHMubW9kaWZpZXJzICYmIHMubW9kaWZpZXJzLm1hcChtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxSZWFjdC5GcmFnbWVudCBrZXk9e219PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGtiZD57IG1vZGlmaWVySWNvblttXSB8fCBfdChtKSB9PC9rYmQ+K1xuICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PjtcbiAgICAgICAgICAgICAgICB9KSB9XG4gICAgICAgICAgICAgICAgPGtiZD57IHRleHQgfTwva2JkPlxuICAgICAgICAgICAgPC9kaXY+O1xuICAgICAgICB9KSB9XG4gICAgPC9kaXY+O1xufTtcblxubGV0IGFjdGl2ZU1vZGFsOiBJTW9kYWwgPSBudWxsO1xuZXhwb3J0IGNvbnN0IHRvZ2dsZURpYWxvZyA9ICgpID0+IHtcbiAgICBpZiAoYWN0aXZlTW9kYWwpIHtcbiAgICAgICAgYWN0aXZlTW9kYWwuY2xvc2UoKTtcbiAgICAgICAgYWN0aXZlTW9kYWwgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VjdGlvbnMgPSBjYXRlZ29yeU9yZGVyLm1hcChjYXRlZ29yeSA9PiB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBzaG9ydGN1dHNbY2F0ZWdvcnldO1xuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJteF9LZXlib2FyZFNob3J0Y3V0c0RpYWxvZ19jYXRlZ29yeVwiIGtleT17Y2F0ZWdvcnl9PlxuICAgICAgICAgICAgPGgzPntfdChjYXRlZ29yeSl9PC9oMz5cbiAgICAgICAgICAgIDxkaXY+e2xpc3QubWFwKHNob3J0Y3V0ID0+IDxTaG9ydGN1dCBrZXk9e3Nob3J0Y3V0LmRlc2NyaXB0aW9ufSBzaG9ydGN1dD17c2hvcnRjdXR9IC8+KX08L2Rpdj5cbiAgICAgICAgPC9kaXY+O1xuICAgIH0pO1xuXG4gICAgY29uc3QgSW5mb0RpYWxvZyA9IHNkay5nZXRDb21wb25lbnQoJ2RpYWxvZ3MuSW5mb0RpYWxvZycpO1xuICAgIGFjdGl2ZU1vZGFsID0gTW9kYWwuY3JlYXRlVHJhY2tlZERpYWxvZyhcIktleWJvYXJkIFNob3J0Y3V0c1wiLCBcIlwiLCBJbmZvRGlhbG9nLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJteF9LZXlib2FyZFNob3J0Y3V0c0RpYWxvZ1wiLFxuICAgICAgICB0aXRsZTogX3QoXCJLZXlib2FyZCBTaG9ydGN1dHNcIiksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBzZWN0aW9ucyxcbiAgICAgICAgaGFzQ2xvc2VCdXR0b246IHRydWUsXG4gICAgICAgIG9uS2V5RG93bjogKGV2KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXYuY3RybEtleSAmJiAhZXYuc2hpZnRLZXkgJiYgIWV2LmFsdEtleSAmJiAhZXYubWV0YUtleSAmJiBldi5rZXkgPT09IEtleS5TTEFTSCkgeyAvLyBDdHJsICsgL1xuICAgICAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGFjdGl2ZU1vZGFsLmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uRmluaXNoZWQ6ICgpID0+IHtcbiAgICAgICAgICAgIGFjdGl2ZU1vZGFsID0gbnVsbDtcbiAgICAgICAgfSxcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlclNob3J0Y3V0ID0gKGNhdGVnb3J5OiBDYXRlZ29yaWVzLCBkZWZuOiBJU2hvcnRjdXQpID0+IHtcbiAgICBzaG9ydGN1dHNbY2F0ZWdvcnldLnB1c2goZGVmbik7XG59O1xuIl19