matrix-react-sdk
Version:
SDK for matrix.org using React
148 lines (144 loc) • 23.1 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.Tabs = exports.ExistingSource = void 0;
exports.getDesktopCapturerSources = getDesktopCapturerSources;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _languageHandler = require("../../../languageHandler");
var _BaseDialog = _interopRequireDefault(require("..//dialogs/BaseDialog"));
var _DialogButtons = _interopRequireDefault(require("./DialogButtons"));
var _AccessibleButton = _interopRequireDefault(require("./AccessibleButton"));
var _TabbedView = _interopRequireWildcard(require("../../structures/TabbedView"));
var _PlatformPeg = _interopRequireDefault(require("../../../PlatformPeg"));
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 2021 Šimon Brandner <simon.bra.ag@gmail.com>
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
function getDesktopCapturerSources() {
const options = {
thumbnailSize: {
height: 176,
width: 312
},
types: ["screen", "window"]
};
const plaf = _PlatformPeg.default.get();
return plaf ? plaf?.getDesktopCapturerSources(options) : Promise.resolve([]);
}
let Tabs = exports.Tabs = /*#__PURE__*/function (Tabs) {
Tabs["Screens"] = "screen";
Tabs["Windows"] = "window";
return Tabs;
}({});
class ExistingSource extends _react.default.Component {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "onClick", () => {
this.props.onSelect(this.props.source);
});
}
render() {
const thumbnailClasses = (0, _classnames.default)({
mx_desktopCapturerSourcePicker_source_thumbnail: true,
mx_desktopCapturerSourcePicker_source_thumbnail_selected: this.props.selected
});
return /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_desktopCapturerSourcePicker_source",
title: this.props.source.name,
onClick: this.onClick
}, /*#__PURE__*/_react.default.createElement("img", {
alt: this.props.source.name,
className: thumbnailClasses,
src: this.props.source.thumbnailURL
}), /*#__PURE__*/_react.default.createElement("span", {
className: "mx_desktopCapturerSourcePicker_source_name"
}, this.props.source.name));
}
}
exports.ExistingSource = ExistingSource;
class DesktopCapturerSourcePicker extends _react.default.Component {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "interval", void 0);
(0, _defineProperty2.default)(this, "onSelect", source => {
this.setState({
selectedSource: source
});
});
(0, _defineProperty2.default)(this, "onShare", () => {
this.props.onFinished(this.state.selectedSource);
});
(0, _defineProperty2.default)(this, "onTabChange", tab => {
this.setState({
selectedSource: undefined,
selectedTab: tab
});
});
(0, _defineProperty2.default)(this, "onCloseClick", () => {
this.props.onFinished();
});
this.state = {
selectedTab: Tabs.Screens,
sources: []
};
}
async componentDidMount() {
// window.setInterval() first waits and then executes, therefore
// we call getDesktopCapturerSources() here without any delay.
// Otherwise the dialog would be left empty for some time.
this.setState({
sources: await getDesktopCapturerSources()
});
// We update the sources every 500ms to get newer thumbnails
this.interval = window.setInterval(async () => {
this.setState({
sources: await getDesktopCapturerSources()
});
}, 500);
}
componentWillUnmount() {
clearInterval(this.interval);
}
getTab(type, label) {
const sources = this.state.sources.filter(source => source.id.startsWith(type)).map(source => {
return /*#__PURE__*/_react.default.createElement(ExistingSource, {
selected: this.state.selectedSource?.id === source.id,
source: source,
onSelect: this.onSelect,
key: source.id
});
});
return new _TabbedView.Tab(type, label, null, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_desktopCapturerSourcePicker_tab"
}, sources));
}
render() {
const tabs = [this.getTab(Tabs.Screens, (0, _languageHandler._td)("voip|screenshare_monitor")), this.getTab(Tabs.Windows, (0, _languageHandler._td)("voip|screenshare_window"))];
return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, {
className: "mx_desktopCapturerSourcePicker",
onFinished: this.onCloseClick,
title: (0, _languageHandler._t)("voip|screenshare_title")
}, /*#__PURE__*/_react.default.createElement(_TabbedView.default, {
tabs: tabs,
tabLocation: _TabbedView.TabLocation.TOP,
activeTabId: this.state.selectedTab,
onChange: this.onTabChange
}), /*#__PURE__*/_react.default.createElement(_DialogButtons.default, {
primaryButton: (0, _languageHandler._t)("action|share"),
hasCancel: true,
onCancel: this.onCloseClick,
onPrimaryButtonClick: this.onShare,
primaryDisabled: !this.state.selectedSource
}));
}
}
exports.default = DesktopCapturerSourcePicker;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9jbGFzc25hbWVzIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9CYXNlRGlhbG9nIiwiX0RpYWxvZ0J1dHRvbnMiLCJfQWNjZXNzaWJsZUJ1dHRvbiIsIl9UYWJiZWRWaWV3IiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfUGxhdGZvcm1QZWciLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJnZXREZXNrdG9wQ2FwdHVyZXJTb3VyY2VzIiwib3B0aW9ucyIsInRodW1ibmFpbFNpemUiLCJoZWlnaHQiLCJ3aWR0aCIsInR5cGVzIiwicGxhZiIsIlBsYXRmb3JtUGVnIiwiUHJvbWlzZSIsInJlc29sdmUiLCJUYWJzIiwiZXhwb3J0cyIsIkV4aXN0aW5nU291cmNlIiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiX2RlZmluZVByb3BlcnR5MiIsIm9uU2VsZWN0Iiwic291cmNlIiwicmVuZGVyIiwidGh1bWJuYWlsQ2xhc3NlcyIsImNsYXNzTmFtZXMiLCJteF9kZXNrdG9wQ2FwdHVyZXJTb3VyY2VQaWNrZXJfc291cmNlX3RodW1ibmFpbCIsIm14X2Rlc2t0b3BDYXB0dXJlclNvdXJjZVBpY2tlcl9zb3VyY2VfdGh1bWJuYWlsX3NlbGVjdGVkIiwic2VsZWN0ZWQiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwidGl0bGUiLCJuYW1lIiwib25DbGljayIsImFsdCIsInNyYyIsInRodW1ibmFpbFVSTCIsIkRlc2t0b3BDYXB0dXJlclNvdXJjZVBpY2tlciIsInNldFN0YXRlIiwic2VsZWN0ZWRTb3VyY2UiLCJvbkZpbmlzaGVkIiwic3RhdGUiLCJ0YWIiLCJ1bmRlZmluZWQiLCJzZWxlY3RlZFRhYiIsIlNjcmVlbnMiLCJzb3VyY2VzIiwiY29tcG9uZW50RGlkTW91bnQiLCJpbnRlcnZhbCIsIndpbmRvdyIsInNldEludGVydmFsIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJjbGVhckludGVydmFsIiwiZ2V0VGFiIiwidHlwZSIsImxhYmVsIiwiZmlsdGVyIiwiaWQiLCJzdGFydHNXaXRoIiwibWFwIiwia2V5IiwiVGFiIiwidGFicyIsIl90ZCIsIldpbmRvd3MiLCJvbkNsb3NlQ2xpY2siLCJfdCIsInRhYkxvY2F0aW9uIiwiVGFiTG9jYXRpb24iLCJUT1AiLCJhY3RpdmVUYWJJZCIsIm9uQ2hhbmdlIiwib25UYWJDaGFuZ2UiLCJwcmltYXJ5QnV0dG9uIiwiaGFzQ2FuY2VsIiwib25DYW5jZWwiLCJvblByaW1hcnlCdXR0b25DbGljayIsIm9uU2hhcmUiLCJwcmltYXJ5RGlzYWJsZWQiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWV3cy9lbGVtZW50cy9EZXNrdG9wQ2FwdHVyZXJTb3VyY2VQaWNrZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIxIMWgaW1vbiBCcmFuZG5lciA8c2ltb24uYnJhLmFnQGdtYWlsLmNvbT5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSBcImNsYXNzbmFtZXNcIjtcblxuaW1wb3J0IHsgX3QsIF90ZCwgVHJhbnNsYXRpb25LZXkgfSBmcm9tIFwiLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgQmFzZURpYWxvZyBmcm9tIFwiLi4vL2RpYWxvZ3MvQmFzZURpYWxvZ1wiO1xuaW1wb3J0IERpYWxvZ0J1dHRvbnMgZnJvbSBcIi4vRGlhbG9nQnV0dG9uc1wiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24gZnJvbSBcIi4vQWNjZXNzaWJsZUJ1dHRvblwiO1xuaW1wb3J0IFRhYmJlZFZpZXcsIHsgVGFiLCBUYWJMb2NhdGlvbiB9IGZyb20gXCIuLi8uLi9zdHJ1Y3R1cmVzL1RhYmJlZFZpZXdcIjtcbmltcG9ydCBQbGF0Zm9ybVBlZyBmcm9tIFwiLi4vLi4vLi4vUGxhdGZvcm1QZWdcIjtcbmltcG9ydCB7IE5vbkVtcHR5QXJyYXkgfSBmcm9tIFwiLi4vLi4vLi4vQHR5cGVzL2NvbW1vblwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVza3RvcENhcHR1cmVyU291cmNlcygpOiBQcm9taXNlPEFycmF5PERlc2t0b3BDYXB0dXJlclNvdXJjZT4+IHtcbiAgICBjb25zdCBvcHRpb25zOiBHZXRTb3VyY2VzT3B0aW9ucyA9IHtcbiAgICAgICAgdGh1bWJuYWlsU2l6ZToge1xuICAgICAgICAgICAgaGVpZ2h0OiAxNzYsXG4gICAgICAgICAgICB3aWR0aDogMzEyLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlczogW1wic2NyZWVuXCIsIFwid2luZG93XCJdLFxuICAgIH07XG4gICAgY29uc3QgcGxhZiA9IFBsYXRmb3JtUGVnLmdldCgpO1xuICAgIHJldHVybiBwbGFmID8gcGxhZj8uZ2V0RGVza3RvcENhcHR1cmVyU291cmNlcyhvcHRpb25zKSA6IFByb21pc2UucmVzb2x2ZTxEZXNrdG9wQ2FwdHVyZXJTb3VyY2VbXT4oW10pO1xufVxuXG5leHBvcnQgZW51bSBUYWJzIHtcbiAgICBTY3JlZW5zID0gXCJzY3JlZW5cIixcbiAgICBXaW5kb3dzID0gXCJ3aW5kb3dcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGlzdGluZ1NvdXJjZUlQcm9wcyB7XG4gICAgc291cmNlOiBEZXNrdG9wQ2FwdHVyZXJTb3VyY2U7XG4gICAgb25TZWxlY3Qoc291cmNlOiBEZXNrdG9wQ2FwdHVyZXJTb3VyY2UpOiB2b2lkO1xuICAgIHNlbGVjdGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgRXhpc3RpbmdTb3VyY2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8RXhpc3RpbmdTb3VyY2VJUHJvcHM+IHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHM6IEV4aXN0aW5nU291cmNlSVByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQ2xpY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucHJvcHMub25TZWxlY3QodGhpcy5wcm9wcy5zb3VyY2UpO1xuICAgIH07XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIGNvbnN0IHRodW1ibmFpbENsYXNzZXMgPSBjbGFzc05hbWVzKHtcbiAgICAgICAgICAgIG14X2Rlc2t0b3BDYXB0dXJlclNvdXJjZVBpY2tlcl9zb3VyY2VfdGh1bWJuYWlsOiB0cnVlLFxuICAgICAgICAgICAgbXhfZGVza3RvcENhcHR1cmVyU291cmNlUGlja2VyX3NvdXJjZV90aHVtYm5haWxfc2VsZWN0ZWQ6IHRoaXMucHJvcHMuc2VsZWN0ZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X2Rlc2t0b3BDYXB0dXJlclNvdXJjZVBpY2tlcl9zb3VyY2VcIlxuICAgICAgICAgICAgICAgIHRpdGxlPXt0aGlzLnByb3BzLnNvdXJjZS5uYW1lfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMub25DbGlja31cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aW1nIGFsdD17dGhpcy5wcm9wcy5zb3VyY2UubmFtZX0gY2xhc3NOYW1lPXt0aHVtYm5haWxDbGFzc2VzfSBzcmM9e3RoaXMucHJvcHMuc291cmNlLnRodW1ibmFpbFVSTH0gLz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJteF9kZXNrdG9wQ2FwdHVyZXJTb3VyY2VQaWNrZXJfc291cmNlX25hbWVcIj57dGhpcy5wcm9wcy5zb3VyY2UubmFtZX08L3NwYW4+XG4gICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBpY2tlcklTdGF0ZSB7XG4gICAgc2VsZWN0ZWRUYWI6IFRhYnM7XG4gICAgc291cmNlczogQXJyYXk8RGVza3RvcENhcHR1cmVyU291cmNlPjtcbiAgICBzZWxlY3RlZFNvdXJjZT86IERlc2t0b3BDYXB0dXJlclNvdXJjZTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgUGlja2VySVByb3BzIHtcbiAgICBvbkZpbmlzaGVkKHNvdXJjZT86IERlc2t0b3BDYXB0dXJlclNvdXJjZSk6IHZvaWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERlc2t0b3BDYXB0dXJlclNvdXJjZVBpY2tlciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxQaWNrZXJJUHJvcHMsIFBpY2tlcklTdGF0ZT4ge1xuICAgIHB1YmxpYyBpbnRlcnZhbD86IG51bWJlcjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogUGlja2VySVByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgc2VsZWN0ZWRUYWI6IFRhYnMuU2NyZWVucyxcbiAgICAgICAgICAgIHNvdXJjZXM6IFtdLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjb21wb25lbnREaWRNb3VudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gd2luZG93LnNldEludGVydmFsKCkgZmlyc3Qgd2FpdHMgYW5kIHRoZW4gZXhlY3V0ZXMsIHRoZXJlZm9yZVxuICAgICAgICAvLyB3ZSBjYWxsIGdldERlc2t0b3BDYXB0dXJlclNvdXJjZXMoKSBoZXJlIHdpdGhvdXQgYW55IGRlbGF5LlxuICAgICAgICAvLyBPdGhlcndpc2UgdGhlIGRpYWxvZyB3b3VsZCBiZSBsZWZ0IGVtcHR5IGZvciBzb21lIHRpbWUuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc291cmNlczogYXdhaXQgZ2V0RGVza3RvcENhcHR1cmVyU291cmNlcygpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBXZSB1cGRhdGUgdGhlIHNvdXJjZXMgZXZlcnkgNTAwbXMgdG8gZ2V0IG5ld2VyIHRodW1ibmFpbHNcbiAgICAgICAgdGhpcy5pbnRlcnZhbCA9IHdpbmRvdy5zZXRJbnRlcnZhbChhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBzb3VyY2VzOiBhd2FpdCBnZXREZXNrdG9wQ2FwdHVyZXJTb3VyY2VzKCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50V2lsbFVubW91bnQoKTogdm9pZCB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblNlbGVjdCA9IChzb3VyY2U6IERlc2t0b3BDYXB0dXJlclNvdXJjZSk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgc2VsZWN0ZWRTb3VyY2U6IHNvdXJjZSB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvblNoYXJlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnByb3BzLm9uRmluaXNoZWQodGhpcy5zdGF0ZS5zZWxlY3RlZFNvdXJjZSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25UYWJDaGFuZ2UgPSAodGFiOiBUYWJzKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzZWxlY3RlZFNvdXJjZTogdW5kZWZpbmVkLCBzZWxlY3RlZFRhYjogdGFiIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uQ2xvc2VDbGljayA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkZpbmlzaGVkKCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgZ2V0VGFiKHR5cGU6IFRhYnMsIGxhYmVsOiBUcmFuc2xhdGlvbktleSk6IFRhYjxUYWJzPiB7XG4gICAgICAgIGNvbnN0IHNvdXJjZXMgPSB0aGlzLnN0YXRlLnNvdXJjZXNcbiAgICAgICAgICAgIC5maWx0ZXIoKHNvdXJjZSkgPT4gc291cmNlLmlkLnN0YXJ0c1dpdGgodHlwZSkpXG4gICAgICAgICAgICAubWFwKChzb3VyY2UpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICA8RXhpc3RpbmdTb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkPXt0aGlzLnN0YXRlLnNlbGVjdGVkU291cmNlPy5pZCA9PT0gc291cmNlLmlkfVxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPXtzb3VyY2V9XG4gICAgICAgICAgICAgICAgICAgICAgICBvblNlbGVjdD17dGhpcy5vblNlbGVjdH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGtleT17c291cmNlLmlkfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbmV3IFRhYih0eXBlLCBsYWJlbCwgbnVsbCwgPGRpdiBjbGFzc05hbWU9XCJteF9kZXNrdG9wQ2FwdHVyZXJTb3VyY2VQaWNrZXJfdGFiXCI+e3NvdXJjZXN9PC9kaXY+KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIGNvbnN0IHRhYnM6IE5vbkVtcHR5QXJyYXk8VGFiPFRhYnM+PiA9IFtcbiAgICAgICAgICAgIHRoaXMuZ2V0VGFiKFRhYnMuU2NyZWVucywgX3RkKFwidm9pcHxzY3JlZW5zaGFyZV9tb25pdG9yXCIpKSxcbiAgICAgICAgICAgIHRoaXMuZ2V0VGFiKFRhYnMuV2luZG93cywgX3RkKFwidm9pcHxzY3JlZW5zaGFyZV93aW5kb3dcIikpLFxuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8QmFzZURpYWxvZ1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X2Rlc2t0b3BDYXB0dXJlclNvdXJjZVBpY2tlclwiXG4gICAgICAgICAgICAgICAgb25GaW5pc2hlZD17dGhpcy5vbkNsb3NlQ2xpY2t9XG4gICAgICAgICAgICAgICAgdGl0bGU9e190KFwidm9pcHxzY3JlZW5zaGFyZV90aXRsZVwiKX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8VGFiYmVkVmlld1xuICAgICAgICAgICAgICAgICAgICB0YWJzPXt0YWJzfVxuICAgICAgICAgICAgICAgICAgICB0YWJMb2NhdGlvbj17VGFiTG9jYXRpb24uVE9QfVxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVUYWJJZD17dGhpcy5zdGF0ZS5zZWxlY3RlZFRhYn1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMub25UYWJDaGFuZ2V9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8RGlhbG9nQnV0dG9uc1xuICAgICAgICAgICAgICAgICAgICBwcmltYXJ5QnV0dG9uPXtfdChcImFjdGlvbnxzaGFyZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgaGFzQ2FuY2VsPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbD17dGhpcy5vbkNsb3NlQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgIG9uUHJpbWFyeUJ1dHRvbkNsaWNrPXt0aGlzLm9uU2hhcmV9XG4gICAgICAgICAgICAgICAgICAgIHByaW1hcnlEaXNhYmxlZD17IXRoaXMuc3RhdGUuc2VsZWN0ZWRTb3VyY2V9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvQmFzZURpYWxvZz5cbiAgICAgICAgKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFFLGdCQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxXQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxjQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxpQkFBQSxHQUFBTixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU0sV0FBQSxHQUFBQyx1QkFBQSxDQUFBUCxPQUFBO0FBQ0EsSUFBQVEsWUFBQSxHQUFBVCxzQkFBQSxDQUFBQyxPQUFBO0FBQStDLFNBQUFTLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLENBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFILHdCQUFBRyxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsdUJBQUFBLENBQUEseUJBQUFBLENBQUEsV0FBQUssT0FBQSxFQUFBTCxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEsQ0FBQUcsQ0FBQSxPQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQUcsR0FBQSxDQUFBTixDQUFBLFVBQUFHLENBQUEs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