matrix-react-sdk
Version:
SDK for matrix.org using React
226 lines (222 loc) • 37.1 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _SdkConfig = _interopRequireDefault(require("../../../SdkConfig"));
var _Modal = _interopRequireDefault(require("../../../Modal"));
var _languageHandler = require("../../../languageHandler");
var _submitRageshake = _interopRequireWildcard(require("../../../rageshake/submit-rageshake"));
var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton"));
var _QuestionDialog = _interopRequireDefault(require("./QuestionDialog"));
var _BaseDialog = _interopRequireDefault(require("./BaseDialog"));
var _Field = _interopRequireDefault(require("../elements/Field"));
var _Spinner = _interopRequireDefault(require("../elements/Spinner"));
var _DialogButtons = _interopRequireDefault(require("../elements/DialogButtons"));
var _sentry = require("../../../sentry");
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _actions = require("../../../dispatcher/actions");
var _SupportedBrowser = require("../../../SupportedBrowser");
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 2019 Michael Telatynski <7t3chguy@gmail.com>
Copyright 2019 The Matrix.org Foundation C.I.C.
Copyright 2018 New Vector Ltd
Copyright 2017 OpenMarket Ltd
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
class BugReportDialog extends _react.default.Component {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "unmounted", void 0);
(0, _defineProperty2.default)(this, "issueRef", void 0);
(0, _defineProperty2.default)(this, "onCancel", () => {
this.props.onFinished(false);
});
(0, _defineProperty2.default)(this, "onSubmit", () => {
if ((!this.state.text || !this.state.text.trim()) && (!this.state.issueUrl || !this.state.issueUrl.trim())) {
this.setState({
err: (0, _languageHandler._t)("bug_reporting|error_empty")
});
return;
}
const userText = (this.state.text.length > 0 ? this.state.text + "\n\n" : "") + "Issue: " + (this.state.issueUrl.length > 0 ? this.state.issueUrl : "No issue link given");
this.setState({
busy: true,
progress: null,
err: null
});
this.sendProgressCallback((0, _languageHandler._t)("bug_reporting|preparing_logs"));
(0, _submitRageshake.default)(_SdkConfig.default.get().bug_report_endpoint_url, {
userText,
sendLogs: true,
progressCallback: this.sendProgressCallback,
labels: this.props.label ? [this.props.label] : []
}).then(() => {
if (!this.unmounted) {
this.props.onFinished(false);
_Modal.default.createDialog(_QuestionDialog.default, {
title: (0, _languageHandler._t)("bug_reporting|logs_sent"),
description: (0, _languageHandler._t)("bug_reporting|thank_you"),
hasCancelButton: false
});
}
}, err => {
if (!this.unmounted) {
this.setState({
busy: false,
progress: null,
err: (0, _languageHandler._t)("bug_reporting|failed_send_logs") + `${err.message}`
});
}
});
(0, _sentry.sendSentryReport)(this.state.text, this.state.issueUrl, this.props.error);
});
(0, _defineProperty2.default)(this, "onDownload", async () => {
this.setState({
downloadBusy: true
});
this.downloadProgressCallback((0, _languageHandler._t)("bug_reporting|preparing_download"));
try {
await (0, _submitRageshake.downloadBugReport)({
sendLogs: true,
progressCallback: this.downloadProgressCallback,
labels: this.props.label ? [this.props.label] : []
});
this.setState({
downloadBusy: false,
downloadProgress: null
});
} catch (err) {
if (!this.unmounted) {
this.setState({
downloadBusy: false,
downloadProgress: (0, _languageHandler._t)("bug_reporting|failed_send_logs") + `${err instanceof Error ? err.message : ""}`
});
}
}
});
(0, _defineProperty2.default)(this, "onTextChange", ev => {
this.setState({
text: ev.currentTarget.value
});
});
(0, _defineProperty2.default)(this, "onIssueUrlChange", ev => {
this.setState({
issueUrl: ev.currentTarget.value
});
});
(0, _defineProperty2.default)(this, "sendProgressCallback", progress => {
if (this.unmounted) {
return;
}
this.setState({
progress
});
});
(0, _defineProperty2.default)(this, "downloadProgressCallback", downloadProgress => {
if (this.unmounted) {
return;
}
this.setState({
downloadProgress
});
});
this.state = {
sendLogs: true,
busy: false,
err: null,
issueUrl: "",
text: props.initialText || "",
progress: null,
downloadBusy: false,
downloadProgress: null
};
this.unmounted = false;
this.issueRef = /*#__PURE__*/_react.default.createRef();
// Get all of the extra info dumped to the console when someone is about
// to send debug logs. Since this is a fire and forget action, we do
// this when the bug report dialog is opened instead of when we submit
// logs because we have no signal to know when all of the various
// components have finished logging. Someone could potentially send logs
// before we fully dump everything but it's probably unlikely.
_dispatcher.default.dispatch({
action: _actions.Action.DumpDebugLogs
});
}
componentDidMount() {
this.issueRef.current?.focus();
}
componentWillUnmount() {
this.unmounted = true;
}
render() {
let error;
if (this.state.err) {
error = /*#__PURE__*/_react.default.createElement("div", {
className: "error"
}, this.state.err);
}
let progress;
if (this.state.busy) {
progress = /*#__PURE__*/_react.default.createElement("div", {
className: "progress"
}, /*#__PURE__*/_react.default.createElement(_Spinner.default, null), this.state.progress, " ...");
}
let warning;
if (window.Modernizr && Object.values(window.Modernizr).some(support => support === false) || !(0, _SupportedBrowser.getBrowserSupport)()) {
warning = /*#__PURE__*/_react.default.createElement("p", null, /*#__PURE__*/_react.default.createElement("strong", null, (0, _languageHandler._t)("bug_reporting|unsupported_browser")));
}
return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, {
className: "mx_BugReportDialog",
onFinished: this.onCancel,
title: (0, _languageHandler._t)("bug_reporting|submit_debug_logs"),
contentId: "mx_Dialog_content"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_Dialog_content",
id: "mx_Dialog_content"
}, warning, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("bug_reporting|description")), /*#__PURE__*/_react.default.createElement("p", null, /*#__PURE__*/_react.default.createElement("strong", null, (0, _languageHandler._t)("bug_reporting|before_submitting", {}, {
a: sub => /*#__PURE__*/_react.default.createElement("a", {
target: "_blank",
href: _SdkConfig.default.get().feedback.new_issue_url,
rel: "noreferrer noopener"
}, sub)
}))), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_BugReportDialog_download"
}, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
onClick: this.onDownload,
kind: "link",
disabled: this.state.downloadBusy
}, (0, _languageHandler._t)("bug_reporting|download_logs")), this.state.downloadProgress && /*#__PURE__*/_react.default.createElement("span", null, this.state.downloadProgress, " ...")), /*#__PURE__*/_react.default.createElement(_Field.default, {
type: "text",
className: "mx_BugReportDialog_field_input",
label: (0, _languageHandler._t)("bug_reporting|github_issue"),
onChange: this.onIssueUrlChange,
value: this.state.issueUrl,
placeholder: "https://github.com/vector-im/element-web/issues/...",
ref: this.issueRef
}), /*#__PURE__*/_react.default.createElement(_Field.default, {
className: "mx_BugReportDialog_field_input",
element: "textarea",
label: (0, _languageHandler._t)("bug_reporting|textarea_label"),
rows: 5,
onChange: this.onTextChange,
value: this.state.text,
placeholder: (0, _languageHandler._t)("bug_reporting|additional_context")
}), progress, error), /*#__PURE__*/_react.default.createElement(_DialogButtons.default, {
primaryButton: (0, _languageHandler._t)("bug_reporting|send_logs"),
onPrimaryButtonClick: this.onSubmit,
focus: true,
onCancel: this.onCancel,
disabled: this.state.busy
}));
}
}
exports.default = BugReportDialog;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9TZGtDb25maWciLCJfTW9kYWwiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX3N1Ym1pdFJhZ2VzaGFrZSIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX0FjY2Vzc2libGVCdXR0b24iLCJfUXVlc3Rpb25EaWFsb2ciLCJfQmFzZURpYWxvZyIsIl9GaWVsZCIsIl9TcGlubmVyIiwiX0RpYWxvZ0J1dHRvbnMiLCJfc2VudHJ5IiwiX2Rpc3BhdGNoZXIiLCJfYWN0aW9ucyIsIl9TdXBwb3J0ZWRCcm93c2VyIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiQnVnUmVwb3J0RGlhbG9nIiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiX2RlZmluZVByb3BlcnR5MiIsIm9uRmluaXNoZWQiLCJzdGF0ZSIsInRleHQiLCJ0cmltIiwiaXNzdWVVcmwiLCJzZXRTdGF0ZSIsImVyciIsIl90IiwidXNlclRleHQiLCJsZW5ndGgiLCJidXN5IiwicHJvZ3Jlc3MiLCJzZW5kUHJvZ3Jlc3NDYWxsYmFjayIsInNlbmRCdWdSZXBvcnQiLCJTZGtDb25maWciLCJidWdfcmVwb3J0X2VuZHBvaW50X3VybCIsInNlbmRMb2dzIiwicHJvZ3Jlc3NDYWxsYmFjayIsImxhYmVscyIsImxhYmVsIiwidGhlbiIsInVubW91bnRlZCIsIk1vZGFsIiwiY3JlYXRlRGlhbG9nIiwiUXVlc3Rpb25EaWFsb2ciLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwiaGFzQ2FuY2VsQnV0dG9uIiwibWVzc2FnZSIsInNlbmRTZW50cnlSZXBvcnQiLCJlcnJvciIsImRvd25sb2FkQnVzeSIsImRvd25sb2FkUHJvZ3Jlc3NDYWxsYmFjayIsImRvd25sb2FkQnVnUmVwb3J0IiwiZG93bmxvYWRQcm9ncmVzcyIsIkVycm9yIiwiZXYiLCJjdXJyZW50VGFyZ2V0IiwidmFsdWUiLCJpbml0aWFsVGV4dCIsImlzc3VlUmVmIiwiY3JlYXRlUmVmIiwiZGVmYXVsdERpc3BhdGNoZXIiLCJkaXNwYXRjaCIsImFjdGlvbiIsIkFjdGlvbiIsIkR1bXBEZWJ1Z0xvZ3MiLCJjb21wb25lbnREaWRNb3VudCIsImN1cnJlbnQiLCJmb2N1cyIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsIndhcm5pbmciLCJ3aW5kb3ciLCJNb2Rlcm5penIiLCJ2YWx1ZXMiLCJzb21lIiwic3VwcG9ydCIsImdldEJyb3dzZXJTdXBwb3J0Iiwib25DYW5jZWwiLCJjb250ZW50SWQiLCJpZCIsInN1YiIsInRhcmdldCIsImhyZWYiLCJmZWVkYmFjayIsIm5ld19pc3N1ZV91cmwiLCJyZWwiLCJvbkNsaWNrIiwib25Eb3dubG9hZCIsImtpbmQiLCJkaXNhYmxlZCIsInR5cGUiLCJvbkNoYW5nZSIsIm9uSXNzdWVVcmxDaGFuZ2UiLCJwbGFjZWhvbGRlciIsInJlZiIsImVsZW1lbnQiLCJyb3dzIiwib25UZXh0Q2hhbmdlIiwicHJpbWFyeUJ1dHRvbiIsIm9uUHJpbWFyeUJ1dHRvbkNsaWNrIiwib25TdWJtaXQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3MvZGlhbG9ncy9CdWdSZXBvcnREaWFsb2cudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE5IE1pY2hhZWwgVGVsYXR5bnNraSA8N3QzY2hndXlAZ21haWwuY29tPlxuQ29weXJpZ2h0IDIwMTkgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cbkNvcHlyaWdodCAyMDE4IE5ldyBWZWN0b3IgTHRkXG5Db3B5cmlnaHQgMjAxNyBPcGVuTWFya2V0IEx0ZFxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbmltcG9ydCBTZGtDb25maWcgZnJvbSBcIi4uLy4uLy4uL1Nka0NvbmZpZ1wiO1xuaW1wb3J0IE1vZGFsIGZyb20gXCIuLi8uLi8uLi9Nb2RhbFwiO1xuaW1wb3J0IHsgX3QgfSBmcm9tIFwiLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgc2VuZEJ1Z1JlcG9ydCwgeyBkb3dubG9hZEJ1Z1JlcG9ydCB9IGZyb20gXCIuLi8uLi8uLi9yYWdlc2hha2Uvc3VibWl0LXJhZ2VzaGFrZVwiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24gZnJvbSBcIi4uL2VsZW1lbnRzL0FjY2Vzc2libGVCdXR0b25cIjtcbmltcG9ydCBRdWVzdGlvbkRpYWxvZyBmcm9tIFwiLi9RdWVzdGlvbkRpYWxvZ1wiO1xuaW1wb3J0IEJhc2VEaWFsb2cgZnJvbSBcIi4vQmFzZURpYWxvZ1wiO1xuaW1wb3J0IEZpZWxkIGZyb20gXCIuLi9lbGVtZW50cy9GaWVsZFwiO1xuaW1wb3J0IFNwaW5uZXIgZnJvbSBcIi4uL2VsZW1lbnRzL1NwaW5uZXJcIjtcbmltcG9ydCBEaWFsb2dCdXR0b25zIGZyb20gXCIuLi9lbGVtZW50cy9EaWFsb2dCdXR0b25zXCI7XG5pbXBvcnQgeyBzZW5kU2VudHJ5UmVwb3J0IH0gZnJvbSBcIi4uLy4uLy4uL3NlbnRyeVwiO1xuaW1wb3J0IGRlZmF1bHREaXNwYXRjaGVyIGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2FjdGlvbnNcIjtcbmltcG9ydCB7IGdldEJyb3dzZXJTdXBwb3J0IH0gZnJvbSBcIi4uLy4uLy4uL1N1cHBvcnRlZEJyb3dzZXJcIjtcblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgb25GaW5pc2hlZDogKHN1Y2Nlc3M6IGJvb2xlYW4pID0+IHZvaWQ7XG4gICAgaW5pdGlhbFRleHQ/OiBzdHJpbmc7XG4gICAgbGFiZWw/OiBzdHJpbmc7XG4gICAgZXJyb3I/OiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBzZW5kTG9nczogYm9vbGVhbjtcbiAgICBidXN5OiBib29sZWFuO1xuICAgIGVycjogc3RyaW5nIHwgbnVsbDtcbiAgICBpc3N1ZVVybDogc3RyaW5nO1xuICAgIHRleHQ6IHN0cmluZztcbiAgICBwcm9ncmVzczogc3RyaW5nIHwgbnVsbDtcbiAgICBkb3dubG9hZEJ1c3k6IGJvb2xlYW47XG4gICAgZG93bmxvYWRQcm9ncmVzczogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnVnUmVwb3J0RGlhbG9nIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PElQcm9wcywgSVN0YXRlPiB7XG4gICAgcHJpdmF0ZSB1bm1vdW50ZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBpc3N1ZVJlZjogUmVhY3QuUmVmT2JqZWN0PEZpZWxkPjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogSVByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgc2VuZExvZ3M6IHRydWUsXG4gICAgICAgICAgICBidXN5OiBmYWxzZSxcbiAgICAgICAgICAgIGVycjogbnVsbCxcbiAgICAgICAgICAgIGlzc3VlVXJsOiBcIlwiLFxuICAgICAgICAgICAgdGV4dDogcHJvcHMuaW5pdGlhbFRleHQgfHwgXCJcIixcbiAgICAgICAgICAgIHByb2dyZXNzOiBudWxsLFxuICAgICAgICAgICAgZG93bmxvYWRCdXN5OiBmYWxzZSxcbiAgICAgICAgICAgIGRvd25sb2FkUHJvZ3Jlc3M6IG51bGwsXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy51bm1vdW50ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc3N1ZVJlZiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuXG4gICAgICAgIC8vIEdldCBhbGwgb2YgdGhlIGV4dHJhIGluZm8gZHVtcGVkIHRvIHRoZSBjb25zb2xlIHdoZW4gc29tZW9uZSBpcyBhYm91dFxuICAgICAgICAvLyB0byBzZW5kIGRlYnVnIGxvZ3MuIFNpbmNlIHRoaXMgaXMgYSBmaXJlIGFuZCBmb3JnZXQgYWN0aW9uLCB3ZSBkb1xuICAgICAgICAvLyB0aGlzIHdoZW4gdGhlIGJ1ZyByZXBvcnQgZGlhbG9nIGlzIG9wZW5lZCBpbnN0ZWFkIG9mIHdoZW4gd2Ugc3VibWl0XG4gICAgICAgIC8vIGxvZ3MgYmVjYXVzZSB3ZSBoYXZlIG5vIHNpZ25hbCB0byBrbm93IHdoZW4gYWxsIG9mIHRoZSB2YXJpb3VzXG4gICAgICAgIC8vIGNvbXBvbmVudHMgaGF2ZSBmaW5pc2hlZCBsb2dnaW5nLiBTb21lb25lIGNvdWxkIHBvdGVudGlhbGx5IHNlbmQgbG9nc1xuICAgICAgICAvLyBiZWZvcmUgd2UgZnVsbHkgZHVtcCBldmVyeXRoaW5nIGJ1dCBpdCdzIHByb2JhYmx5IHVubGlrZWx5LlxuICAgICAgICBkZWZhdWx0RGlzcGF0Y2hlci5kaXNwYXRjaCh7XG4gICAgICAgICAgICBhY3Rpb246IEFjdGlvbi5EdW1wRGVidWdMb2dzLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50RGlkTW91bnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNzdWVSZWYuY3VycmVudD8uZm9jdXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50V2lsbFVubW91bnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudW5tb3VudGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQ2FuY2VsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnByb3BzLm9uRmluaXNoZWQoZmFsc2UpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uU3VibWl0ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoKCF0aGlzLnN0YXRlLnRleHQgfHwgIXRoaXMuc3RhdGUudGV4dC50cmltKCkpICYmICghdGhpcy5zdGF0ZS5pc3N1ZVVybCB8fCAhdGhpcy5zdGF0ZS5pc3N1ZVVybC50cmltKCkpKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBlcnI6IF90KFwiYnVnX3JlcG9ydGluZ3xlcnJvcl9lbXB0eVwiKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXNlclRleHQgPVxuICAgICAgICAgICAgKHRoaXMuc3RhdGUudGV4dC5sZW5ndGggPiAwID8gdGhpcy5zdGF0ZS50ZXh0ICsgXCJcXG5cXG5cIiA6IFwiXCIpICtcbiAgICAgICAgICAgIFwiSXNzdWU6IFwiICtcbiAgICAgICAgICAgICh0aGlzLnN0YXRlLmlzc3VlVXJsLmxlbmd0aCA+IDAgPyB0aGlzLnN0YXRlLmlzc3VlVXJsIDogXCJObyBpc3N1ZSBsaW5rIGdpdmVuXCIpO1xuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBidXN5OiB0cnVlLCBwcm9ncmVzczogbnVsbCwgZXJyOiBudWxsIH0pO1xuICAgICAgICB0aGlzLnNlbmRQcm9ncmVzc0NhbGxiYWNrKF90KFwiYnVnX3JlcG9ydGluZ3xwcmVwYXJpbmdfbG9nc1wiKSk7XG5cbiAgICAgICAgc2VuZEJ1Z1JlcG9ydChTZGtDb25maWcuZ2V0KCkuYnVnX3JlcG9ydF9lbmRwb2ludF91cmwsIHtcbiAgICAgICAgICAgIHVzZXJUZXh0LFxuICAgICAgICAgICAgc2VuZExvZ3M6IHRydWUsXG4gICAgICAgICAgICBwcm9ncmVzc0NhbGxiYWNrOiB0aGlzLnNlbmRQcm9ncmVzc0NhbGxiYWNrLFxuICAgICAgICAgICAgbGFiZWxzOiB0aGlzLnByb3BzLmxhYmVsID8gW3RoaXMucHJvcHMubGFiZWxdIDogW10sXG4gICAgICAgIH0pLnRoZW4oXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnVubW91bnRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm9uRmluaXNoZWQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBNb2RhbC5jcmVhdGVEaWFsb2coUXVlc3Rpb25EaWFsb2csIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBfdChcImJ1Z19yZXBvcnRpbmd8bG9nc19zZW50XCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IF90KFwiYnVnX3JlcG9ydGluZ3x0aGFua195b3VcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNDYW5jZWxCdXR0b246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy51bm1vdW50ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBidXN5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyOiBfdChcImJ1Z19yZXBvcnRpbmd8ZmFpbGVkX3NlbmRfbG9nc1wiKSArIGAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgc2VuZFNlbnRyeVJlcG9ydCh0aGlzLnN0YXRlLnRleHQsIHRoaXMuc3RhdGUuaXNzdWVVcmwsIHRoaXMucHJvcHMuZXJyb3IpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uRG93bmxvYWQgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBkb3dubG9hZEJ1c3k6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuZG93bmxvYWRQcm9ncmVzc0NhbGxiYWNrKF90KFwiYnVnX3JlcG9ydGluZ3xwcmVwYXJpbmdfZG93bmxvYWRcIikpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBkb3dubG9hZEJ1Z1JlcG9ydCh7XG4gICAgICAgICAgICAgICAgc2VuZExvZ3M6IHRydWUsXG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NDYWxsYmFjazogdGhpcy5kb3dubG9hZFByb2dyZXNzQ2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgbGFiZWxzOiB0aGlzLnByb3BzLmxhYmVsID8gW3RoaXMucHJvcHMubGFiZWxdIDogW10sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgZG93bmxvYWRCdXN5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBkb3dubG9hZFByb2dyZXNzOiBudWxsLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnVubW91bnRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICBkb3dubG9hZEJ1c3k6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBkb3dubG9hZFByb2dyZXNzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX3QoXCJidWdfcmVwb3J0aW5nfGZhaWxlZF9zZW5kX2xvZ3NcIikgKyBgJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogXCJcIn1gLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25UZXh0Q2hhbmdlID0gKGV2OiBSZWFjdC5Gb3JtRXZlbnQ8SFRNTFRleHRBcmVhRWxlbWVudD4pOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHRleHQ6IGV2LmN1cnJlbnRUYXJnZXQudmFsdWUgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25Jc3N1ZVVybENoYW5nZSA9IChldjogUmVhY3QuRm9ybUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc3N1ZVVybDogZXYuY3VycmVudFRhcmdldC52YWx1ZSB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzZW5kUHJvZ3Jlc3NDYWxsYmFjayA9IChwcm9ncmVzczogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLnVubW91bnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBwcm9ncmVzcyB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBkb3dubG9hZFByb2dyZXNzQ2FsbGJhY2sgPSAoZG93bmxvYWRQcm9ncmVzczogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLnVubW91bnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBkb3dubG9hZFByb2dyZXNzIH0pO1xuICAgIH07XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIGxldCBlcnJvcjogSlNYLkVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmVycikge1xuICAgICAgICAgICAgZXJyb3IgPSA8ZGl2IGNsYXNzTmFtZT1cImVycm9yXCI+e3RoaXMuc3RhdGUuZXJyfTwvZGl2PjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwcm9ncmVzczogSlNYLkVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmJ1c3kpIHtcbiAgICAgICAgICAgIHByb2dyZXNzID0gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgPFNwaW5uZXIgLz5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMuc3RhdGUucHJvZ3Jlc3N9IC4uLlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB3YXJuaW5nOiBKU1guRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKHdpbmRvdy5Nb2Rlcm5penIgJiYgT2JqZWN0LnZhbHVlcyh3aW5kb3cuTW9kZXJuaXpyKS5zb21lKChzdXBwb3J0KSA9PiBzdXBwb3J0ID09PSBmYWxzZSkpIHx8XG4gICAgICAgICAgICAhZ2V0QnJvd3NlclN1cHBvcnQoKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHdhcm5pbmcgPSAoXG4gICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e190KFwiYnVnX3JlcG9ydGluZ3x1bnN1cHBvcnRlZF9icm93c2VyXCIpfTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEJhc2VEaWFsb2dcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9CdWdSZXBvcnREaWFsb2dcIlxuICAgICAgICAgICAgICAgIG9uRmluaXNoZWQ9e3RoaXMub25DYW5jZWx9XG4gICAgICAgICAgICAgICAgdGl0bGU9e190KFwiYnVnX3JlcG9ydGluZ3xzdWJtaXRfZGVidWdfbG9nc1wiKX1cbiAgICAgICAgICAgICAgICBjb250ZW50SWQ9XCJteF9EaWFsb2dfY29udGVudFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9EaWFsb2dfY29udGVudFwiIGlkPVwibXhfRGlhbG9nX2NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAge3dhcm5pbmd9XG4gICAgICAgICAgICAgICAgICAgIDxwPntfdChcImJ1Z19yZXBvcnRpbmd8ZGVzY3JpcHRpb25cIil9PC9wPlxuICAgICAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge190KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1Z19yZXBvcnRpbmd8YmVmb3JlX3N1Ym1pdHRpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGE6IChzdWIpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPXtTZGtDb25maWcuZ2V0KCkuZmVlZGJhY2submV3X2lzc3VlX3VybH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9yZWZlcnJlciBub29wZW5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3VifVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9CdWdSZXBvcnREaWFsb2dfZG93bmxvYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uIG9uQ2xpY2s9e3RoaXMub25Eb3dubG9hZH0ga2luZD1cImxpbmtcIiBkaXNhYmxlZD17dGhpcy5zdGF0ZS5kb3dubG9hZEJ1c3l9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcImJ1Z19yZXBvcnRpbmd8ZG93bmxvYWRfbG9nc1wiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnN0YXRlLmRvd25sb2FkUHJvZ3Jlc3MgJiYgPHNwYW4+e3RoaXMuc3RhdGUuZG93bmxvYWRQcm9ncmVzc30gLi4uPC9zcGFuPn1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9CdWdSZXBvcnREaWFsb2dfZmllbGRfaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwiYnVnX3JlcG9ydGluZ3xnaXRodWJfaXNzdWVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5vbklzc3VlVXJsQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUuaXNzdWVVcmx9XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImh0dHBzOi8vZ2l0aHViLmNvbS92ZWN0b3ItaW0vZWxlbWVudC13ZWIvaXNzdWVzLy4uLlwiXG4gICAgICAgICAgICAgICAgICAgICAgICByZWY9e3RoaXMuaXNzdWVSZWZ9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfQnVnUmVwb3J0RGlhbG9nX2ZpZWxkX2lucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ9XCJ0ZXh0YXJlYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJidWdfcmVwb3J0aW5nfHRleHRhcmVhX2xhYmVsXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgcm93cz17NX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLm9uVGV4dENoYW5nZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLnRleHR9XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17X3QoXCJidWdfcmVwb3J0aW5nfGFkZGl0aW9uYWxfY29udGV4dFwiKX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAge3Byb2dyZXNzfVxuICAgICAgICAgICAgICAgICAgICB7ZXJyb3J9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPERpYWxvZ0J1dHRvbnNcbiAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUJ1dHRvbj17X3QoXCJidWdfcmVwb3J0aW5nfHNlbmRfbG9nc1wiKX1cbiAgICAgICAgICAgICAgICAgICAgb25QcmltYXJ5QnV0dG9uQ2xpY2s9e3RoaXMub25TdWJtaXR9XG4gICAgICAgICAgICAgICAgICAgIGZvY3VzPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbD17dGhpcy5vbkNhbmNlbH1cbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuYnVzeX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9CYXNlRGlhbG9nPlxuICAgICAgICApO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFXQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBQyxVQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxNQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksZ0JBQUEsR0FBQUMsdUJBQUEsQ0FBQUwsT0FBQTtBQUNBLElBQUFNLGlCQUFBLEdBQUFQLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTyxlQUFBLEdBQUFSLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUSxXQUFBLEdBQUFULHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUyxNQUFBLEdBQUFWLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVSxRQUFBLEdBQUFYLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVyxjQUFBLEdBQUFaLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBWSxPQUFBLEdBQUFaLE9BQUE7QUFDQSxJQUFBYSxXQUFBLEdBQUFkLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBYyxRQUFBLEdBQUFkLE9BQUE7QUFDQSxJQUFBZSxpQkFBQSxHQUFBZixPQUFBO0FBQThELFNBQUFnQix5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxt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