matrix-react-sdk
Version:
SDK for matrix.org using React
183 lines (180 loc) • 26.8 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 _cryptoApi = require("matrix-js-sdk/src/crypto-api");
var _logger = require("matrix-js-sdk/src/logger");
var _languageHandler = require("../../../languageHandler");
var _MatrixClientPeg = require("../../../MatrixClientPeg");
var _RightPanelStorePhases = require("../../../stores/right-panel/RightPanelStorePhases");
var _KeyVerificationStateObserver = require("../../../utils/KeyVerificationStateObserver");
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _ToastStore = _interopRequireDefault(require("../../../stores/ToastStore"));
var _Modal = _interopRequireDefault(require("../../../Modal"));
var _GenericToast = _interopRequireDefault(require("./GenericToast"));
var _actions = require("../../../dispatcher/actions");
var _VerificationRequestDialog = _interopRequireDefault(require("../dialogs/VerificationRequestDialog"));
var _RightPanelStore = _interopRequireDefault(require("../../../stores/right-panel/RightPanelStore"));
var _deviceInfo = require("../../../utils/crypto/deviceInfo");
/*
Copyright 2024 New Vector Ltd.
Copyright 2019-2021 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
class VerificationRequestToast extends _react.default.PureComponent {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "intervalHandle", void 0);
(0, _defineProperty2.default)(this, "checkRequestIsPending", () => {
const {
request
} = this.props;
if (!(0, _cryptoApi.canAcceptVerificationRequest)(request)) {
_ToastStore.default.sharedInstance().dismissToast(this.props.toastKey);
}
});
(0, _defineProperty2.default)(this, "cancel", () => {
_ToastStore.default.sharedInstance().dismissToast(this.props.toastKey);
try {
this.props.request.cancel();
} catch (err) {
_logger.logger.error("Error while cancelling verification request", err);
}
});
(0, _defineProperty2.default)(this, "accept", async () => {
_ToastStore.default.sharedInstance().dismissToast(this.props.toastKey);
const {
request
} = this.props;
// no room id for to_device requests
const cli = _MatrixClientPeg.MatrixClientPeg.safeGet();
try {
if (request.roomId) {
_dispatcher.default.dispatch({
action: _actions.Action.ViewRoom,
room_id: request.roomId,
should_peek: false,
metricsTrigger: "VerificationRequest"
});
const member = cli.getUser(request.otherUserId) ?? undefined;
_RightPanelStore.default.instance.setCards([{
phase: _RightPanelStorePhases.RightPanelPhases.RoomSummary
}, {
phase: _RightPanelStorePhases.RightPanelPhases.RoomMemberInfo,
state: {
member
}
}, {
phase: _RightPanelStorePhases.RightPanelPhases.EncryptionPanel,
state: {
verificationRequest: request,
member
}
}], undefined, request.roomId);
} else {
_Modal.default.createDialog(_VerificationRequestDialog.default, {
verificationRequest: request,
onFinished: () => {
request.cancel();
}
}, undefined, /* priority = */false, /* static = */true);
}
await request.accept();
} catch (err) {
_logger.logger.error("Failed to accept verification request", err);
}
});
this.state = {
counter: Math.ceil((props.request.timeout ?? 0) / 1000)
};
}
async componentDidMount() {
const {
request
} = this.props;
if (request.timeout && request.timeout > 0) {
this.intervalHandle = window.setInterval(() => {
let {
counter
} = this.state;
counter = Math.max(0, counter - 1);
this.setState({
counter
});
}, 1000);
}
request.on(_cryptoApi.VerificationRequestEvent.Change, this.checkRequestIsPending);
// We should probably have a separate class managing the active verification toasts,
// rather than monitoring this in the toast component itself, since we'll get problems
// like the toast not going away when the verification is cancelled unless it's the
// one on the top (ie. the one that's mounted).
// As a quick & dirty fix, check the toast is still relevant when it mounts (this prevents
// a toast hanging around after logging in if you did a verification as part of login).
this.checkRequestIsPending();
const otherDeviceId = request.otherDeviceId;
if (request.isSelfVerification && !!otherDeviceId) {
const cli = _MatrixClientPeg.MatrixClientPeg.safeGet();
const device = await cli.getDevice(otherDeviceId);
this.setState({
ip: device.last_seen_ip,
device: await (0, _deviceInfo.getDeviceCryptoInfo)(cli, cli.getSafeUserId(), otherDeviceId)
});
}
}
componentWillUnmount() {
clearInterval(this.intervalHandle);
const {
request
} = this.props;
request.off(_cryptoApi.VerificationRequestEvent.Change, this.checkRequestIsPending);
}
render() {
const {
request
} = this.props;
let description;
let detail;
if (request.isSelfVerification) {
if (this.state.device) {
description = this.state.device.displayName;
detail = (0, _languageHandler._t)("encryption|verification|request_toast_detail", {
deviceId: this.state.device.deviceId,
ip: this.state.ip
});
}
} else {
const client = _MatrixClientPeg.MatrixClientPeg.safeGet();
const userId = request.otherUserId;
const roomId = request.roomId;
description = roomId ? (0, _KeyVerificationStateObserver.userLabelForEventRoom)(client, userId, roomId) : userId;
// for legacy to_device verification requests
if (description === userId) {
const user = client.getUser(userId);
if (user && user.displayName) {
description = (0, _languageHandler._t)("name_and_id", {
name: user.displayName,
userId
});
}
}
}
const declineLabel = this.state.counter === 0 ? (0, _languageHandler._t)("action|ignore") : (0, _languageHandler._t)("encryption|verification|request_toast_decline_counter", {
counter: this.state.counter
});
return /*#__PURE__*/_react.default.createElement(_GenericToast.default, {
description: description,
detail: detail,
primaryLabel: request.isSelfVerification || !request.roomId ? (0, _languageHandler._t)("encryption|verification|request_toast_accept") : (0, _languageHandler._t)("encryption|verification|request_toast_accept_user"),
onPrimaryClick: this.accept,
secondaryLabel: declineLabel,
onSecondaryClick: this.cancel
});
}
}
exports.default = VerificationRequestToast;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9jcnlwdG9BcGkiLCJfbG9nZ2VyIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9NYXRyaXhDbGllbnRQZWciLCJfUmlnaHRQYW5lbFN0b3JlUGhhc2VzIiwiX0tleVZlcmlmaWNhdGlvblN0YXRlT2JzZXJ2ZXIiLCJfZGlzcGF0Y2hlciIsIl9Ub2FzdFN0b3JlIiwiX01vZGFsIiwiX0dlbmVyaWNUb2FzdCIsIl9hY3Rpb25zIiwiX1ZlcmlmaWNhdGlvblJlcXVlc3REaWFsb2ciLCJfUmlnaHRQYW5lbFN0b3JlIiwiX2RldmljZUluZm8iLCJWZXJpZmljYXRpb25SZXF1ZXN0VG9hc3QiLCJSZWFjdCIsIlB1cmVDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJyZXF1ZXN0IiwiY2FuQWNjZXB0VmVyaWZpY2F0aW9uUmVxdWVzdCIsIlRvYXN0U3RvcmUiLCJzaGFyZWRJbnN0YW5jZSIsImRpc21pc3NUb2FzdCIsInRvYXN0S2V5IiwiY2FuY2VsIiwiZXJyIiwibG9nZ2VyIiwiZXJyb3IiLCJjbGkiLCJNYXRyaXhDbGllbnRQZWciLCJzYWZlR2V0Iiwicm9vbUlkIiwiZGlzIiwiZGlzcGF0Y2giLCJhY3Rpb24iLCJBY3Rpb24iLCJWaWV3Um9vbSIsInJvb21faWQiLCJzaG91bGRfcGVlayIsIm1ldHJpY3NUcmlnZ2VyIiwibWVtYmVyIiwiZ2V0VXNlciIsIm90aGVyVXNlcklkIiwidW5kZWZpbmVkIiwiUmlnaHRQYW5lbFN0b3JlIiwiaW5zdGFuY2UiLCJzZXRDYXJkcyIsInBoYXNlIiwiUmlnaHRQYW5lbFBoYXNlcyIsIlJvb21TdW1tYXJ5IiwiUm9vbU1lbWJlckluZm8iLCJzdGF0ZSIsIkVuY3J5cHRpb25QYW5lbCIsInZlcmlmaWNhdGlvblJlcXVlc3QiLCJNb2RhbCIsImNyZWF0ZURpYWxvZyIsIlZlcmlmaWNhdGlvblJlcXVlc3REaWFsb2ciLCJvbkZpbmlzaGVkIiwiYWNjZXB0IiwiY291bnRlciIsIk1hdGgiLCJjZWlsIiwidGltZW91dCIsImNvbXBvbmVudERpZE1vdW50IiwiaW50ZXJ2YWxIYW5kbGUiLCJ3aW5kb3ciLCJzZXRJbnRlcnZhbCIsIm1heCIsInNldFN0YXRlIiwib24iLCJWZXJpZmljYXRpb25SZXF1ZXN0RXZlbnQiLCJDaGFuZ2UiLCJjaGVja1JlcXVlc3RJc1BlbmRpbmciLCJvdGhlckRldmljZUlkIiwiaXNTZWxmVmVyaWZpY2F0aW9uIiwiZGV2aWNlIiwiZ2V0RGV2aWNlIiwiaXAiLCJsYXN0X3NlZW5faXAiLCJnZXREZXZpY2VDcnlwdG9JbmZvIiwiZ2V0U2FmZVVzZXJJZCIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwiY2xlYXJJbnRlcnZhbCIsIm9mZiIsInJlbmRlciIsImRlc2NyaXB0aW9uIiwiZGV0YWlsIiwiZGlzcGxheU5hbWUiLCJfdCIsImRldmljZUlkIiwiY2xpZW50IiwidXNlcklkIiwidXNlckxhYmVsRm9yRXZlbnRSb29tIiwidXNlciIsIm5hbWUiLCJkZWNsaW5lTGFiZWwiLCJjcmVhdGVFbGVtZW50IiwicHJpbWFyeUxhYmVsIiwib25QcmltYXJ5Q2xpY2siLCJzZWNvbmRhcnlMYWJlbCIsIm9uU2Vjb25kYXJ5Q2xpY2siLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3MvdG9hc3RzL1ZlcmlmaWNhdGlvblJlcXVlc3RUb2FzdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTktMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQge1xuICAgIGNhbkFjY2VwdFZlcmlmaWNhdGlvblJlcXVlc3QsXG4gICAgVmVyaWZpY2F0aW9uUmVxdWVzdCxcbiAgICBWZXJpZmljYXRpb25SZXF1ZXN0RXZlbnQsXG59IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9jcnlwdG8tYXBpXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBEZXZpY2UgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5cbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSBcIi4uLy4uLy4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0IHsgUmlnaHRQYW5lbFBoYXNlcyB9IGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvcmlnaHQtcGFuZWwvUmlnaHRQYW5lbFN0b3JlUGhhc2VzXCI7XG5pbXBvcnQgeyB1c2VyTGFiZWxGb3JFdmVudFJvb20gfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvS2V5VmVyaWZpY2F0aW9uU3RhdGVPYnNlcnZlclwiO1xuaW1wb3J0IGRpcyBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyXCI7XG5pbXBvcnQgVG9hc3RTdG9yZSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL1RvYXN0U3RvcmVcIjtcbmltcG9ydCBNb2RhbCBmcm9tIFwiLi4vLi4vLi4vTW9kYWxcIjtcbmltcG9ydCBHZW5lcmljVG9hc3QgZnJvbSBcIi4vR2VuZXJpY1RvYXN0XCI7XG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9hY3Rpb25zXCI7XG5pbXBvcnQgVmVyaWZpY2F0aW9uUmVxdWVzdERpYWxvZyBmcm9tIFwiLi4vZGlhbG9ncy9WZXJpZmljYXRpb25SZXF1ZXN0RGlhbG9nXCI7XG5pbXBvcnQgUmlnaHRQYW5lbFN0b3JlIGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvcmlnaHQtcGFuZWwvUmlnaHRQYW5lbFN0b3JlXCI7XG5pbXBvcnQgeyBWaWV3Um9vbVBheWxvYWQgfSBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9wYXlsb2Fkcy9WaWV3Um9vbVBheWxvYWRcIjtcbmltcG9ydCB7IGdldERldmljZUNyeXB0b0luZm8gfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvY3J5cHRvL2RldmljZUluZm9cIjtcblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgdG9hc3RLZXk6IHN0cmluZztcbiAgICByZXF1ZXN0OiBWZXJpZmljYXRpb25SZXF1ZXN0O1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICAvKiogbnVtYmVyIG9mIHNlY29uZHMgbGVmdCBpbiB0aGUgdGltZW91dCBjb3VudGVyLiBaZXJvIGlmIHRoZXJlIGlzIG5vIHRpbWVvdXQuICovXG4gICAgY291bnRlcjogbnVtYmVyO1xuICAgIGRldmljZT86IERldmljZTtcbiAgICBpcD86IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVyaWZpY2F0aW9uUmVxdWVzdFRvYXN0IGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHByaXZhdGUgaW50ZXJ2YWxIYW5kbGU/OiBudW1iZXI7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHM6IElQcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7IGNvdW50ZXI6IE1hdGguY2VpbCgocHJvcHMucmVxdWVzdC50aW1lb3V0ID8/IDApIC8gMTAwMCkgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY29tcG9uZW50RGlkTW91bnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgcmVxdWVzdCB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgaWYgKHJlcXVlc3QudGltZW91dCAmJiByZXF1ZXN0LnRpbWVvdXQgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmludGVydmFsSGFuZGxlID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgeyBjb3VudGVyIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgICAgICAgIGNvdW50ZXIgPSBNYXRoLm1heCgwLCBjb3VudGVyIC0gMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGNvdW50ZXIgfSk7XG4gICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0Lm9uKFZlcmlmaWNhdGlvblJlcXVlc3RFdmVudC5DaGFuZ2UsIHRoaXMuY2hlY2tSZXF1ZXN0SXNQZW5kaW5nKTtcbiAgICAgICAgLy8gV2Ugc2hvdWxkIHByb2JhYmx5IGhhdmUgYSBzZXBhcmF0ZSBjbGFzcyBtYW5hZ2luZyB0aGUgYWN0aXZlIHZlcmlmaWNhdGlvbiB0b2FzdHMsXG4gICAgICAgIC8vIHJhdGhlciB0aGFuIG1vbml0b3JpbmcgdGhpcyBpbiB0aGUgdG9hc3QgY29tcG9uZW50IGl0c2VsZiwgc2luY2Ugd2UnbGwgZ2V0IHByb2JsZW1zXG4gICAgICAgIC8vIGxpa2UgdGhlIHRvYXN0IG5vdCBnb2luZyBhd2F5IHdoZW4gdGhlIHZlcmlmaWNhdGlvbiBpcyBjYW5jZWxsZWQgdW5sZXNzIGl0J3MgdGhlXG4gICAgICAgIC8vIG9uZSBvbiB0aGUgdG9wIChpZS4gdGhlIG9uZSB0aGF0J3MgbW91bnRlZCkuXG4gICAgICAgIC8vIEFzIGEgcXVpY2sgJiBkaXJ0eSBmaXgsIGNoZWNrIHRoZSB0b2FzdCBpcyBzdGlsbCByZWxldmFudCB3aGVuIGl0IG1vdW50cyAodGhpcyBwcmV2ZW50c1xuICAgICAgICAvLyBhIHRvYXN0IGhhbmdpbmcgYXJvdW5kIGFmdGVyIGxvZ2dpbmcgaW4gaWYgeW91IGRpZCBhIHZlcmlmaWNhdGlvbiBhcyBwYXJ0IG9mIGxvZ2luKS5cbiAgICAgICAgdGhpcy5jaGVja1JlcXVlc3RJc1BlbmRpbmcoKTtcblxuICAgICAgICBjb25zdCBvdGhlckRldmljZUlkID0gcmVxdWVzdC5vdGhlckRldmljZUlkO1xuICAgICAgICBpZiAocmVxdWVzdC5pc1NlbGZWZXJpZmljYXRpb24gJiYgISFvdGhlckRldmljZUlkKSB7XG4gICAgICAgICAgICBjb25zdCBjbGkgPSBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpO1xuICAgICAgICAgICAgY29uc3QgZGV2aWNlID0gYXdhaXQgY2xpLmdldERldmljZShvdGhlckRldmljZUlkKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGlwOiBkZXZpY2UubGFzdF9zZWVuX2lwLFxuICAgICAgICAgICAgICAgIGRldmljZTogYXdhaXQgZ2V0RGV2aWNlQ3J5cHRvSW5mbyhjbGksIGNsaS5nZXRTYWZlVXNlcklkKCksIG90aGVyRGV2aWNlSWQpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50V2lsbFVubW91bnQoKTogdm9pZCB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbEhhbmRsZSk7XG4gICAgICAgIGNvbnN0IHsgcmVxdWVzdCB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgcmVxdWVzdC5vZmYoVmVyaWZpY2F0aW9uUmVxdWVzdEV2ZW50LkNoYW5nZSwgdGhpcy5jaGVja1JlcXVlc3RJc1BlbmRpbmcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tSZXF1ZXN0SXNQZW5kaW5nID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCB7IHJlcXVlc3QgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGlmICghY2FuQWNjZXB0VmVyaWZpY2F0aW9uUmVxdWVzdChyZXF1ZXN0KSkge1xuICAgICAgICAgICAgVG9hc3RTdG9yZS5zaGFyZWRJbnN0YW5jZSgpLmRpc21pc3NUb2FzdCh0aGlzLnByb3BzLnRvYXN0S2V5KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwdWJsaWMgY2FuY2VsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBUb2FzdFN0b3JlLnNoYXJlZEluc3RhbmNlKCkuZGlzbWlzc1RvYXN0KHRoaXMucHJvcHMudG9hc3RLZXkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5yZXF1ZXN0LmNhbmNlbCgpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkVycm9yIHdoaWxlIGNhbmNlbGxpbmcgdmVyaWZpY2F0aW9uIHJlcXVlc3RcIiwgZXJyKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwdWJsaWMgYWNjZXB0ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBUb2FzdFN0b3JlLnNoYXJlZEluc3RhbmNlKCkuZGlzbWlzc1RvYXN0KHRoaXMucHJvcHMudG9hc3RLZXkpO1xuICAgICAgICBjb25zdCB7IHJlcXVlc3QgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIC8vIG5vIHJvb20gaWQgZm9yIHRvX2RldmljZSByZXF1ZXN0c1xuICAgICAgICBjb25zdCBjbGkgPSBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHJlcXVlc3Qucm9vbUlkKSB7XG4gICAgICAgICAgICAgICAgZGlzLmRpc3BhdGNoPFZpZXdSb29tUGF5bG9hZD4oe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IEFjdGlvbi5WaWV3Um9vbSxcbiAgICAgICAgICAgICAgICAgICAgcm9vbV9pZDogcmVxdWVzdC5yb29tSWQsXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZF9wZWVrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljc1RyaWdnZXI6IFwiVmVyaWZpY2F0aW9uUmVxdWVzdFwiLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lbWJlciA9IGNsaS5nZXRVc2VyKHJlcXVlc3Qub3RoZXJVc2VySWQpID8/IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBSaWdodFBhbmVsU3RvcmUuaW5zdGFuY2Uuc2V0Q2FyZHMoXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcGhhc2U6IFJpZ2h0UGFuZWxQaGFzZXMuUm9vbVN1bW1hcnkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcGhhc2U6IFJpZ2h0UGFuZWxQaGFzZXMuUm9vbU1lbWJlckluZm8sIHN0YXRlOiB7IG1lbWJlciB9IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHBoYXNlOiBSaWdodFBhbmVsUGhhc2VzLkVuY3J5cHRpb25QYW5lbCwgc3RhdGU6IHsgdmVyaWZpY2F0aW9uUmVxdWVzdDogcmVxdWVzdCwgbWVtYmVyIH0gfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnJvb21JZCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBNb2RhbC5jcmVhdGVEaWFsb2coXG4gICAgICAgICAgICAgICAgICAgIFZlcmlmaWNhdGlvblJlcXVlc3REaWFsb2csXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvblJlcXVlc3Q6IHJlcXVlc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkZpbmlzaGVkOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgLyogcHJpb3JpdHkgPSAqLyBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgLyogc3RhdGljID0gKi8gdHJ1ZSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgcmVxdWVzdC5hY2NlcHQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJGYWlsZWQgdG8gYWNjZXB0IHZlcmlmaWNhdGlvbiByZXF1ZXN0XCIsIGVycik7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBjb25zdCB7IHJlcXVlc3QgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGxldCBkZXNjcmlwdGlvbjtcbiAgICAgICAgbGV0IGRldGFpbDtcbiAgICAgICAgaWYgKHJlcXVlc3QuaXNTZWxmVmVyaWZpY2F0aW9uKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5kZXZpY2UpIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IHRoaXMuc3RhdGUuZGV2aWNlLmRpc3BsYXlOYW1lO1xuICAgICAgICAgICAgICAgIGRldGFpbCA9IF90KFwiZW5jcnlwdGlvbnx2ZXJpZmljYXRpb258cmVxdWVzdF90b2FzdF9kZXRhaWxcIiwge1xuICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZDogdGhpcy5zdGF0ZS5kZXZpY2UuZGV2aWNlSWQsXG4gICAgICAgICAgICAgICAgICAgIGlwOiB0aGlzLnN0YXRlLmlwLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY2xpZW50ID0gTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKTtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJJZCA9IHJlcXVlc3Qub3RoZXJVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCByb29tSWQgPSByZXF1ZXN0LnJvb21JZDtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gcm9vbUlkID8gdXNlckxhYmVsRm9yRXZlbnRSb29tKGNsaWVudCwgdXNlcklkLCByb29tSWQpIDogdXNlcklkO1xuICAgICAgICAgICAgLy8gZm9yIGxlZ2FjeSB0b19kZXZpY2UgdmVyaWZpY2F0aW9uIHJlcXVlc3RzXG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT09IHVzZXJJZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBjbGllbnQuZ2V0VXNlcih1c2VySWQpO1xuICAgICAgICAgICAgICAgIGlmICh1c2VyICYmIHVzZXIuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBfdChcIm5hbWVfYW5kX2lkXCIsIHsgbmFtZTogdXNlci5kaXNwbGF5TmFtZSwgdXNlcklkIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWNsaW5lTGFiZWwgPVxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5jb3VudGVyID09PSAwXG4gICAgICAgICAgICAgICAgPyBfdChcImFjdGlvbnxpZ25vcmVcIilcbiAgICAgICAgICAgICAgICA6IF90KFwiZW5jcnlwdGlvbnx2ZXJpZmljYXRpb258cmVxdWVzdF90b2FzdF9kZWNsaW5lX2NvdW50ZXJcIiwgeyBjb3VudGVyOiB0aGlzLnN0YXRlLmNvdW50ZXIgfSk7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxHZW5lcmljVG9hc3RcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj17ZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgICAgZGV0YWlsPXtkZXRhaWx9XG4gICAgICAgICAgICAgICAgcHJpbWFyeUxhYmVsPXtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5pc1NlbGZWZXJpZmljYXRpb24gfHwgIXJlcXVlc3Qucm9vbUlkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IF90KFwiZW5jcnlwdGlvbnx2ZXJpZmljYXRpb258cmVxdWVzdF90b2FzdF9hY2NlcHRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIDogX3QoXCJlbmNyeXB0aW9ufHZlcmlmaWNhdGlvbnxyZXF1ZXN0X3RvYXN0X2FjY2VwdF91c2VyXCIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9uUHJpbWFyeUNsaWNrPXt0aGlzLmFjY2VwdH1cbiAgICAgICAgICAgICAgICBzZWNvbmRhcnlMYWJlbD17ZGVjbGluZUxhYmVsfVxuICAgICAgICAgICAgICAgIG9uU2Vjb25kYXJ5Q2xpY2s9e3RoaXMuY2FuY2VsfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsVUFBQSxHQUFBRCxPQUFBO0FBS0EsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBR0EsSUFBQUcsZ0JBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLGdCQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxzQkFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sNkJBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFdBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFRLFdBQUEsR0FBQVQsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFTLE1BQUEsR0FBQVYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFVLGFBQUEsR0FBQVgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFXLFFBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLDBCQUFBLEdBQUFiLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBYSxnQkFBQSxHQUFBZCxzQkFBQSxDQUFBQyxPQUFBO0FBRUEs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