matrix-react-sdk
Version:
SDK for matrix.org using React
234 lines (195 loc) • 25.3 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 _classnames = _interopRequireDefault(require("classnames"));
var _dispatcher = _interopRequireDefault(require("../../dispatcher/dispatcher"));
var _languageHandler = require("../../languageHandler");
var _AccessibleButton = _interopRequireDefault(require("../views/elements/AccessibleButton"));
var _actions = require("../../dispatcher/actions");
var _RoomListStore = _interopRequireDefault(require("../../stores/room-list/RoomListStore"));
var _NameFilterCondition = require("../../stores/room-list/filters/NameFilterCondition");
var _KeyBindingsManager = require("../../KeyBindingsManager");
var _replaceableComponent = require("../../utils/replaceableComponent");
var _SpaceStore = _interopRequireWildcard(require("../../stores/SpaceStore"));
var _dec, _class, _temp;
let RoomSearch = (_dec = (0, _replaceableComponent.replaceableComponent)("structures.RoomSearch"), _dec(_class = (_temp = class RoomSearch extends React.PureComponent
/*:: <IProps, IState>*/
{
constructor(props
/*: IProps*/
) {
super(props);
(0, _defineProperty2.default)(this, "dispatcherRef", void 0);
(0, _defineProperty2.default)(this, "inputRef", /*#__PURE__*/(0, React.createRef)());
(0, _defineProperty2.default)(this, "searchFilter", new _NameFilterCondition.NameFilterCondition());
(0, _defineProperty2.default)(this, "onSpaces", (spaces
/*: Room[]*/
) => {
this.setState({
inSpaces: spaces.length > 0
});
});
(0, _defineProperty2.default)(this, "onAction", (payload
/*: ActionPayload*/
) => {
if (payload.action === 'view_room' && payload.clear_search) {
this.clearInput();
} else if (payload.action === 'focus_room_filter' && this.inputRef.current) {
this.inputRef.current.focus();
}
});
(0, _defineProperty2.default)(this, "clearInput", () => {
if (!this.inputRef.current) return;
this.inputRef.current.value = "";
this.onChange();
});
(0, _defineProperty2.default)(this, "openSearch", () => {
_dispatcher.default.dispatch({
action: "show_left_panel"
});
_dispatcher.default.dispatch({
action: "focus_room_filter"
});
});
(0, _defineProperty2.default)(this, "onChange", () => {
if (!this.inputRef.current) return;
this.setState({
query: this.inputRef.current.value
});
});
(0, _defineProperty2.default)(this, "onFocus", (ev
/*: React.FocusEvent<HTMLInputElement>*/
) => {
this.setState({
focused: true
});
ev.target.select();
});
(0, _defineProperty2.default)(this, "onBlur", (ev
/*: React.FocusEvent<HTMLInputElement>*/
) => {
this.setState({
focused: false
});
});
(0, _defineProperty2.default)(this, "onKeyDown", (ev
/*: React.KeyboardEvent*/
) => {
const action = (0, _KeyBindingsManager.getKeyBindingsManager)().getRoomListAction(ev);
switch (action) {
case _KeyBindingsManager.RoomListAction.ClearSearch:
this.clearInput();
_dispatcher.default.fire(_actions.Action.FocusComposer);
break;
case _KeyBindingsManager.RoomListAction.NextRoom:
case _KeyBindingsManager.RoomListAction.PrevRoom:
// we don't handle these actions here put pass the event on to the interested party (LeftPanel)
this.props.onKeyDown(ev);
break;
case _KeyBindingsManager.RoomListAction.SelectRoom:
{
const shouldClear = this.props.onSelectRoom();
if (shouldClear) {
// wrap in set immediate to delay it so that we don't clear the filter & then change room
setImmediate(() => {
this.clearInput();
});
}
break;
}
}
});
this.state = {
query: "",
focused: false,
inSpaces: false
};
this.dispatcherRef = _dispatcher.default.register(this.onAction); // clear filter when changing spaces, in future we may wish to maintain a filter per-space
_SpaceStore.default.instance.on(_SpaceStore.UPDATE_SELECTED_SPACE, this.clearInput);
_SpaceStore.default.instance.on(_SpaceStore.UPDATE_TOP_LEVEL_SPACES, this.onSpaces);
}
componentDidUpdate(prevProps
/*: Readonly<IProps>*/
, prevState
/*: Readonly<IState>*/
)
/*: void*/
{
if (prevState.query !== this.state.query) {
const hadSearch = !!this.searchFilter.search.trim();
const haveSearch = !!this.state.query.trim();
this.searchFilter.search = this.state.query;
if (!hadSearch && haveSearch) {
// started a new filter - add the condition
_RoomListStore.default.instance.addFilter(this.searchFilter);
} else if (hadSearch && !haveSearch) {
// cleared a filter - remove the condition
_RoomListStore.default.instance.removeFilter(this.searchFilter);
} // else the filter hasn't changed enough for us to care here
}
}
componentWillUnmount() {
_dispatcher.default.unregister(this.dispatcherRef);
_SpaceStore.default.instance.off(_SpaceStore.UPDATE_SELECTED_SPACE, this.clearInput);
_SpaceStore.default.instance.off(_SpaceStore.UPDATE_TOP_LEVEL_SPACES, this.onSpaces);
}
render()
/*: React.ReactNode*/
{
const classes = (0, _classnames.default)({
'mx_RoomSearch': true,
'mx_RoomSearch_hasQuery': this.state.query,
'mx_RoomSearch_focused': this.state.focused,
'mx_RoomSearch_minimized': this.props.isMinimized
});
const inputClasses = (0, _classnames.default)({
'mx_RoomSearch_input': true,
'mx_RoomSearch_inputExpanded': this.state.query || this.state.focused
});
let placeholder = (0, _languageHandler._t)("Filter");
if (this.state.inSpaces) {
placeholder = (0, _languageHandler._t)("Filter all spaces");
}
let icon = /*#__PURE__*/React.createElement("div", {
className: "mx_RoomSearch_icon"
});
let input = /*#__PURE__*/React.createElement("input", {
type: "text",
ref: this.inputRef,
className: inputClasses,
value: this.state.query,
onFocus: this.onFocus,
onBlur: this.onBlur,
onChange: this.onChange,
onKeyDown: this.onKeyDown,
placeholder: placeholder,
autoComplete: "off"
});
let clearButton = /*#__PURE__*/React.createElement(_AccessibleButton.default, {
tabIndex: -1,
title: (0, _languageHandler._t)("Clear filter"),
className: "mx_RoomSearch_clearButton",
onClick: this.clearInput
});
if (this.props.isMinimized) {
icon = /*#__PURE__*/React.createElement(_AccessibleButton.default, {
title: (0, _languageHandler._t)("Filter rooms and people"),
className: "mx_RoomSearch_icon mx_RoomSearch_minimizedHandle",
onClick: this.openSearch
});
input = null;
clearButton = null;
}
return /*#__PURE__*/React.createElement("div", {
className: classes
}, icon, input, clearButton);
}
}, _temp)) || _class);
exports.default = RoomSearch;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3N0cnVjdHVyZXMvUm9vbVNlYXJjaC50c3giXSwibmFtZXMiOlsiUm9vbVNlYXJjaCIsIlJlYWN0IiwiUHVyZUNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJOYW1lRmlsdGVyQ29uZGl0aW9uIiwic3BhY2VzIiwic2V0U3RhdGUiLCJpblNwYWNlcyIsImxlbmd0aCIsInBheWxvYWQiLCJhY3Rpb24iLCJjbGVhcl9zZWFyY2giLCJjbGVhcklucHV0IiwiaW5wdXRSZWYiLCJjdXJyZW50IiwiZm9jdXMiLCJ2YWx1ZSIsIm9uQ2hhbmdlIiwiZGVmYXVsdERpc3BhdGNoZXIiLCJkaXNwYXRjaCIsInF1ZXJ5IiwiZXYiLCJmb2N1c2VkIiwidGFyZ2V0Iiwic2VsZWN0IiwiZ2V0Um9vbUxpc3RBY3Rpb24iLCJSb29tTGlzdEFjdGlvbiIsIkNsZWFyU2VhcmNoIiwiZmlyZSIsIkFjdGlvbiIsIkZvY3VzQ29tcG9zZXIiLCJOZXh0Um9vbSIsIlByZXZSb29tIiwib25LZXlEb3duIiwiU2VsZWN0Um9vbSIsInNob3VsZENsZWFyIiwib25TZWxlY3RSb29tIiwic2V0SW1tZWRpYXRlIiwic3RhdGUiLCJkaXNwYXRjaGVyUmVmIiwicmVnaXN0ZXIiLCJvbkFjdGlvbiIsIlNwYWNlU3RvcmUiLCJpbnN0YW5jZSIsIm9uIiwiVVBEQVRFX1NFTEVDVEVEX1NQQUNFIiwiVVBEQVRFX1RPUF9MRVZFTF9TUEFDRVMiLCJvblNwYWNlcyIsImNvbXBvbmVudERpZFVwZGF0ZSIsInByZXZQcm9wcyIsInByZXZTdGF0ZSIsImhhZFNlYXJjaCIsInNlYXJjaEZpbHRlciIsInNlYXJjaCIsInRyaW0iLCJoYXZlU2VhcmNoIiwiUm9vbUxpc3RTdG9yZSIsImFkZEZpbHRlciIsInJlbW92ZUZpbHRlciIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwidW5yZWdpc3RlciIsIm9mZiIsInJlbmRlciIsImNsYXNzZXMiLCJpc01pbmltaXplZCIsImlucHV0Q2xhc3NlcyIsInBsYWNlaG9sZGVyIiwiaWNvbiIsImlucHV0Iiwib25Gb2N1cyIsIm9uQmx1ciIsImNsZWFyQnV0dG9uIiwib3BlblNlYXJjaCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQWdCQTs7QUFFQTs7QUFHQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztJQWtCcUJBLFUsV0FEcEIsZ0RBQXFCLHVCQUFyQixDLHlCQUFELE1BQ3FCQSxVQURyQixTQUN3Q0MsS0FBSyxDQUFDQztBQUQ5QztBQUM0RTtBQUt4RUMsRUFBQUEsV0FBVyxDQUFDQztBQUFEO0FBQUEsSUFBZ0I7QUFDdkIsVUFBTUEsS0FBTjtBQUR1QjtBQUFBLGlFQUgyQixzQkFHM0I7QUFBQSx3REFGaUIsSUFBSUMsd0NBQUosRUFFakI7QUFBQSxvREFvQ1IsQ0FBQ0M7QUFBRDtBQUFBLFNBQW9CO0FBQ25DLFdBQUtDLFFBQUwsQ0FBYztBQUNWQyxRQUFBQSxRQUFRLEVBQUVGLE1BQU0sQ0FBQ0csTUFBUCxHQUFnQjtBQURoQixPQUFkO0FBR0gsS0F4QzBCO0FBQUEsb0RBMENSLENBQUNDO0FBQUQ7QUFBQSxTQUE0QjtBQUMzQyxVQUFJQSxPQUFPLENBQUNDLE1BQVIsS0FBbUIsV0FBbkIsSUFBa0NELE9BQU8sQ0FBQ0UsWUFBOUMsRUFBNEQ7QUFDeEQsYUFBS0MsVUFBTDtBQUNILE9BRkQsTUFFTyxJQUFJSCxPQUFPLENBQUNDLE1BQVIsS0FBbUIsbUJBQW5CLElBQTBDLEtBQUtHLFFBQUwsQ0FBY0MsT0FBNUQsRUFBcUU7QUFDeEUsYUFBS0QsUUFBTCxDQUFjQyxPQUFkLENBQXNCQyxLQUF0QjtBQUNIO0FBQ0osS0FoRDBCO0FBQUEsc0RBa0ROLE1BQU07QUFDdkIsVUFBSSxDQUFDLEtBQUtGLFFBQUwsQ0FBY0MsT0FBbkIsRUFBNEI7QUFDNUIsV0FBS0QsUUFBTCxDQUFjQyxPQUFkLENBQXNCRSxLQUF0QixHQUE4QixFQUE5QjtBQUNBLFdBQUtDLFFBQUw7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QyxNQURUO0FBRUksTUFBQSxHQUFHLEVBQUUsS0FBS3ZELFFBRmQ7QUFHSSxNQUFBLFNBQVMsRUFBRW9ELFlBSGY7QUFJSSxNQUFBLEtBQUssRUFBRSxLQUFLM0IsS0FBTCxDQUFXbEIsS0FKdEI7QUFLSSxNQUFBLE9BQU8sRUFBRSxLQUFLaUQsT0FMbEI7QUFNSSxNQUFBLE1BQU0sRUFBRSxLQUFLQyxNQU5qQjtBQU9JLE1BQUEsUUFBUSxFQUFFLEtBQUtyRCxRQVBuQjtBQVFJLE1BQUEsU0FBUyxFQUFFLEtBQUtnQixTQVJwQjtBQVNJLE1BQUEsV0FBVyxFQUFFaUMsV0FUakI7QUFVSSxNQUFBLFlBQVksRUFBQztBQVZqQixNQURKO0FBY0EsUUFBSUssV0FBVyxnQkFDWCxvQkFBQyx5QkFBRDtBQUNJLE1BQUEsUUFBUSxFQUFFLENBQUMsQ0FEZjtBQUVJLE1BQUEsS0FBSyxFQUFFLHlCQUFHLGNBQUgsQ0FGWDtBQUdJLE1BQUEsU0FBUyxFQUFDLDJCQUhkO0FBSUksTUFBQSxPQUFPLEVBQUUsS0FBSzNEO0FBSmxCLE1BREo7O0FBU0EsUUFBSSxLQUFLVCxLQUFMLENBQVc2RCxXQUFmLEVBQTRCO0FBQ3hCRyxNQUFBQSxJQUFJLGdCQUNBLG9CQUFDLHlCQUFEO0FBQ0ksUUFBQSxLQUFLLEVBQUUseUJBQUcseUJBQUgsQ0FEWDtBQUVJLFFBQUEsU0FBUyxFQUFDLGtEQUZkO0FBR0ksUUFBQSxPQUFPLEVBQUUsS0FBS0s7QUFIbEIsUUFESjtBQU9BSixNQUFBQSxLQUFLLEdBQUcsSUFBUjtBQUNBRyxNQUFBQSxXQUFXLEdBQUcsSUFBZDtBQUNIOztBQUVELHdCQUNJO0FBQUssTUFBQSxTQUFTLEVBQUVSO0FBQWhCLE9BQ0tJLElBREwsRUFFS0MsS0FGTCxFQUdLRyxXQUhMLENBREo7QUFPSDs7QUF4S3VFLEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjAsIDIwMjEgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGNyZWF0ZVJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSBcImNsYXNzbmFtZXNcIjtcbmltcG9ydCB7IFJvb20gfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbW9kZWxzL3Jvb21cIjtcblxuaW1wb3J0IGRlZmF1bHREaXNwYXRjaGVyIGZyb20gXCIuLi8uLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IHsgQWN0aW9uUGF5bG9hZCB9IGZyb20gXCIuLi8uLi9kaXNwYXRjaGVyL3BheWxvYWRzXCI7XG5pbXBvcnQgQWNjZXNzaWJsZUJ1dHRvbiBmcm9tIFwiLi4vdmlld3MvZWxlbWVudHMvQWNjZXNzaWJsZUJ1dHRvblwiO1xuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcIi4uLy4uL2Rpc3BhdGNoZXIvYWN0aW9uc1wiO1xuaW1wb3J0IFJvb21MaXN0U3RvcmUgZnJvbSBcIi4uLy4uL3N0b3Jlcy9yb29tLWxpc3QvUm9vbUxpc3RTdG9yZVwiO1xuaW1wb3J0IHsgTmFtZUZpbHRlckNvbmRpdGlvbiB9IGZyb20gXCIuLi8uLi9zdG9yZXMvcm9vbS1saXN0L2ZpbHRlcnMvTmFtZUZpbHRlckNvbmRpdGlvblwiO1xuaW1wb3J0IHsgZ2V0S2V5QmluZGluZ3NNYW5hZ2VyLCBSb29tTGlzdEFjdGlvbiB9IGZyb20gXCIuLi8uLi9LZXlCaW5kaW5nc01hbmFnZXJcIjtcbmltcG9ydCB7IHJlcGxhY2VhYmxlQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL3V0aWxzL3JlcGxhY2VhYmxlQ29tcG9uZW50XCI7XG5pbXBvcnQgU3BhY2VTdG9yZSwgeyBVUERBVEVfU0VMRUNURURfU1BBQ0UsIFVQREFURV9UT1BfTEVWRUxfU1BBQ0VTIH0gZnJvbSBcIi4uLy4uL3N0b3Jlcy9TcGFjZVN0b3JlXCI7XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIGlzTWluaW1pemVkOiBib29sZWFuO1xuICAgIG9uS2V5RG93bihldjogUmVhY3QuS2V5Ym9hcmRFdmVudCk6IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBhIHJvb20gaGFzIGJlZW4gc2VsZWN0ZWQgYW5kIHRoZSBzZWFyY2ggZmllbGQgc2hvdWxkIGJlIGNsZWFyZWRcbiAgICAgKi9cbiAgICBvblNlbGVjdFJvb20oKTogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIElTdGF0ZSB7XG4gICAgcXVlcnk6IHN0cmluZztcbiAgICBmb2N1c2VkOiBib29sZWFuO1xuICAgIGluU3BhY2VzOiBib29sZWFuO1xufVxuXG5AcmVwbGFjZWFibGVDb21wb25lbnQoXCJzdHJ1Y3R1cmVzLlJvb21TZWFyY2hcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvb21TZWFyY2ggZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50PElQcm9wcywgSVN0YXRlPiB7XG4gICAgcHJpdmF0ZSBkaXNwYXRjaGVyUmVmOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBpbnB1dFJlZjogUmVhY3QuUmVmT2JqZWN0PEhUTUxJbnB1dEVsZW1lbnQ+ID0gY3JlYXRlUmVmKCk7XG4gICAgcHJpdmF0ZSBzZWFyY2hGaWx0ZXI6IE5hbWVGaWx0ZXJDb25kaXRpb24gPSBuZXcgTmFtZUZpbHRlckNvbmRpdGlvbigpO1xuXG4gICAgY29uc3RydWN0b3IocHJvcHM6IElQcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHF1ZXJ5OiBcIlwiLFxuICAgICAgICAgICAgZm9jdXNlZDogZmFsc2UsXG4gICAgICAgICAgICBpblNwYWNlczogZmFsc2UsXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyUmVmID0gZGVmYXVsdERpc3BhdGNoZXIucmVnaXN0ZXIodGhpcy5vbkFjdGlvbik7XG4gICAgICAgIC8vIGNsZWFyIGZpbHRlciB3aGVuIGNoYW5naW5nIHNwYWNlcywgaW4gZnV0dXJlIHdlIG1heSB3aXNoIHRvIG1haW50YWluIGEgZmlsdGVyIHBlci1zcGFjZVxuICAgICAgICBTcGFjZVN0b3JlLmluc3RhbmNlLm9uKFVQREFURV9TRUxFQ1RFRF9TUEFDRSwgdGhpcy5jbGVhcklucHV0KTtcbiAgICAgICAgU3BhY2VTdG9yZS5pbnN0YW5jZS5vbihVUERBVEVfVE9QX0xFVkVMX1NQQUNFUywgdGhpcy5vblNwYWNlcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHM6IFJlYWRvbmx5PElQcm9wcz4sIHByZXZTdGF0ZTogUmVhZG9ubHk8SVN0YXRlPik6IHZvaWQge1xuICAgICAgICBpZiAocHJldlN0YXRlLnF1ZXJ5ICE9PSB0aGlzLnN0YXRlLnF1ZXJ5KSB7XG4gICAgICAgICAgICBjb25zdCBoYWRTZWFyY2ggPSAhIXRoaXMuc2VhcmNoRmlsdGVyLnNlYXJjaC50cmltKCk7XG4gICAgICAgICAgICBjb25zdCBoYXZlU2VhcmNoID0gISF0aGlzLnN0YXRlLnF1ZXJ5LnRyaW0oKTtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoRmlsdGVyLnNlYXJjaCA9IHRoaXMuc3RhdGUucXVlcnk7XG4gICAgICAgICAgICBpZiAoIWhhZFNlYXJjaCAmJiBoYXZlU2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgLy8gc3RhcnRlZCBhIG5ldyBmaWx0ZXIgLSBhZGQgdGhlIGNvbmRpdGlvblxuICAgICAgICAgICAgICAgIFJvb21MaXN0U3RvcmUuaW5zdGFuY2UuYWRkRmlsdGVyKHRoaXMuc2VhcmNoRmlsdGVyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFkU2VhcmNoICYmICFoYXZlU2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgLy8gY2xlYXJlZCBhIGZpbHRlciAtIHJlbW92ZSB0aGUgY29uZGl0aW9uXG4gICAgICAgICAgICAgICAgUm9vbUxpc3RTdG9yZS5pbnN0YW5jZS5yZW1vdmVGaWx0ZXIodGhpcy5zZWFyY2hGaWx0ZXIpO1xuICAgICAgICAgICAgfSAvLyBlbHNlIHRoZSBmaWx0ZXIgaGFzbid0IGNoYW5nZWQgZW5vdWdoIGZvciB1cyB0byBjYXJlIGhlcmVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgZGVmYXVsdERpc3BhdGNoZXIudW5yZWdpc3Rlcih0aGlzLmRpc3BhdGNoZXJSZWYpO1xuICAgICAgICBTcGFjZVN0b3JlLmluc3RhbmNlLm9mZihVUERBVEVfU0VMRUNURURfU1BBQ0UsIHRoaXMuY2xlYXJJbnB1dCk7XG4gICAgICAgIFNwYWNlU3RvcmUuaW5zdGFuY2Uub2ZmKFVQREFURV9UT1BfTEVWRUxfU1BBQ0VTLCB0aGlzLm9uU3BhY2VzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uU3BhY2VzID0gKHNwYWNlczogUm9vbVtdKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgaW5TcGFjZXM6IHNwYWNlcy5sZW5ndGggPiAwLFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkFjdGlvbiA9IChwYXlsb2FkOiBBY3Rpb25QYXlsb2FkKSA9PiB7XG4gICAgICAgIGlmIChwYXlsb2FkLmFjdGlvbiA9PT0gJ3ZpZXdfcm9vbScgJiYgcGF5bG9hZC5jbGVhcl9zZWFyY2gpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJJbnB1dCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHBheWxvYWQuYWN0aW9uID09PSAnZm9jdXNfcm9vbV9maWx0ZXInICYmIHRoaXMuaW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dFJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBjbGVhcklucHV0ID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuaW5wdXRSZWYuY3VycmVudCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmlucHV0UmVmLmN1cnJlbnQudmFsdWUgPSBcIlwiO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb3BlblNlYXJjaCA9ICgpID0+IHtcbiAgICAgICAgZGVmYXVsdERpc3BhdGNoZXIuZGlzcGF0Y2goe2FjdGlvbjogXCJzaG93X2xlZnRfcGFuZWxcIn0pO1xuICAgICAgICBkZWZhdWx0RGlzcGF0Y2hlci5kaXNwYXRjaCh7YWN0aW9uOiBcImZvY3VzX3Jvb21fZmlsdGVyXCJ9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkNoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmlucHV0UmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7cXVlcnk6IHRoaXMuaW5wdXRSZWYuY3VycmVudC52YWx1ZX0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uRm9jdXMgPSAoZXY6IFJlYWN0LkZvY3VzRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Zm9jdXNlZDogdHJ1ZX0pO1xuICAgICAgICBldi50YXJnZXQuc2VsZWN0KCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25CbHVyID0gKGV2OiBSZWFjdC5Gb2N1c0V2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2ZvY3VzZWQ6IGZhbHNlfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25LZXlEb3duID0gKGV2OiBSZWFjdC5LZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IGdldEtleUJpbmRpbmdzTWFuYWdlcigpLmdldFJvb21MaXN0QWN0aW9uKGV2KTtcbiAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgUm9vbUxpc3RBY3Rpb24uQ2xlYXJTZWFyY2g6XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhcklucHV0KCk7XG4gICAgICAgICAgICAgICAgZGVmYXVsdERpc3BhdGNoZXIuZmlyZShBY3Rpb24uRm9jdXNDb21wb3Nlcik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFJvb21MaXN0QWN0aW9uLk5leHRSb29tOlxuICAgICAgICAgICAgY2FzZSBSb29tTGlzdEFjdGlvbi5QcmV2Um9vbTpcbiAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYW5kbGUgdGhlc2UgYWN0aW9ucyBoZXJlIHB1dCBwYXNzIHRoZSBldmVudCBvbiB0byB0aGUgaW50ZXJlc3RlZCBwYXJ0eSAoTGVmdFBhbmVsKVxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMub25LZXlEb3duKGV2KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUm9vbUxpc3RBY3Rpb24uU2VsZWN0Um9vbToge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZENsZWFyID0gdGhpcy5wcm9wcy5vblNlbGVjdFJvb20oKTtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQ2xlYXIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gd3JhcCBpbiBzZXQgaW1tZWRpYXRlIHRvIGRlbGF5IGl0IHNvIHRoYXQgd2UgZG9uJ3QgY2xlYXIgdGhlIGZpbHRlciAmIHRoZW4gY2hhbmdlIHJvb21cbiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJJbnB1dCgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBjb25zdCBjbGFzc2VzID0gY2xhc3NOYW1lcyh7XG4gICAgICAgICAgICAnbXhfUm9vbVNlYXJjaCc6IHRydWUsXG4gICAgICAgICAgICAnbXhfUm9vbVNlYXJjaF9oYXNRdWVyeSc6IHRoaXMuc3RhdGUucXVlcnksXG4gICAgICAgICAgICAnbXhfUm9vbVNlYXJjaF9mb2N1c2VkJzogdGhpcy5zdGF0ZS5mb2N1c2VkLFxuICAgICAgICAgICAgJ214X1Jvb21TZWFyY2hfbWluaW1pemVkJzogdGhpcy5wcm9wcy5pc01pbmltaXplZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaW5wdXRDbGFzc2VzID0gY2xhc3NOYW1lcyh7XG4gICAgICAgICAgICAnbXhfUm9vbVNlYXJjaF9pbnB1dCc6IHRydWUsXG4gICAgICAgICAgICAnbXhfUm9vbVNlYXJjaF9pbnB1dEV4cGFuZGVkJzogdGhpcy5zdGF0ZS5xdWVyeSB8fCB0aGlzLnN0YXRlLmZvY3VzZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBwbGFjZWhvbGRlciA9IF90KFwiRmlsdGVyXCIpO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5pblNwYWNlcykge1xuICAgICAgICAgICAgcGxhY2Vob2xkZXIgPSBfdChcIkZpbHRlciBhbGwgc3BhY2VzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGljb24gPSAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nbXhfUm9vbVNlYXJjaF9pY29uJyAvPlxuICAgICAgICApO1xuICAgICAgICBsZXQgaW5wdXQgPSAoXG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgcmVmPXt0aGlzLmlucHV0UmVmfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17aW5wdXRDbGFzc2VzfVxuICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLnF1ZXJ5fVxuICAgICAgICAgICAgICAgIG9uRm9jdXM9e3RoaXMub25Gb2N1c31cbiAgICAgICAgICAgICAgICBvbkJsdXI9e3RoaXMub25CbHVyfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlfVxuICAgICAgICAgICAgICAgIG9uS2V5RG93bj17dGhpcy5vbktleURvd259XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgICAgICAgIGF1dG9Db21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgICAgICBsZXQgY2xlYXJCdXR0b24gPSAoXG4gICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvblxuICAgICAgICAgICAgICAgIHRhYkluZGV4PXstMX1cbiAgICAgICAgICAgICAgICB0aXRsZT17X3QoXCJDbGVhciBmaWx0ZXJcIil9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfUm9vbVNlYXJjaF9jbGVhckJ1dHRvblwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5jbGVhcklucHV0fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhpcy5wcm9wcy5pc01pbmltaXplZCkge1xuICAgICAgICAgICAgaWNvbiA9IChcbiAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0aXRsZT17X3QoXCJGaWx0ZXIgcm9vbXMgYW5kIHBlb3BsZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfUm9vbVNlYXJjaF9pY29uIG14X1Jvb21TZWFyY2hfbWluaW1pemVkSGFuZGxlXCJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5vcGVuU2VhcmNofVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaW5wdXQgPSBudWxsO1xuICAgICAgICAgICAgY2xlYXJCdXR0b24gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc2VzfT5cbiAgICAgICAgICAgICAgICB7aWNvbn1cbiAgICAgICAgICAgICAgICB7aW5wdXR9XG4gICAgICAgICAgICAgICAge2NsZWFyQnV0dG9ufVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl19