UNPKG

matrix-react-sdk

Version:
179 lines (140 loc) 20.5 kB
"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 = _interopRequireDefault(require("react")); var _CallView = _interopRequireDefault(require("./CallView")); var _RoomViewStore = _interopRequireDefault(require("../../../stores/RoomViewStore")); var _CallHandler = _interopRequireWildcard(require("../../../CallHandler")); var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher")); var _PersistentApp = _interopRequireDefault(require("../elements/PersistentApp")); var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore")); var _call = require("matrix-js-sdk/src/webrtc/call"); var _MatrixClientPeg = require("../../../MatrixClientPeg"); var _replaceableComponent = require("../../../utils/replaceableComponent"); var _dec, _class, _temp; const SHOW_CALL_IN_STATES = [_call.CallState.Connected, _call.CallState.InviteSent, _call.CallState.Connecting, _call.CallState.CreateAnswer, _call.CallState.CreateOffer, _call.CallState.WaitLocalMedia]; // Splits a list of calls into one 'primary' one and a list // (which should be a single element) of other calls. // The primary will be the one not on hold, or an arbitrary one // if they're all on hold) function getPrimarySecondaryCalls(calls /*: MatrixCall[]*/ ) /*: [MatrixCall, MatrixCall[]]*/ { let primary /*: MatrixCall*/ = null; let secondaries /*: MatrixCall[]*/ = []; for (const call of calls) { if (!SHOW_CALL_IN_STATES.includes(call.state)) continue; if (!call.isRemoteOnHold() && primary === null) { primary = call; } else { secondaries.push(call); } } if (primary === null && secondaries.length > 0) { primary = secondaries[0]; secondaries = secondaries.slice(1); } if (secondaries.length > 1) { // We should never be in more than two calls so this shouldn't happen console.log("Found more than 1 secondary call! Other calls will not be shown."); } return [primary, secondaries]; } /** * CallPreview shows a small version of CallView hovering over the UI in 'picture-in-picture' * (PiP mode). It displays the call(s) which is *not* in the room the user is currently viewing. */ let CallPreview = (_dec = (0, _replaceableComponent.replaceableComponent)("views.voip.CallPreview"), _dec(_class = (_temp = class CallPreview extends _react.default.Component /*:: <IProps, IState>*/ { constructor(props /*: IProps*/ ) { super(props); (0, _defineProperty2.default)(this, "roomStoreToken", void 0); (0, _defineProperty2.default)(this, "dispatcherRef", void 0); (0, _defineProperty2.default)(this, "settingsWatcherRef", void 0); (0, _defineProperty2.default)(this, "onRoomViewStoreUpdate", payload => { if (_RoomViewStore.default.getRoomId() === this.state.roomId) return; const roomId = _RoomViewStore.default.getRoomId(); const [primaryCall, secondaryCalls] = getPrimarySecondaryCalls(_CallHandler.default.sharedInstance().getAllActiveCallsNotInRoom(roomId)); this.setState({ roomId, primaryCall: primaryCall, secondaryCall: secondaryCalls[0] }); }); (0, _defineProperty2.default)(this, "onAction", (payload /*: ActionPayload*/ ) => { switch (payload.action) { // listen for call state changes to prod the render method, which // may hide the global CallView if the call it is tracking is dead case 'call_state': { this.updateCalls(); break; } } }); (0, _defineProperty2.default)(this, "updateCalls", () => { const [primaryCall, secondaryCalls] = getPrimarySecondaryCalls(_CallHandler.default.sharedInstance().getAllActiveCallsNotInRoom(this.state.roomId)); this.setState({ primaryCall: primaryCall, secondaryCall: secondaryCalls[0] }); }); (0, _defineProperty2.default)(this, "onCallRemoteHold", () => { const [primaryCall, secondaryCalls] = getPrimarySecondaryCalls(_CallHandler.default.sharedInstance().getAllActiveCallsNotInRoom(this.state.roomId)); this.setState({ primaryCall: primaryCall, secondaryCall: secondaryCalls[0] }); }); const _roomId = _RoomViewStore.default.getRoomId(); const [_primaryCall, _secondaryCalls] = getPrimarySecondaryCalls(_CallHandler.default.sharedInstance().getAllActiveCallsNotInRoom(_roomId)); this.state = { roomId: _roomId, primaryCall: _primaryCall, secondaryCall: _secondaryCalls[0] }; } componentDidMount() { _CallHandler.default.sharedInstance().addListener(_CallHandler.CallHandlerEvent.CallChangeRoom, this.updateCalls); this.roomStoreToken = _RoomViewStore.default.addListener(this.onRoomViewStoreUpdate); this.dispatcherRef = _dispatcher.default.register(this.onAction); _MatrixClientPeg.MatrixClientPeg.get().on(_call.CallEvent.RemoteHoldUnhold, this.onCallRemoteHold); } componentWillUnmount() { _CallHandler.default.sharedInstance().removeListener(_CallHandler.CallHandlerEvent.CallChangeRoom, this.updateCalls); _MatrixClientPeg.MatrixClientPeg.get().removeListener(_call.CallEvent.RemoteHoldUnhold, this.onCallRemoteHold); if (this.roomStoreToken) { this.roomStoreToken.remove(); } _dispatcher.default.unregister(this.dispatcherRef); _SettingsStore.default.unwatchSetting(this.settingsWatcherRef); } render() { if (this.state.primaryCall) { return /*#__PURE__*/_react.default.createElement(_CallView.default, { call: this.state.primaryCall, secondaryCall: this.state.secondaryCall, pipMode: true }); } return /*#__PURE__*/_react.default.createElement(_PersistentApp.default, null); } }, _temp)) || _class); exports.default = CallPreview; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3ZvaXAvQ2FsbFByZXZpZXcudHN4Il0sIm5hbWVzIjpbIlNIT1dfQ0FMTF9JTl9TVEFURVMiLCJDYWxsU3RhdGUiLCJDb25uZWN0ZWQiLCJJbnZpdGVTZW50IiwiQ29ubmVjdGluZyIsIkNyZWF0ZUFuc3dlciIsIkNyZWF0ZU9mZmVyIiwiV2FpdExvY2FsTWVkaWEiLCJnZXRQcmltYXJ5U2Vjb25kYXJ5Q2FsbHMiLCJjYWxscyIsInByaW1hcnkiLCJzZWNvbmRhcmllcyIsImNhbGwiLCJpbmNsdWRlcyIsInN0YXRlIiwiaXNSZW1vdGVPbkhvbGQiLCJwdXNoIiwibGVuZ3RoIiwic2xpY2UiLCJjb25zb2xlIiwibG9nIiwiQ2FsbFByZXZpZXciLCJSZWFjdCIsIkNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJwYXlsb2FkIiwiUm9vbVZpZXdTdG9yZSIsImdldFJvb21JZCIsInJvb21JZCIsInByaW1hcnlDYWxsIiwic2Vjb25kYXJ5Q2FsbHMiLCJDYWxsSGFuZGxlciIsInNoYXJlZEluc3RhbmNlIiwiZ2V0QWxsQWN0aXZlQ2FsbHNOb3RJblJvb20iLCJzZXRTdGF0ZSIsInNlY29uZGFyeUNhbGwiLCJhY3Rpb24iLCJ1cGRhdGVDYWxscyIsImNvbXBvbmVudERpZE1vdW50IiwiYWRkTGlzdGVuZXIiLCJDYWxsSGFuZGxlckV2ZW50IiwiQ2FsbENoYW5nZVJvb20iLCJyb29tU3RvcmVUb2tlbiIsIm9uUm9vbVZpZXdTdG9yZVVwZGF0ZSIsImRpc3BhdGNoZXJSZWYiLCJkaXMiLCJyZWdpc3RlciIsIm9uQWN0aW9uIiwiTWF0cml4Q2xpZW50UGVnIiwiZ2V0Iiwib24iLCJDYWxsRXZlbnQiLCJSZW1vdGVIb2xkVW5ob2xkIiwib25DYWxsUmVtb3RlSG9sZCIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwicmVtb3ZlTGlzdGVuZXIiLCJyZW1vdmUiLCJ1bnJlZ2lzdGVyIiwiU2V0dGluZ3NT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QXRCLENBQXlCQyxnQkFBVUMsZ0JBQW5DLEVBQXFELEtBQUtDLGdCQUExRDtBQUNIOztBQUVNQyxFQUFBQSxvQkFBUCxHQUE4QjtBQUMxQnZCLHlCQUFZQyxjQUFaLEdBQTZCdUIsY0FBN0IsQ0FBNENmLDhCQUFpQkMsY0FBN0QsRUFBNkUsS0FBS0osV0FBbEY7O0FBQ0FXLHFDQUFnQkMsR0FBaEIsR0FBc0JNLGNBQXRCLENBQXFDSixnQkFBVUMsZ0JBQS9DLEVBQWlFLEtBQUtDLGdCQUF0RTs7QUFDQSxRQUFJLEtBQUtYLGNBQVQsRUFBeUI7QUFDckIsV0FBS0EsY0FBTCxDQUFvQmMsTUFBcEI7QUFDSDs7QUFDRFgsd0JBQUlZLFVBQUosQ0FBZSxLQUFLYixhQUFwQjs7QUFDQWMsMkJBQWNDLGNBQWQsQ0FBNkIsS0FBS0Msa0JBQWxDO0FBQ0g7O0FBa0RNQyxFQUFBQSxNQUFQLEdBQWdCO0FBQ1osUUFBSSxLQUFLaEQsS0FBTCxDQUFXZ0IsV0FBZixFQUE0QjtBQUN4QiwwQkFDSSw2QkFBQyxpQkFBRDtBQUFVLFFBQUEsSUFBSSxFQUFFLEtBQUtoQixLQUFMLENBQVdnQixXQUEzQjtBQUF3QyxRQUFBLGFBQWEsRUFBRSxLQUFLaEIsS0FBTCxDQUFXc0IsYUFBbEU7QUFBaUYsUUFBQSxPQUFPLEVBQUU7QUFBMUYsUUFESjtBQUdIOztBQUVELHdCQUFPLDZCQUFDLHNCQUFELE9BQVA7QUFDSDs7QUE5Rm9FLEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMTcsIDIwMTggTmV3IFZlY3RvciBMdGRcbkNvcHlyaWdodCAyMDE5LCAyMDIwIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IENhbGxWaWV3IGZyb20gXCIuL0NhbGxWaWV3XCI7XG5pbXBvcnQgUm9vbVZpZXdTdG9yZSBmcm9tICcuLi8uLi8uLi9zdG9yZXMvUm9vbVZpZXdTdG9yZSc7XG5pbXBvcnQgQ2FsbEhhbmRsZXIsIHsgQ2FsbEhhbmRsZXJFdmVudCB9IGZyb20gJy4uLy4uLy4uL0NhbGxIYW5kbGVyJztcbmltcG9ydCBkaXMgZnJvbSAnLi4vLi4vLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyJztcbmltcG9ydCB7IEFjdGlvblBheWxvYWQgfSBmcm9tICcuLi8uLi8uLi9kaXNwYXRjaGVyL3BheWxvYWRzJztcbmltcG9ydCBQZXJzaXN0ZW50QXBwIGZyb20gXCIuLi9lbGVtZW50cy9QZXJzaXN0ZW50QXBwXCI7XG5pbXBvcnQgU2V0dGluZ3NTdG9yZSBmcm9tIFwiLi4vLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3NTdG9yZVwiO1xuaW1wb3J0IHsgQ2FsbEV2ZW50LCBDYWxsU3RhdGUsIE1hdHJpeENhbGwgfSBmcm9tICdtYXRyaXgtanMtc2RrL3NyYy93ZWJydGMvY2FsbCc7XG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tICcuLi8uLi8uLi9NYXRyaXhDbGllbnRQZWcnO1xuaW1wb3J0IHtyZXBsYWNlYWJsZUNvbXBvbmVudH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3JlcGxhY2VhYmxlQ29tcG9uZW50XCI7XG5cbmNvbnN0IFNIT1dfQ0FMTF9JTl9TVEFURVMgPSBbXG4gICAgQ2FsbFN0YXRlLkNvbm5lY3RlZCxcbiAgICBDYWxsU3RhdGUuSW52aXRlU2VudCxcbiAgICBDYWxsU3RhdGUuQ29ubmVjdGluZyxcbiAgICBDYWxsU3RhdGUuQ3JlYXRlQW5zd2VyLFxuICAgIENhbGxTdGF0ZS5DcmVhdGVPZmZlcixcbiAgICBDYWxsU3RhdGUuV2FpdExvY2FsTWVkaWEsXG5dO1xuXG5pbnRlcmZhY2UgSVByb3BzIHtcbn1cblxuaW50ZXJmYWNlIElTdGF0ZSB7XG4gICAgcm9vbUlkOiBzdHJpbmc7XG5cbiAgICAvLyBUaGUgbWFpbiBjYWxsIHRoYXQgd2UgYXJlIGRpc3BsYXlpbmcgKGllLiBub3QgaW5jbHVkaW5nIHRoZSBjYWxsIGluIHRoZSByb29tIGJlaW5nIHZpZXdlZCwgaWYgYW55KVxuICAgIHByaW1hcnlDYWxsOiBNYXRyaXhDYWxsO1xuXG4gICAgLy8gQW55IG90aGVyIGNhbGwgd2UncmUgZGlzcGxheWluZzogb25seSBpZiB0aGUgdXNlciBpcyBvbiB0d28gY2FsbHMgYW5kIG5vdCB2aWV3aW5nIGVpdGhlciBvZiB0aGUgcm9vbXNcbiAgICAvLyB0aGV5IGJlbG9uZyB0b1xuICAgIHNlY29uZGFyeUNhbGw6IE1hdHJpeENhbGw7XG59XG5cbi8vIFNwbGl0cyBhIGxpc3Qgb2YgY2FsbHMgaW50byBvbmUgJ3ByaW1hcnknIG9uZSBhbmQgYSBsaXN0XG4vLyAod2hpY2ggc2hvdWxkIGJlIGEgc2luZ2xlIGVsZW1lbnQpIG9mIG90aGVyIGNhbGxzLlxuLy8gVGhlIHByaW1hcnkgd2lsbCBiZSB0aGUgb25lIG5vdCBvbiBob2xkLCBvciBhbiBhcmJpdHJhcnkgb25lXG4vLyBpZiB0aGV5J3JlIGFsbCBvbiBob2xkKVxuZnVuY3Rpb24gZ2V0UHJpbWFyeVNlY29uZGFyeUNhbGxzKGNhbGxzOiBNYXRyaXhDYWxsW10pOiBbTWF0cml4Q2FsbCwgTWF0cml4Q2FsbFtdXSB7XG4gICAgbGV0IHByaW1hcnk6IE1hdHJpeENhbGwgPSBudWxsO1xuICAgIGxldCBzZWNvbmRhcmllczogTWF0cml4Q2FsbFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGNhbGwgb2YgY2FsbHMpIHtcbiAgICAgICAgaWYgKCFTSE9XX0NBTExfSU5fU1RBVEVTLmluY2x1ZGVzKGNhbGwuc3RhdGUpKSBjb250aW51ZTtcblxuICAgICAgICBpZiAoIWNhbGwuaXNSZW1vdGVPbkhvbGQoKSAmJiBwcmltYXJ5ID09PSBudWxsKSB7XG4gICAgICAgICAgICBwcmltYXJ5ID0gY2FsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlY29uZGFyaWVzLnB1c2goY2FsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocHJpbWFyeSA9PT0gbnVsbCAmJiBzZWNvbmRhcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHByaW1hcnkgPSBzZWNvbmRhcmllc1swXTtcbiAgICAgICAgc2Vjb25kYXJpZXMgPSBzZWNvbmRhcmllcy5zbGljZSgxKTtcbiAgICB9XG5cbiAgICBpZiAoc2Vjb25kYXJpZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyBXZSBzaG91bGQgbmV2ZXIgYmUgaW4gbW9yZSB0aGFuIHR3byBjYWxscyBzbyB0aGlzIHNob3VsZG4ndCBoYXBwZW5cbiAgICAgICAgY29uc29sZS5sb2coXCJGb3VuZCBtb3JlIHRoYW4gMSBzZWNvbmRhcnkgY2FsbCEgT3RoZXIgY2FsbHMgd2lsbCBub3QgYmUgc2hvd24uXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBbcHJpbWFyeSwgc2Vjb25kYXJpZXNdO1xufVxuXG4vKipcbiAqIENhbGxQcmV2aWV3IHNob3dzIGEgc21hbGwgdmVyc2lvbiBvZiBDYWxsVmlldyBob3ZlcmluZyBvdmVyIHRoZSBVSSBpbiAncGljdHVyZS1pbi1waWN0dXJlJ1xuICogKFBpUCBtb2RlKS4gSXQgZGlzcGxheXMgdGhlIGNhbGwocykgd2hpY2ggaXMgKm5vdCogaW4gdGhlIHJvb20gdGhlIHVzZXIgaXMgY3VycmVudGx5IHZpZXdpbmcuXG4gKi9cbkByZXBsYWNlYWJsZUNvbXBvbmVudChcInZpZXdzLnZvaXAuQ2FsbFByZXZpZXdcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhbGxQcmV2aWV3IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PElQcm9wcywgSVN0YXRlPiB7XG4gICAgcHJpdmF0ZSByb29tU3RvcmVUb2tlbjogYW55O1xuICAgIHByaXZhdGUgZGlzcGF0Y2hlclJlZjogc3RyaW5nO1xuICAgIHByaXZhdGUgc2V0dGluZ3NXYXRjaGVyUmVmOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogSVByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICBjb25zdCByb29tSWQgPSBSb29tVmlld1N0b3JlLmdldFJvb21JZCgpO1xuXG4gICAgICAgIGNvbnN0IFtwcmltYXJ5Q2FsbCwgc2Vjb25kYXJ5Q2FsbHNdID0gZ2V0UHJpbWFyeVNlY29uZGFyeUNhbGxzKFxuICAgICAgICAgICAgQ2FsbEhhbmRsZXIuc2hhcmVkSW5zdGFuY2UoKS5nZXRBbGxBY3RpdmVDYWxsc05vdEluUm9vbShyb29tSWQpLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICByb29tSWQsXG4gICAgICAgICAgICBwcmltYXJ5Q2FsbDogcHJpbWFyeUNhbGwsXG4gICAgICAgICAgICBzZWNvbmRhcnlDYWxsOiBzZWNvbmRhcnlDYWxsc1swXSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIENhbGxIYW5kbGVyLnNoYXJlZEluc3RhbmNlKCkuYWRkTGlzdGVuZXIoQ2FsbEhhbmRsZXJFdmVudC5DYWxsQ2hhbmdlUm9vbSwgdGhpcy51cGRhdGVDYWxscyk7XG4gICAgICAgIHRoaXMucm9vbVN0b3JlVG9rZW4gPSBSb29tVmlld1N0b3JlLmFkZExpc3RlbmVyKHRoaXMub25Sb29tVmlld1N0b3JlVXBkYXRlKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyUmVmID0gZGlzLnJlZ2lzdGVyKHRoaXMub25BY3Rpb24pO1xuICAgICAgICBNYXRyaXhDbGllbnRQZWcuZ2V0KCkub24oQ2FsbEV2ZW50LlJlbW90ZUhvbGRVbmhvbGQsIHRoaXMub25DYWxsUmVtb3RlSG9sZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICBDYWxsSGFuZGxlci5zaGFyZWRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKENhbGxIYW5kbGVyRXZlbnQuQ2FsbENoYW5nZVJvb20sIHRoaXMudXBkYXRlQ2FsbHMpO1xuICAgICAgICBNYXRyaXhDbGllbnRQZWcuZ2V0KCkucmVtb3ZlTGlzdGVuZXIoQ2FsbEV2ZW50LlJlbW90ZUhvbGRVbmhvbGQsIHRoaXMub25DYWxsUmVtb3RlSG9sZCk7XG4gICAgICAgIGlmICh0aGlzLnJvb21TdG9yZVRva2VuKSB7XG4gICAgICAgICAgICB0aGlzLnJvb21TdG9yZVRva2VuLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGRpcy51bnJlZ2lzdGVyKHRoaXMuZGlzcGF0Y2hlclJlZik7XG4gICAgICAgIFNldHRpbmdzU3RvcmUudW53YXRjaFNldHRpbmcodGhpcy5zZXR0aW5nc1dhdGNoZXJSZWYpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25Sb29tVmlld1N0b3JlVXBkYXRlID0gKHBheWxvYWQpID0+IHtcbiAgICAgICAgaWYgKFJvb21WaWV3U3RvcmUuZ2V0Um9vbUlkKCkgPT09IHRoaXMuc3RhdGUucm9vbUlkKSByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgcm9vbUlkID0gUm9vbVZpZXdTdG9yZS5nZXRSb29tSWQoKTtcbiAgICAgICAgY29uc3QgW3ByaW1hcnlDYWxsLCBzZWNvbmRhcnlDYWxsc10gPSBnZXRQcmltYXJ5U2Vjb25kYXJ5Q2FsbHMoXG4gICAgICAgICAgICBDYWxsSGFuZGxlci5zaGFyZWRJbnN0YW5jZSgpLmdldEFsbEFjdGl2ZUNhbGxzTm90SW5Sb29tKHJvb21JZCksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICByb29tSWQsXG4gICAgICAgICAgICBwcmltYXJ5Q2FsbDogcHJpbWFyeUNhbGwsXG4gICAgICAgICAgICBzZWNvbmRhcnlDYWxsOiBzZWNvbmRhcnlDYWxsc1swXSxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25BY3Rpb24gPSAocGF5bG9hZDogQWN0aW9uUGF5bG9hZCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHBheWxvYWQuYWN0aW9uKSB7XG4gICAgICAgICAgICAvLyBsaXN0ZW4gZm9yIGNhbGwgc3RhdGUgY2hhbmdlcyB0byBwcm9kIHRoZSByZW5kZXIgbWV0aG9kLCB3aGljaFxuICAgICAgICAgICAgLy8gbWF5IGhpZGUgdGhlIGdsb2JhbCBDYWxsVmlldyBpZiB0aGUgY2FsbCBpdCBpcyB0cmFja2luZyBpcyBkZWFkXG4gICAgICAgICAgICBjYXNlICdjYWxsX3N0YXRlJzoge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FsbHMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIHVwZGF0ZUNhbGxzID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBbcHJpbWFyeUNhbGwsIHNlY29uZGFyeUNhbGxzXSA9IGdldFByaW1hcnlTZWNvbmRhcnlDYWxscyhcbiAgICAgICAgICAgIENhbGxIYW5kbGVyLnNoYXJlZEluc3RhbmNlKCkuZ2V0QWxsQWN0aXZlQ2FsbHNOb3RJblJvb20odGhpcy5zdGF0ZS5yb29tSWQpLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgcHJpbWFyeUNhbGw6IHByaW1hcnlDYWxsLFxuICAgICAgICAgICAgc2Vjb25kYXJ5Q2FsbDogc2Vjb25kYXJ5Q2FsbHNbMF0sXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uQ2FsbFJlbW90ZUhvbGQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IFtwcmltYXJ5Q2FsbCwgc2Vjb25kYXJ5Q2FsbHNdID0gZ2V0UHJpbWFyeVNlY29uZGFyeUNhbGxzKFxuICAgICAgICAgICAgQ2FsbEhhbmRsZXIuc2hhcmVkSW5zdGFuY2UoKS5nZXRBbGxBY3RpdmVDYWxsc05vdEluUm9vbSh0aGlzLnN0YXRlLnJvb21JZCksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBwcmltYXJ5Q2FsbDogcHJpbWFyeUNhbGwsXG4gICAgICAgICAgICBzZWNvbmRhcnlDYWxsOiBzZWNvbmRhcnlDYWxsc1swXSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbmRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUucHJpbWFyeUNhbGwpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPENhbGxWaWV3IGNhbGw9e3RoaXMuc3RhdGUucHJpbWFyeUNhbGx9IHNlY29uZGFyeUNhbGw9e3RoaXMuc3RhdGUuc2Vjb25kYXJ5Q2FsbH0gcGlwTW9kZT17dHJ1ZX0gLz5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gPFBlcnNpc3RlbnRBcHAgLz47XG4gICAgfVxufVxuXG4iXX0=