matrix-react-sdk
Version:
SDK for matrix.org using React
260 lines (216 loc) • 29.8 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 _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _classnames = _interopRequireDefault(require("classnames"));
var sdk = _interopRequireWildcard(require("../../../index"));
var _MatrixClientPeg = require("../../../MatrixClientPeg");
var _languageHandler = require("../../../languageHandler");
var _Modal = _interopRequireDefault(require("../../../Modal"));
var _InteractiveAuthEntryComponents = require("../auth/InteractiveAuthEntryComponents");
var _replaceableComponent = require("../../../utils/replaceableComponent");
var _dec, _class;
let DevicesPanel = (_dec = (0, _replaceableComponent.replaceableComponent)("views.settings.DevicesPanel"), _dec(_class = class DevicesPanel extends _react.default.Component {
constructor(props) {
super(props);
this.state = {
devices: undefined,
deviceLoadError: undefined,
selectedDevices: [],
deleting: false
};
this._unmounted = false;
this._renderDevice = this._renderDevice.bind(this);
this._onDeviceSelectionToggled = this._onDeviceSelectionToggled.bind(this);
this._onDeleteClick = this._onDeleteClick.bind(this);
}
componentDidMount() {
this._loadDevices();
}
componentWillUnmount() {
this._unmounted = true;
}
_loadDevices() {
_MatrixClientPeg.MatrixClientPeg.get().getDevices().then(resp => {
if (this._unmounted) {
return;
}
this.setState({
devices: resp.devices || []
});
}, error => {
if (this._unmounted) {
return;
}
let errtxt;
if (error.httpStatus == 404) {
// 404 probably means the HS doesn't yet support the API.
errtxt = (0, _languageHandler._t)("Your homeserver does not support session management.");
} else {
console.error("Error loading sessions:", error);
errtxt = (0, _languageHandler._t)("Unable to load session list");
}
this.setState({
deviceLoadError: errtxt
});
});
}
/*
* compare two devices, sorting from most-recently-seen to least-recently-seen
* (and then, for stability, by device id)
*/
_deviceCompare(a, b) {
// return < 0 if a comes before b, > 0 if a comes after b.
const lastSeenDelta = (b.last_seen_ts || 0) - (a.last_seen_ts || 0);
if (lastSeenDelta !== 0) {
return lastSeenDelta;
}
const idA = a.device_id;
const idB = b.device_id;
return idA < idB ? -1 : idA > idB ? 1 : 0;
}
_onDeviceSelectionToggled(device) {
if (this._unmounted) {
return;
}
const deviceId = device.device_id;
this.setState((state, props) => {
// Make a copy of the selected devices, then add or remove the device
const selectedDevices = state.selectedDevices.slice();
const i = selectedDevices.indexOf(deviceId);
if (i === -1) {
selectedDevices.push(deviceId);
} else {
selectedDevices.splice(i, 1);
}
return {
selectedDevices
};
});
}
_onDeleteClick() {
this.setState({
deleting: true
});
this._makeDeleteRequest(null).catch(error => {
if (this._unmounted) {
return;
}
if (error.httpStatus !== 401 || !error.data || !error.data.flows) {
// doesn't look like an interactive-auth failure
throw error;
} // pop up an interactive auth dialog
const InteractiveAuthDialog = sdk.getComponent("dialogs.InteractiveAuthDialog");
const numDevices = this.state.selectedDevices.length;
const dialogAesthetics = {
[_InteractiveAuthEntryComponents.SSOAuthEntry.PHASE_PREAUTH]: {
title: (0, _languageHandler._t)("Use Single Sign On to continue"),
body: (0, _languageHandler._t)("Confirm deleting these sessions by using Single Sign On to prove your identity.", {
count: numDevices
}),
continueText: (0, _languageHandler._t)("Single Sign On"),
continueKind: "primary"
},
[_InteractiveAuthEntryComponents.SSOAuthEntry.PHASE_POSTAUTH]: {
title: (0, _languageHandler._t)("Confirm deleting these sessions"),
body: (0, _languageHandler._t)("Click the button below to confirm deleting these sessions.", {
count: numDevices
}),
continueText: (0, _languageHandler._t)("Delete sessions", {
count: numDevices
}),
continueKind: "danger"
}
};
_Modal.default.createTrackedDialog('Delete Device Dialog', '', InteractiveAuthDialog, {
title: (0, _languageHandler._t)("Authentication"),
matrixClient: _MatrixClientPeg.MatrixClientPeg.get(),
authData: error.data,
makeRequest: this._makeDeleteRequest.bind(this),
aestheticsForStagePhases: {
[_InteractiveAuthEntryComponents.SSOAuthEntry.LOGIN_TYPE]: dialogAesthetics,
[_InteractiveAuthEntryComponents.SSOAuthEntry.UNSTABLE_LOGIN_TYPE]: dialogAesthetics
}
});
}).catch(e => {
console.error("Error deleting sessions", e);
if (this._unmounted) {
return;
}
}).finally(() => {
this.setState({
deleting: false
});
});
}
_makeDeleteRequest(auth) {
return _MatrixClientPeg.MatrixClientPeg.get().deleteMultipleDevices(this.state.selectedDevices, auth).then(() => {
// Remove the deleted devices from `devices`, reset selection to []
this.setState({
devices: this.state.devices.filter(d => !this.state.selectedDevices.includes(d.device_id)),
selectedDevices: []
});
});
}
_renderDevice(device) {
const DevicesPanelEntry = sdk.getComponent('settings.DevicesPanelEntry');
return /*#__PURE__*/_react.default.createElement(DevicesPanelEntry, {
key: device.device_id,
device: device,
selected: this.state.selectedDevices.includes(device.device_id),
onDeviceToggled: this._onDeviceSelectionToggled
});
}
render() {
const Spinner = sdk.getComponent("elements.Spinner");
const AccessibleButton = sdk.getComponent("elements.AccessibleButton");
if (this.state.deviceLoadError !== undefined) {
const classes = (0, _classnames.default)(this.props.className, "error");
return /*#__PURE__*/_react.default.createElement("div", {
className: classes
}, this.state.deviceLoadError);
}
const devices = this.state.devices;
if (devices === undefined) {
// still loading
const classes = this.props.className;
return /*#__PURE__*/_react.default.createElement(Spinner, {
className: classes
});
}
devices.sort(this._deviceCompare);
const deleteButton = this.state.deleting ? /*#__PURE__*/_react.default.createElement(Spinner, {
w: 22,
h: 22
}) : /*#__PURE__*/_react.default.createElement(AccessibleButton, {
onClick: this._onDeleteClick,
kind: "danger_sm"
}, (0, _languageHandler._t)("Delete %(count)s sessions", {
count: this.state.selectedDevices.length
}));
const classes = (0, _classnames.default)(this.props.className, "mx_DevicesPanel");
return /*#__PURE__*/_react.default.createElement("div", {
className: classes
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_DevicesPanel_header"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_DevicesPanel_deviceId"
}, (0, _languageHandler._t)("ID")), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_DevicesPanel_deviceName"
}, (0, _languageHandler._t)("Public Name")), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_DevicesPanel_deviceLastSeen"
}, (0, _languageHandler._t)("Last seen")), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_DevicesPanel_deviceButtons"
}, this.state.selectedDevices.length > 0 ? deleteButton : null)), devices.map(this._renderDevice));
}
}) || _class);
exports.default = DevicesPanel;
DevicesPanel.propTypes = {
className: _propTypes.default.string
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3NldHRpbmdzL0RldmljZXNQYW5lbC5qcyJdLCJuYW1lcyI6WyJEZXZpY2VzUGFuZWwiLCJSZWFjdCIsIkNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJzdGF0ZSIsImRldmljZXMiLCJ1bmRlZmluZWQiLCJkZXZpY2VMb2FkRXJyb3IiLCJzZWxlY3RlZERldmljZXMiLCJkZWxldGluZyIsIl91bm1vdW50ZWQiLCJfcmVuZGVyRGV2aWNlIiwiYmluZCIsIl9vbkRldmljZVNlbGVjdGlvblRvZ2dsZWQiLCJfb25EZWxldGVDbGljayIsImNvbXBvbmVudERpZE1vdW50IiwiX2xvYWREZXZpY2VzIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJNYXRyaXhDbGllbnRQZWciLCJnZXQiLCJnZXREZXZpY2VzIiwidGhlbiIsInJlc3AiLCJzZXRTdGF0ZSIsImVycm9yIiwiZXJydHh0IiwiaHR0cFN0YXR1cyIsImNvbnNvbGUiLCJfZGV2aWNlQ29tcGFyZSIsImEiLCJiIiwibGFzdFNlZW5EZWx0YSIsImxhc3Rfc2Vlbl90cyIsImlkQSIsImRldmljZV9pZCIsImlkQiIsImRldmljZSIsImRldmljZUlkIiwic2xpY2UiLCJpIiwiaW5kZXhPZiIsInB1c2giLCJzcGxpY2UiLCJfbWFrZURlbGV0ZVJlcXVlc3QiLCJjYXRjaCIsImRhdGEiLCJmbG93cyIsIkludGVyYWN0aXZlQXV0aERpYWxvZyIsInNkayIsImdldENvbXBvbmVudCIsIm51bURldmljZXMiLCJsZW5ndGgiLCJkaWFsb2dBZXN0aGV0aWNzIiwiU1NPQXV0aEVudHJ5IiwiUEhBU0VfUFJFQVVUSCIsInRpdGxlIiwiYm9keSIsImNvdW50IiwiY29udGludWVUZXh0IiwiY29udGludWVLaW5kIiwiUEhBU0VfUE9TVEFVVEgiLCJNb2RhbCIsImNyZWF0ZVRyYWNrZWREaWFsb2ciLCJtYXRyaXhDbGllbnQiLCJhdXRoRGF0YSIsIm1ha2VSZXF1ZXN0IiwiYWVzdGhldGljc0ZvclN0YWdlUGhhc2VzIiwiTE9HSU5fVFlQRSIsIlVOU1RBQkxFX0xPR0lOX1RZUEUiLCJlIiwiZmluYWxseSIsImF1dGgiLCJkZWxldGVNdWx0aXBsZURldmljZXMiLCJmaWx0ZXIiLCJkIiwiaW5jbHVkZXMiLCJEZXZpY2VzUGFuZWxFbnRyeSIsInJlbmRlciIsIlNwaW5uZXIiLCJBY2Nlc3NpYmxlQnV0dG9uIiwiY2xhc3NlcyIsImNsYXNzTmFtZSIsInNvcnQiLCJkZWxldGVCdXR0b24iLCJtYXAiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJzdHJpbmciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBaUJBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0lBR3FCQSxZLFdBRHBCLGdEQUFxQiw2QkFBckIsQyxnQkFBRCxNQUNxQkEsWUFEckIsU0FDMENDLGVBQU1DLFNBRGhELENBQzBEO0FBQ3REQyxFQUFBQSxXQUFXLENBQUNDLEtBQUQsRUFBUTtBQUNmLFVBQU1BLEtBQU47QUFFQSxTQUFLQyxLQUFMLEdBQWE7QUFDVEMsTUFBQUEsT0FBTyxFQUFFQyxTQURBO0FBRVRDLE1BQUFBLGVBQWUsRUFBRUQsU0FGUjtBQUlURSxNQUFBQSxlQUFlLEVBQUUsRUFKUjtBQUtUQyxNQUFBQSxRQUFRLEVBQUU7QUFMRCxLQUFiO0FBUUEsU0FBS0MsVUFBTCxHQUFrQixLQUFsQjtBQUVBLFNBQUtDLGFBQUwsR0FBcUIsS0FBS0EsYUFBTCxDQUFtQkMsSUFBbkIsQ0FBd0IsSUFBeEIsQ0FBckI7QUFDQSxTQUFLQyx5QkFBTCxHQUFpQyxLQUFLQSx5QkFBTCxDQUErQkQsSUFBL0IsQ0FBb0MsSUFBcEMsQ0FBakM7QUFDQSxTQUFLRSxjQUFMLEdBQXNCLEtBQUtBLGNBQUwsQ0FBb0JGLElBQXBCLENBQXlCLElBQXpCLENBQXRCO0FBQ0g7O0FBRURHLEVBQUFBLGlCQUFpQixHQUFHO0FBQ2hCLFNBQUtDLFlBQUw7QUFDSDs7QUFF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LE1BRGlCLGdCQUVqQiw2QkFBQyxnQkFBRDtBQUFrQixNQUFBLE9BQU8sRUFBRSxLQUFLSyxjQUFoQztBQUFnRCxNQUFBLElBQUksRUFBQztBQUFyRCxPQUNNLHlCQUFHLDJCQUFILEVBQWdDO0FBQUMyQyxNQUFBQSxLQUFLLEVBQUUsS0FBS3JELEtBQUwsQ0FBV0ksZUFBWCxDQUEyQjJDO0FBQW5DLEtBQWhDLENBRE4sQ0FGSjtBQU1BLFVBQU02QixPQUFPLEdBQUcseUJBQVcsS0FBSzdFLEtBQUwsQ0FBVzhFLFNBQXRCLEVBQWlDLGlCQUFqQyxDQUFoQjtBQUNBLHdCQUNJO0FBQUssTUFBQSxTQUFTLEVBQUVEO0FBQWhCLG9CQUNJO0FBQUssTUFBQSxTQUFTLEVBQUM7QUFBZixvQkFDSTtBQUFLLE1BQUEsU0FBUyxFQUFDO0FBQWYsT0FBNEMseUJBQUcsSUFBSCxDQUE1QyxDQURKLGVBRUk7QUFBSyxNQUFBLFNBQVMsRUFBQztBQUFmLE9BQThDLHlCQUFHLGFBQUgsQ0FBOUMsQ0FGSixlQUdJO0FBQUssTUFBQSxTQUFTLEVBQUM7QUFBZixPQUFrRCx5QkFBRyxXQUFILENBQWxELENBSEosZUFJSTtBQUFLLE1BQUEsU0FBUyxFQUFDO0FBQWYsT0FDTSxLQUFLNUUsS0FBTCxDQUFXSSxlQUFYLENBQTJCMkMsTUFBM0IsR0FBb0MsQ0FBcEMsR0FBd0NnQyxZQUF4QyxHQUF1RCxJQUQ3RCxDQUpKLENBREosRUFTTTlFLE9BQU8sQ0FBQytFLEdBQVIsQ0FBWSxLQUFLekUsYUFBakIsQ0FUTixDQURKO0FBYUg7O0FBNU1xRCxDOztBQStNMURaLFlBQVksQ0FBQ3NGLFNBQWIsR0FBeUI7QUFDckJKLEVBQUFBLFNBQVMsRUFBRUssbUJBQVVDO0FBREEsQ0FBekIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMTYgT3Blbk1hcmtldCBMdGRcbkNvcHlyaWdodCAyMDE5IFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcblxuaW1wb3J0ICogYXMgc2RrIGZyb20gJy4uLy4uLy4uL2luZGV4JztcbmltcG9ydCB7TWF0cml4Q2xpZW50UGVnfSBmcm9tICcuLi8uLi8uLi9NYXRyaXhDbGllbnRQZWcnO1xuaW1wb3J0IHsgX3QgfSBmcm9tICcuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXInO1xuaW1wb3J0IE1vZGFsIGZyb20gJy4uLy4uLy4uL01vZGFsJztcbmltcG9ydCB7U1NPQXV0aEVudHJ5fSBmcm9tIFwiLi4vYXV0aC9JbnRlcmFjdGl2ZUF1dGhFbnRyeUNvbXBvbmVudHNcIjtcbmltcG9ydCB7cmVwbGFjZWFibGVDb21wb25lbnR9IGZyb20gXCIuLi8uLi8uLi91dGlscy9yZXBsYWNlYWJsZUNvbXBvbmVudFwiO1xuXG5AcmVwbGFjZWFibGVDb21wb25lbnQoXCJ2aWV3cy5zZXR0aW5ncy5EZXZpY2VzUGFuZWxcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERldmljZXNQYW5lbCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBkZXZpY2VzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkZXZpY2VMb2FkRXJyb3I6IHVuZGVmaW5lZCxcblxuICAgICAgICAgICAgc2VsZWN0ZWREZXZpY2VzOiBbXSxcbiAgICAgICAgICAgIGRlbGV0aW5nOiBmYWxzZSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl91bm1vdW50ZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl9yZW5kZXJEZXZpY2UgPSB0aGlzLl9yZW5kZXJEZXZpY2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5fb25EZXZpY2VTZWxlY3Rpb25Ub2dnbGVkID0gdGhpcy5fb25EZXZpY2VTZWxlY3Rpb25Ub2dnbGVkLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuX29uRGVsZXRlQ2xpY2sgPSB0aGlzLl9vbkRlbGV0ZUNsaWNrLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIHRoaXMuX2xvYWREZXZpY2VzKCk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIHRoaXMuX3VubW91bnRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgX2xvYWREZXZpY2VzKCkge1xuICAgICAgICBNYXRyaXhDbGllbnRQZWcuZ2V0KCkuZ2V0RGV2aWNlcygpLnRoZW4oXG4gICAgICAgICAgICAocmVzcCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl91bm1vdW50ZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7ZGV2aWNlczogcmVzcC5kZXZpY2VzIHx8IFtdfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3VubW91bnRlZCkgeyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICBsZXQgZXJydHh0O1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5odHRwU3RhdHVzID09IDQwNCkge1xuICAgICAgICAgICAgICAgICAgICAvLyA0MDQgcHJvYmFibHkgbWVhbnMgdGhlIEhTIGRvZXNuJ3QgeWV0IHN1cHBvcnQgdGhlIEFQSS5cbiAgICAgICAgICAgICAgICAgICAgZXJydHh0ID0gX3QoXCJZb3VyIGhvbWVzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZXNzaW9uIG1hbmFnZW1lbnQuXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBsb2FkaW5nIHNlc3Npb25zOlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIGVycnR4dCA9IF90KFwiVW5hYmxlIHRvIGxvYWQgc2Vzc2lvbiBsaXN0XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtkZXZpY2VMb2FkRXJyb3I6IGVycnR4dH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cblxuICAgIC8qXG4gICAgICogY29tcGFyZSB0d28gZGV2aWNlcywgc29ydGluZyBmcm9tIG1vc3QtcmVjZW50bHktc2VlbiB0byBsZWFzdC1yZWNlbnRseS1zZWVuXG4gICAgICogKGFuZCB0aGVuLCBmb3Igc3RhYmlsaXR5LCBieSBkZXZpY2UgaWQpXG4gICAgICovXG4gICAgX2RldmljZUNvbXBhcmUoYSwgYikge1xuICAgICAgICAvLyByZXR1cm4gPCAwIGlmIGEgY29tZXMgYmVmb3JlIGIsID4gMCBpZiBhIGNvbWVzIGFmdGVyIGIuXG4gICAgICAgIGNvbnN0IGxhc3RTZWVuRGVsdGEgPVxuICAgICAgICAgICAgICAoYi5sYXN0X3NlZW5fdHMgfHwgMCkgLSAoYS5sYXN0X3NlZW5fdHMgfHwgMCk7XG5cbiAgICAgICAgaWYgKGxhc3RTZWVuRGVsdGEgIT09IDApIHsgcmV0dXJuIGxhc3RTZWVuRGVsdGE7IH1cblxuICAgICAgICBjb25zdCBpZEEgPSBhLmRldmljZV9pZDtcbiAgICAgICAgY29uc3QgaWRCID0gYi5kZXZpY2VfaWQ7XG4gICAgICAgIHJldHVybiAoaWRBIDwgaWRCKSA/IC0xIDogKGlkQSA+IGlkQikgPyAxIDogMDtcbiAgICB9XG5cbiAgICBfb25EZXZpY2VTZWxlY3Rpb25Ub2dnbGVkKGRldmljZSkge1xuICAgICAgICBpZiAodGhpcy5fdW5tb3VudGVkKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGNvbnN0IGRldmljZUlkID0gZGV2aWNlLmRldmljZV9pZDtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSgoc3RhdGUsIHByb3BzKSA9PiB7XG4gICAgICAgICAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgc2VsZWN0ZWQgZGV2aWNlcywgdGhlbiBhZGQgb3IgcmVtb3ZlIHRoZSBkZXZpY2VcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRGV2aWNlcyA9IHN0YXRlLnNlbGVjdGVkRGV2aWNlcy5zbGljZSgpO1xuXG4gICAgICAgICAgICBjb25zdCBpID0gc2VsZWN0ZWREZXZpY2VzLmluZGV4T2YoZGV2aWNlSWQpO1xuICAgICAgICAgICAgaWYgKGkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWREZXZpY2VzLnB1c2goZGV2aWNlSWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZERldmljZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge3NlbGVjdGVkRGV2aWNlc307XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9vbkRlbGV0ZUNsaWNrKCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGRlbGV0aW5nOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9tYWtlRGVsZXRlUmVxdWVzdChudWxsKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl91bm1vdW50ZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICBpZiAoZXJyb3IuaHR0cFN0YXR1cyAhPT0gNDAxIHx8ICFlcnJvci5kYXRhIHx8ICFlcnJvci5kYXRhLmZsb3dzKSB7XG4gICAgICAgICAgICAgICAgLy8gZG9lc24ndCBsb29rIGxpa2UgYW4gaW50ZXJhY3RpdmUtYXV0aCBmYWlsdXJlXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHBvcCB1cCBhbiBpbnRlcmFjdGl2ZSBhdXRoIGRpYWxvZ1xuICAgICAgICAgICAgY29uc3QgSW50ZXJhY3RpdmVBdXRoRGlhbG9nID0gc2RrLmdldENvbXBvbmVudChcImRpYWxvZ3MuSW50ZXJhY3RpdmVBdXRoRGlhbG9nXCIpO1xuXG4gICAgICAgICAgICBjb25zdCBudW1EZXZpY2VzID0gdGhpcy5zdGF0ZS5zZWxlY3RlZERldmljZXMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgZGlhbG9nQWVzdGhldGljcyA9IHtcbiAgICAgICAgICAgICAgICBbU1NPQXV0aEVudHJ5LlBIQVNFX1BSRUFVVEhdOiB7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBfdChcIlVzZSBTaW5nbGUgU2lnbiBPbiB0byBjb250aW51ZVwiKSxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogX3QoXCJDb25maXJtIGRlbGV0aW5nIHRoZXNlIHNlc3Npb25zIGJ5IHVzaW5nIFNpbmdsZSBTaWduIE9uIHRvIHByb3ZlIHlvdXIgaWRlbnRpdHkuXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiBudW1EZXZpY2VzLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVUZXh0OiBfdChcIlNpbmdsZSBTaWduIE9uXCIpLFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZUtpbmQ6IFwicHJpbWFyeVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW1NTT0F1dGhFbnRyeS5QSEFTRV9QT1NUQVVUSF06IHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IF90KFwiQ29uZmlybSBkZWxldGluZyB0aGVzZSBzZXNzaW9uc1wiKSxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogX3QoXCJDbGljayB0aGUgYnV0dG9uIGJlbG93IHRvIGNvbmZpcm0gZGVsZXRpbmcgdGhlc2Ugc2Vzc2lvbnMuXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiBudW1EZXZpY2VzLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVUZXh0OiBfdChcIkRlbGV0ZSBzZXNzaW9uc1wiLCB7Y291bnQ6IG51bURldmljZXN9KSxcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVLaW5kOiBcImRhbmdlclwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgTW9kYWwuY3JlYXRlVHJhY2tlZERpYWxvZygnRGVsZXRlIERldmljZSBEaWFsb2cnLCAnJywgSW50ZXJhY3RpdmVBdXRoRGlhbG9nLCB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IF90KFwiQXV0aGVudGljYXRpb25cIiksXG4gICAgICAgICAgICAgICAgbWF0cml4Q2xpZW50OiBNYXRyaXhDbGllbnRQZWcuZ2V0KCksXG4gICAgICAgICAgICAgICAgYXV0aERhdGE6IGVycm9yLmRhdGEsXG4gICAgICAgICAgICAgICAgbWFrZVJlcXVlc3Q6IHRoaXMuX21ha2VEZWxldGVSZXF1ZXN0LmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgYWVzdGhldGljc0ZvclN0YWdlUGhhc2VzOiB7XG4gICAgICAgICAgICAgICAgICAgIFtTU09BdXRoRW50cnkuTE9HSU5fVFlQRV06IGRpYWxvZ0Flc3RoZXRpY3MsXG4gICAgICAgICAgICAgICAgICAgIFtTU09BdXRoRW50cnkuVU5TVEFCTEVfTE9HSU5fVFlQRV06IGRpYWxvZ0Flc3RoZXRpY3MsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGRlbGV0aW5nIHNlc3Npb25zXCIsIGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3VubW91bnRlZCkgeyByZXR1cm47IH1cbiAgICAgICAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBkZWxldGluZzogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX21ha2VEZWxldGVSZXF1ZXN0KGF1dGgpIHtcbiAgICAgICAgcmV0dXJuIE1hdHJpeENsaWVudFBlZy5nZXQoKS5kZWxldGVNdWx0aXBsZURldmljZXModGhpcy5zdGF0ZS5zZWxlY3RlZERldmljZXMsIGF1dGgpLnRoZW4oXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBkZWxldGVkIGRldmljZXMgZnJvbSBgZGV2aWNlc2AsIHJlc2V0IHNlbGVjdGlvbiB0byBbXVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICBkZXZpY2VzOiB0aGlzLnN0YXRlLmRldmljZXMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGQpID0+ICF0aGlzLnN0YXRlLnNlbGVjdGVkRGV2aWNlcy5pbmNsdWRlcyhkLmRldmljZV9pZCksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGV2aWNlczogW10sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIF9yZW5kZXJEZXZpY2UoZGV2aWNlKSB7XG4gICAgICAgIGNvbnN0IERldmljZXNQYW5lbEVudHJ5ID0gc2RrLmdldENvbXBvbmVudCgnc2V0dGluZ3MuRGV2aWNlc1BhbmVsRW50cnknKTtcbiAgICAgICAgcmV0dXJuIDxEZXZpY2VzUGFuZWxFbnRyeVxuICAgICAgICAgICAga2V5PXtkZXZpY2UuZGV2aWNlX2lkfVxuICAgICAgICAgICAgZGV2aWNlPXtkZXZpY2V9XG4gICAgICAgICAgICBzZWxlY3RlZD17dGhpcy5zdGF0ZS5zZWxlY3RlZERldmljZXMuaW5jbHVkZXMoZGV2aWNlLmRldmljZV9pZCl9XG4gICAgICAgICAgICBvbkRldmljZVRvZ2dsZWQ9e3RoaXMuX29uRGV2aWNlU2VsZWN0aW9uVG9nZ2xlZH1cbiAgICAgICAgLz47XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBTcGlubmVyID0gc2RrLmdldENvbXBvbmVudChcImVsZW1lbnRzLlNwaW5uZXJcIik7XG4gICAgICAgIGNvbnN0IEFjY2Vzc2libGVCdXR0b24gPSBzZGsuZ2V0Q29tcG9uZW50KFwiZWxlbWVudHMuQWNjZXNzaWJsZUJ1dHRvblwiKTtcblxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5kZXZpY2VMb2FkRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY2xhc3NlcyA9IGNsYXNzTmFtZXModGhpcy5wcm9wcy5jbGFzc05hbWUsIFwiZXJyb3JcIik7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc2VzfT5cbiAgICAgICAgICAgICAgICAgICAgeyB0aGlzLnN0YXRlLmRldmljZUxvYWRFcnJvciB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGV2aWNlcyA9IHRoaXMuc3RhdGUuZGV2aWNlcztcbiAgICAgICAgaWYgKGRldmljZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gc3RpbGwgbG9hZGluZ1xuICAgICAgICAgICAgY29uc3QgY2xhc3NlcyA9IHRoaXMucHJvcHMuY2xhc3NOYW1lO1xuICAgICAgICAgICAgcmV0dXJuIDxTcGlubmVyIGNsYXNzTmFtZT17Y2xhc3Nlc30gLz47XG4gICAgICAgIH1cblxuICAgICAgICBkZXZpY2VzLnNvcnQodGhpcy5fZGV2aWNlQ29tcGFyZSk7XG5cbiAgICAgICAgY29uc3QgZGVsZXRlQnV0dG9uID0gdGhpcy5zdGF0ZS5kZWxldGluZyA/XG4gICAgICAgICAgICA8U3Bpbm5lciB3PXsyMn0gaD17MjJ9IC8+IDpcbiAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uIG9uQ2xpY2s9e3RoaXMuX29uRGVsZXRlQ2xpY2t9IGtpbmQ9XCJkYW5nZXJfc21cIj5cbiAgICAgICAgICAgICAgICB7IF90KFwiRGVsZXRlICUoY291bnQpcyBzZXNzaW9uc1wiLCB7Y291bnQ6IHRoaXMuc3RhdGUuc2VsZWN0ZWREZXZpY2VzLmxlbmd0aH0pfVxuICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPjtcblxuICAgICAgICBjb25zdCBjbGFzc2VzID0gY2xhc3NOYW1lcyh0aGlzLnByb3BzLmNsYXNzTmFtZSwgXCJteF9EZXZpY2VzUGFuZWxcIik7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3Nlc30+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9EZXZpY2VzUGFuZWxfaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRGV2aWNlc1BhbmVsX2RldmljZUlkXCI+eyBfdChcIklEXCIpIH08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9EZXZpY2VzUGFuZWxfZGV2aWNlTmFtZVwiPnsgX3QoXCJQdWJsaWMgTmFtZVwiKSB9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRGV2aWNlc1BhbmVsX2RldmljZUxhc3RTZWVuXCI+eyBfdChcIkxhc3Qgc2VlblwiKSB9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRGV2aWNlc1BhbmVsX2RldmljZUJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHsgdGhpcy5zdGF0ZS5zZWxlY3RlZERldmljZXMubGVuZ3RoID4gMCA/IGRlbGV0ZUJ1dHRvbiA6IG51bGwgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB7IGRldmljZXMubWFwKHRoaXMuX3JlbmRlckRldmljZSkgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5EZXZpY2VzUGFuZWwucHJvcFR5cGVzID0ge1xuICAgIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbn07XG4iXX0=