@blueprintjs/core
Version:
Core styles & components
118 lines (116 loc) • 15 kB
JavaScript
/*
* Copyright 2016 Palantir Technologies, Inc. All rights reserved.
* Licensed under the BSD-3 License as modified (the “License”); you may obtain a copy
* of the license at https://github.com/palantir/blueprint/blob/master/LICENSE
* and https://github.com/palantir/blueprint/blob/master/PATENTS
*/
;
var __assign = (this && this.__assign) || Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
var classNames = require("classnames");
var React = require("react");
var ReactDOM = require("react-dom");
var common_1 = require("../../common");
var components_1 = require("../../components");
var hotkey_1 = require("./hotkey");
var hotkeys_1 = require("./hotkeys");
var HotkeysDialog = (function () {
function HotkeysDialog() {
var _this = this;
this.hotkeysDialogProps = {
globalHotkeysGroup: "Global hotkeys",
};
this.showing = false;
this.hotkeysQueue = [];
this.timeoutToken = 0;
this.unmount = function () {
_this.showing = false;
return ReactDOM.unmountComponentAtNode(_this.getContainer());
};
this.destroy = function () {
_this.showing = false;
if (_this.container != null) {
ReactDOM.unmountComponentAtNode(_this.container);
_this.container.remove();
delete _this.container;
}
};
this.renderHotkeysDialog = function () {
_this.showing = true;
_this.render(React.createElement(components_1.Dialog, __assign({}, _this.hotkeysDialogProps, {className: classNames(_this.hotkeysDialogProps.className, "pt-hotkey-dialog"), inline: true, isOpen: true, onClose: _this.unmount}),
React.createElement("div", {className: common_1.Classes.DIALOG_BODY}, _this.renderHotkeys())
));
};
}
HotkeysDialog.prototype.render = function (node) {
return ReactDOM.render(node, this.getContainer());
};
/**
* Because hotkeys can be registered globally and locally and because
* event ordering cannot be guaranteed, we use this debouncing method to
* allow all hotkey listeners to fire and add their hotkeys to the dialog.
*
* 10msec after the last listener adds their hotkeys, we render the dialog
* and clear the queue.
*/
HotkeysDialog.prototype.enqueueHotkeysForDisplay = function (hotkeys) {
this.hotkeysQueue.push(hotkeys);
// reset timeout for debounce
clearTimeout(this.timeoutToken);
this.timeoutToken = setTimeout(this.renderHotkeysDialog, 10);
};
HotkeysDialog.prototype.getContainer = function () {
if (this.container == null) {
this.container = document.createElement("div");
this.container.classList.add(common_1.Classes.PORTAL);
document.body.appendChild(this.container);
}
return this.container;
};
HotkeysDialog.prototype.renderHotkeys = function () {
var _this = this;
var hotkeys = this.emptyHotkeyQueue();
var elements = hotkeys.map(function (hotkey, index) {
var group = (hotkey.global === true && hotkey.group == null) ?
_this.hotkeysDialogProps.globalHotkeysGroup : hotkey.group;
return React.createElement(hotkey_1.Hotkey, __assign({key: index}, hotkey, {group: group}));
});
return React.createElement(hotkeys_1.Hotkeys, null, elements);
};
HotkeysDialog.prototype.emptyHotkeyQueue = function () {
// flatten then empty the hotkeys queue
var hotkeys = this.hotkeysQueue.reduce((function (arr, queued) { return arr.concat(queued); }), []);
this.hotkeysQueue.length = 0;
return hotkeys;
};
return HotkeysDialog;
}());
// singleton instance
var HOTKEYS_DIALOG = new HotkeysDialog();
function isHotkeysDialogShowing() {
return HOTKEYS_DIALOG.showing;
}
exports.isHotkeysDialogShowing = isHotkeysDialogShowing;
function setHotkeysDialogProps(props) {
for (var key in props) {
if (props.hasOwnProperty(key)) {
HOTKEYS_DIALOG.hotkeysDialogProps[key] = props[key];
}
}
}
exports.setHotkeysDialogProps = setHotkeysDialogProps;
function showHotkeysDialog(hotkeys) {
HOTKEYS_DIALOG.enqueueHotkeysForDisplay(hotkeys);
}
exports.showHotkeysDialog = showHotkeysDialog;
function hideHotkeysDialog() {
HOTKEYS_DIALOG.unmount();
}
exports.hideHotkeysDialog = hideHotkeysDialog;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21wb25lbnRzL2hvdGtleXMvaG90a2V5c0RpYWxvZy50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7Ozs7Ozs7Ozs7QUFFSCxJQUFZLFVBQVUsV0FBTSxZQUFZLENBQUMsQ0FBQTtBQUN6QyxJQUFZLEtBQUssV0FBTSxPQUFPLENBQUMsQ0FBQTtBQUMvQixJQUFZLFFBQVEsV0FBTSxXQUFXLENBQUMsQ0FBQTtBQUV0Qyx1QkFBd0IsY0FBYyxDQUFDLENBQUE7QUFDdkMsMkJBQXFDLGtCQUFrQixDQUFDLENBQUE7QUFDeEQsdUJBQXFDLFVBQVUsQ0FBQyxDQUFBO0FBQ2hELHdCQUF3QixXQUFXLENBQUMsQ0FBQTtBQVVwQztJQUFBO1FBQUEsaUJBcUZDO1FBcEZVLHVCQUFrQixHQUFHO1lBQ3hCLGtCQUFrQixFQUFFLGdCQUFnQjtTQUNULENBQUM7UUFDekIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNmLGlCQUFZLEdBQUcsRUFBc0IsQ0FBQztRQUN0QyxpQkFBWSxHQUFHLENBQUMsQ0FBQztRQU9sQixZQUFPLEdBQUc7WUFDYixLQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixNQUFNLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLEtBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQTtRQUVNLFlBQU8sR0FBRztZQUNiLEtBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLEVBQUUsQ0FBQyxDQUFDLEtBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDekIsUUFBUSxDQUFDLHNCQUFzQixDQUFDLEtBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDaEQsS0FBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDeEIsT0FBTyxLQUFJLENBQUMsU0FBUyxDQUFDO1lBQzFCLENBQUM7UUFDTCxDQUFDLENBQUE7UUEyQk8sd0JBQW1CLEdBQUc7WUFDMUIsS0FBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDcEIsS0FBSSxDQUFDLE1BQU0sQ0FDUCxvQkFBQyxtQkFBTSxlQUNDLEtBQUksQ0FBQyxrQkFBa0IsR0FDM0IsU0FBUyxFQUFFLFVBQVUsQ0FBQyxLQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLGtCQUFrQixDQUFFLEVBQzdFLE1BQU0sUUFDTixNQUFNLFFBQ04sT0FBTyxFQUFFLEtBQUksQ0FBQyxPQUFRO2dCQUV0QixxQkFBQyxHQUFHLElBQUMsU0FBUyxFQUFFLGdCQUFPLENBQUMsV0FBWSxHQUFFLEtBQUksQ0FBQyxhQUFhLEVBQUcsQ0FBTTthQUM1RCxDQUNaLENBQUM7UUFDTixDQUFDLENBQUE7SUFvQkwsQ0FBQztJQTVFVSw4QkFBTSxHQUFiLFVBQWMsSUFBNkI7UUFDdkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFnQkQ7Ozs7Ozs7T0FPRztJQUNJLGdEQUF3QixHQUEvQixVQUFnQyxPQUF1QjtRQUNuRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVoQyw2QkFBNkI7UUFDN0IsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVPLG9DQUFZLEdBQXBCO1FBQ0ksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsZ0JBQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFpQk8scUNBQWEsR0FBckI7UUFBQSxpQkFVQztRQVRHLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hDLElBQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBQyxNQUFNLEVBQUUsS0FBSztZQUN2QyxJQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDO2dCQUMxRCxLQUFJLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUU5RCxNQUFNLENBQUMsb0JBQUMsZUFBTSxZQUFDLEdBQUcsRUFBRSxLQUFNLEdBQUssTUFBTSxHQUFFLEtBQUssRUFBRSxLQUFNLEdBQUcsQ0FBQztRQUM1RCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxvQkFBQyxpQkFBTyxRQUFFLFFBQVMsQ0FBVSxDQUFDO0lBQ3pDLENBQUM7SUFFTyx3Q0FBZ0IsR0FBeEI7UUFDSSx1Q0FBdUM7UUFDdkMsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFDLEdBQUcsRUFBRSxNQUFNLElBQUssT0FBQSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFsQixDQUFrQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUNMLG9CQUFDO0FBQUQsQ0FyRkEsQUFxRkMsSUFBQTtBQUVELHFCQUFxQjtBQUNyQixJQUFNLGNBQWMsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO0FBRTNDO0lBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7QUFDbEMsQ0FBQztBQUZlLDhCQUFzQix5QkFFckMsQ0FBQTtBQUVELCtCQUFzQyxLQUEwQjtJQUM1RCxHQUFHLENBQUMsQ0FBQyxJQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLGNBQWMsQ0FBQyxrQkFBMEIsQ0FBQyxHQUFHLENBQUMsR0FBSSxLQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUUsQ0FBQztJQUNMLENBQUM7QUFDTCxDQUFDO0FBTmUsNkJBQXFCLHdCQU1wQyxDQUFBO0FBRUQsMkJBQWtDLE9BQXVCO0lBQ3JELGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRmUseUJBQWlCLG9CQUVoQyxDQUFBO0FBRUQ7SUFDSSxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDN0IsQ0FBQztBQUZlLHlCQUFpQixvQkFFaEMsQ0FBQSIsImZpbGUiOiJjb21wb25lbnRzL2hvdGtleXMvaG90a2V5c0RpYWxvZy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNiBQYWxhbnRpciBUZWNobm9sb2dpZXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBCU0QtMyBMaWNlbnNlIGFzIG1vZGlmaWVkICh0aGUg4oCcTGljZW5zZeKAnSk7IHlvdSBtYXkgb2J0YWluIGEgY29weVxuICogb2YgdGhlIGxpY2Vuc2UgYXQgaHR0cHM6Ly9naXRodWIuY29tL3BhbGFudGlyL2JsdWVwcmludC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKiBhbmQgaHR0cHM6Ly9naXRodWIuY29tL3BhbGFudGlyL2JsdWVwcmludC9ibG9iL21hc3Rlci9QQVRFTlRTXG4gKi9cblxuaW1wb3J0ICogYXMgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgKiBhcyBSZWFjdERPTSBmcm9tIFwicmVhY3QtZG9tXCI7XG5cbmltcG9ydCB7IENsYXNzZXMgfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQgeyBEaWFsb2csIElEaWFsb2dQcm9wcyB9IGZyb20gXCIuLi8uLi9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBIb3RrZXksIElIb3RrZXlQcm9wcyB9IGZyb20gXCIuL2hvdGtleVwiO1xuaW1wb3J0IHsgSG90a2V5cyB9IGZyb20gXCIuL2hvdGtleXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJSG90a2V5c0RpYWxvZ1Byb3BzIGV4dGVuZHMgSURpYWxvZ1Byb3BzIHtcbiAgICAvKipcbiAgICAgKiBUaGlzIHN0cmluZyBkaXNwbGF5ZWQgYXMgdGhlIGdyb3VwIG5hbWUgaW4gdGhlIGhvdGtleXMgZGlhbG9nIGZvciBhbGxcbiAgICAgKiBnbG9iYWwgaG90a2V5cy5cbiAgICAgKi9cbiAgICBnbG9iYWxIb3RrZXlzR3JvdXA/OiBzdHJpbmc7XG59XG5cbmNsYXNzIEhvdGtleXNEaWFsb2cge1xuICAgIHB1YmxpYyBob3RrZXlzRGlhbG9nUHJvcHMgPSB7XG4gICAgICAgIGdsb2JhbEhvdGtleXNHcm91cDogXCJHbG9iYWwgaG90a2V5c1wiLFxuICAgIH0gYXMgYW55IGFzIElIb3RrZXlzRGlhbG9nUHJvcHM7XG4gICAgcHVibGljIHNob3dpbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIGhvdGtleXNRdWV1ZSA9IFtdIGFzIElIb3RrZXlQcm9wc1tdW107XG4gICAgcHJpdmF0ZSB0aW1lb3V0VG9rZW4gPSAwO1xuICAgIHByaXZhdGUgY29udGFpbmVyOiBIVE1MRWxlbWVudDtcblxuICAgIHB1YmxpYyByZW5kZXIobm9kZTogUmVhY3QuUmVhY3RFbGVtZW50PGFueT4pIHtcbiAgICAgICAgcmV0dXJuIFJlYWN0RE9NLnJlbmRlcihub2RlLCB0aGlzLmdldENvbnRhaW5lcigpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdW5tb3VudCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93aW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlKHRoaXMuZ2V0Q29udGFpbmVyKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyICE9IG51bGwpIHtcbiAgICAgICAgICAgIFJlYWN0RE9NLnVubW91bnRDb21wb25lbnRBdE5vZGUodGhpcy5jb250YWluZXIpO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlKCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCZWNhdXNlIGhvdGtleXMgY2FuIGJlIHJlZ2lzdGVyZWQgZ2xvYmFsbHkgYW5kIGxvY2FsbHkgYW5kIGJlY2F1c2VcbiAgICAgKiBldmVudCBvcmRlcmluZyBjYW5ub3QgYmUgZ3VhcmFudGVlZCwgd2UgdXNlIHRoaXMgZGVib3VuY2luZyBtZXRob2QgdG9cbiAgICAgKiBhbGxvdyBhbGwgaG90a2V5IGxpc3RlbmVycyB0byBmaXJlIGFuZCBhZGQgdGhlaXIgaG90a2V5cyB0byB0aGUgZGlhbG9nLlxuICAgICAqXG4gICAgICogMTBtc2VjIGFmdGVyIHRoZSBsYXN0IGxpc3RlbmVyIGFkZHMgdGhlaXIgaG90a2V5cywgd2UgcmVuZGVyIHRoZSBkaWFsb2dcbiAgICAgKiBhbmQgY2xlYXIgdGhlIHF1ZXVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBlbnF1ZXVlSG90a2V5c0ZvckRpc3BsYXkoaG90a2V5czogSUhvdGtleVByb3BzW10pIHtcbiAgICAgICAgdGhpcy5ob3RrZXlzUXVldWUucHVzaChob3RrZXlzKTtcblxuICAgICAgICAvLyByZXNldCB0aW1lb3V0IGZvciBkZWJvdW5jZVxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0VG9rZW4pO1xuICAgICAgICB0aGlzLnRpbWVvdXRUb2tlbiA9IHNldFRpbWVvdXQodGhpcy5yZW5kZXJIb3RrZXlzRGlhbG9nLCAxMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDb250YWluZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lciA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKENsYXNzZXMuUE9SVEFMKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlckhvdGtleXNEaWFsb2cgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2hvd2luZyA9IHRydWU7XG4gICAgICAgIHRoaXMucmVuZGVyKFxuICAgICAgICAgICAgPERpYWxvZ1xuICAgICAgICAgICAgICAgIHsuLi50aGlzLmhvdGtleXNEaWFsb2dQcm9wc31cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXModGhpcy5ob3RrZXlzRGlhbG9nUHJvcHMuY2xhc3NOYW1lLCBcInB0LWhvdGtleS1kaWFsb2dcIil9XG4gICAgICAgICAgICAgICAgaW5saW5lXG4gICAgICAgICAgICAgICAgaXNPcGVuXG4gICAgICAgICAgICAgICAgb25DbG9zZT17dGhpcy51bm1vdW50fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtDbGFzc2VzLkRJQUxPR19CT0RZfT57dGhpcy5yZW5kZXJIb3RrZXlzKCl9PC9kaXY+XG4gICAgICAgICAgICA8L0RpYWxvZz4sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJIb3RrZXlzKCkge1xuICAgICAgICBjb25zdCBob3RrZXlzID0gdGhpcy5lbXB0eUhvdGtleVF1ZXVlKCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gaG90a2V5cy5tYXAoKGhvdGtleSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gKGhvdGtleS5nbG9iYWwgPT09IHRydWUgJiYgaG90a2V5Lmdyb3VwID09IG51bGwpID9cbiAgICAgICAgICAgICAgICB0aGlzLmhvdGtleXNEaWFsb2dQcm9wcy5nbG9iYWxIb3RrZXlzR3JvdXAgOiBob3RrZXkuZ3JvdXA7XG5cbiAgICAgICAgICAgIHJldHVybiA8SG90a2V5IGtleT17aW5kZXh9IHsuLi5ob3RrZXl9IGdyb3VwPXtncm91cH0gLz47XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiA8SG90a2V5cz57ZWxlbWVudHN9PC9Ib3RrZXlzPjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVtcHR5SG90a2V5UXVldWUoKSB7XG4gICAgICAgIC8vIGZsYXR0ZW4gdGhlbiBlbXB0eSB0aGUgaG90a2V5cyBxdWV1ZVxuICAgICAgICBjb25zdCBob3RrZXlzID0gdGhpcy5ob3RrZXlzUXVldWUucmVkdWNlKCgoYXJyLCBxdWV1ZWQpID0+IGFyci5jb25jYXQocXVldWVkKSksIFtdKTtcbiAgICAgICAgdGhpcy5ob3RrZXlzUXVldWUubGVuZ3RoID0gMDtcbiAgICAgICAgcmV0dXJuIGhvdGtleXM7XG4gICAgfVxufVxuXG4vLyBzaW5nbGV0b24gaW5zdGFuY2VcbmNvbnN0IEhPVEtFWVNfRElBTE9HID0gbmV3IEhvdGtleXNEaWFsb2coKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzSG90a2V5c0RpYWxvZ1Nob3dpbmcoKSB7XG4gICAgcmV0dXJuIEhPVEtFWVNfRElBTE9HLnNob3dpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRIb3RrZXlzRGlhbG9nUHJvcHMocHJvcHM6IElIb3RrZXlzRGlhbG9nUHJvcHMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgKEhPVEtFWVNfRElBTE9HLmhvdGtleXNEaWFsb2dQcm9wcyBhcyBhbnkpW2tleV0gPSAocHJvcHMgYXMgYW55KVtrZXldO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvd0hvdGtleXNEaWFsb2coaG90a2V5czogSUhvdGtleVByb3BzW10pIHtcbiAgICBIT1RLRVlTX0RJQUxPRy5lbnF1ZXVlSG90a2V5c0ZvckRpc3BsYXkoaG90a2V5cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoaWRlSG90a2V5c0RpYWxvZygpIHtcbiAgICBIT1RLRVlTX0RJQUxPRy51bm1vdW50KCk7XG59XG4iXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0=