UNPKG

matrix-react-sdk

Version:
205 lines (203 loc) 39.1 kB
"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 _matrix = require("matrix-js-sdk/src/matrix"); var _types = require("matrix-js-sdk/src/types"); var _BaseCard = _interopRequireDefault(require("./BaseCard")); var _MessageComposer = _interopRequireDefault(require("../rooms/MessageComposer")); var _Layout = require("../../../settings/enums/Layout"); var _TimelinePanel = _interopRequireDefault(require("../../structures/TimelinePanel")); var _EditorStateTransfer = _interopRequireDefault(require("../../../utils/EditorStateTransfer")); var _RoomContext = _interopRequireDefault(require("../../../contexts/RoomContext")); var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher")); var _languageHandler = require("../../../languageHandler"); var _actions = require("../../../dispatcher/actions"); var _ContentMessages = _interopRequireDefault(require("../../../ContentMessages")); var _UploadBar = _interopRequireDefault(require("../../structures/UploadBar")); var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore")); var _JumpToBottomButton = _interopRequireDefault(require("../rooms/JumpToBottomButton")); var _Measured = _interopRequireDefault(require("../elements/Measured")); var _AsyncStore = require("../../../stores/AsyncStore"); var _SDKContext = require("../../../contexts/SDKContext"); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /* Copyright 2024 New Vector Ltd. Copyright 2021, 2022 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 TimelineCard extends _react.default.Component { constructor(props, context) { super(props, context); (0, _defineProperty2.default)(this, "dispatcherRef", void 0); (0, _defineProperty2.default)(this, "layoutWatcherRef", void 0); (0, _defineProperty2.default)(this, "timelinePanel", /*#__PURE__*/_react.default.createRef()); (0, _defineProperty2.default)(this, "card", /*#__PURE__*/_react.default.createRef()); (0, _defineProperty2.default)(this, "readReceiptsSettingWatcher", void 0); (0, _defineProperty2.default)(this, "onRoomViewStoreUpdate", async _initial => { const newState = { initialEventId: _SDKContext.SdkContextClass.instance.roomViewStore.getInitialEventId(), isInitialEventHighlighted: _SDKContext.SdkContextClass.instance.roomViewStore.isInitialEventHighlighted(), replyToEvent: _SDKContext.SdkContextClass.instance.roomViewStore.getQuotingEvent() }; this.setState(newState); }); (0, _defineProperty2.default)(this, "onAction", payload => { switch (payload.action) { case _actions.Action.EditEvent: this.setState({ editState: payload.event ? new _EditorStateTransfer.default(payload.event) : undefined }, () => { if (payload.event) { this.timelinePanel.current?.scrollToEventIfNeeded(payload.event.getId()); } }); break; default: break; } }); (0, _defineProperty2.default)(this, "onScroll", () => { const timelinePanel = this.timelinePanel.current; if (!timelinePanel) return; if (timelinePanel.isAtEndOfLiveTimeline()) { this.setState({ atEndOfLiveTimeline: true }); } else { this.setState({ atEndOfLiveTimeline: false }); } if (this.state.initialEventId && this.state.isInitialEventHighlighted) { _dispatcher.default.dispatch({ action: _actions.Action.ViewRoom, room_id: this.props.room.roomId, event_id: this.state.initialEventId, highlighted: false, replyingToEvent: this.state.replyToEvent, metricsTrigger: undefined // room doesn't change }); } }); (0, _defineProperty2.default)(this, "onMeasurement", narrow => { this.setState({ narrow }); }); (0, _defineProperty2.default)(this, "jumpToLiveTimeline", () => { if (this.state.initialEventId && this.state.isInitialEventHighlighted) { // If we were viewing a highlighted event, firing view_room without // an event will take care of both clearing the URL fragment and // jumping to the bottom _dispatcher.default.dispatch({ action: _actions.Action.ViewRoom, room_id: this.props.room.roomId }); } else { // Otherwise we have to jump manually this.timelinePanel.current?.jumpToLiveTimeline(); _dispatcher.default.fire(_actions.Action.FocusSendMessageComposer); } }); this.state = { showReadReceipts: _SettingsStore.default.getValue("showReadReceipts", props.room.roomId), layout: _SettingsStore.default.getValue("layout"), atEndOfLiveTimeline: true, narrow: false }; } componentDidMount() { _SDKContext.SdkContextClass.instance.roomViewStore.addListener(_AsyncStore.UPDATE_EVENT, this.onRoomViewStoreUpdate); this.dispatcherRef = _dispatcher.default.register(this.onAction); this.readReceiptsSettingWatcher = _SettingsStore.default.watchSetting("showReadReceipts", null, (...[,,, value]) => this.setState({ showReadReceipts: value })); this.layoutWatcherRef = _SettingsStore.default.watchSetting("layout", null, (...[,,, value]) => this.setState({ layout: value })); } componentWillUnmount() { _SDKContext.SdkContextClass.instance.roomViewStore.removeListener(_AsyncStore.UPDATE_EVENT, this.onRoomViewStoreUpdate); if (this.readReceiptsSettingWatcher) { _SettingsStore.default.unwatchSetting(this.readReceiptsSettingWatcher); } if (this.layoutWatcherRef) { _SettingsStore.default.unwatchSetting(this.layoutWatcherRef); } if (this.dispatcherRef) _dispatcher.default.unregister(this.dispatcherRef); } render() { const highlightedEventId = this.state.isInitialEventHighlighted ? this.state.initialEventId : undefined; let jumpToBottom; if (!this.state.atEndOfLiveTimeline) { jumpToBottom = /*#__PURE__*/_react.default.createElement(_JumpToBottomButton.default, { highlight: this.props.room.getUnreadNotificationCount(_matrix.NotificationCountType.Highlight) > 0, onScrollToBottomClick: this.jumpToLiveTimeline }); } const isUploading = _ContentMessages.default.sharedInstance().getCurrentUploads(this.props.composerRelation).length > 0; const myMembership = this.props.room.getMyMembership(); const showComposer = myMembership === _types.KnownMembership.Join; return /*#__PURE__*/_react.default.createElement(_RoomContext.default.Provider, { value: _objectSpread(_objectSpread({}, this.context), {}, { timelineRenderingType: this.props.timelineRenderingType ?? this.context.timelineRenderingType, liveTimeline: this.props.timelineSet?.getLiveTimeline(), narrow: this.state.narrow }) }, /*#__PURE__*/_react.default.createElement(_BaseCard.default, { className: this.props.classNames, onClose: this.props.onClose, withoutScrollContainer: true, header: (0, _languageHandler._t)("right_panel|video_room_chat|title"), ref: this.card }, this.card.current && /*#__PURE__*/_react.default.createElement(_Measured.default, { sensor: this.card.current, onMeasurement: this.onMeasurement }), /*#__PURE__*/_react.default.createElement("div", { className: "mx_TimelineCard_timeline" }, jumpToBottom, /*#__PURE__*/_react.default.createElement(_TimelinePanel.default, { ref: this.timelinePanel, showReadReceipts: this.state.showReadReceipts, manageReadReceipts: true, manageReadMarkers: false // No RM support in the TimelineCard , sendReadReceiptOnLoad: true, timelineSet: this.props.timelineSet, showUrlPreview: this.context.showUrlPreview // The right panel timeline (and therefore threads) don't support IRC layout at this time , layout: this.state.layout === _Layout.Layout.Bubble ? _Layout.Layout.Bubble : _Layout.Layout.Group, hideThreadedMessages: false, hidden: false, showReactions: true, className: "mx_RoomView_messagePanel", permalinkCreator: this.props.permalinkCreator, membersLoaded: true, editState: this.state.editState, eventId: this.state.initialEventId, resizeNotifier: this.props.resizeNotifier, highlightedEventId: highlightedEventId, onScroll: this.onScroll })), isUploading && /*#__PURE__*/_react.default.createElement(_UploadBar.default, { room: this.props.room, relation: this.props.composerRelation }), showComposer && /*#__PURE__*/_react.default.createElement(_MessageComposer.default, { room: this.props.room, relation: this.props.composerRelation, resizeNotifier: this.props.resizeNotifier, replyToEvent: this.state.replyToEvent, permalinkCreator: this.props.permalinkCreator, e2eStatus: this.props.e2eStatus, compact: true }))); } } exports.default = TimelineCard; (0, _defineProperty2.default)(TimelineCard, "contextType", _RoomContext.default); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tYXRyaXgiLCJfdHlwZXMiLCJfQmFzZUNhcmQiLCJfTWVzc2FnZUNvbXBvc2VyIiwiX0xheW91dCIsIl9UaW1lbGluZVBhbmVsIiwiX0VkaXRvclN0YXRlVHJhbnNmZXIiLCJfUm9vbUNvbnRleHQiLCJfZGlzcGF0Y2hlciIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfYWN0aW9ucyIsIl9Db250ZW50TWVzc2FnZXMiLCJfVXBsb2FkQmFyIiwiX1NldHRpbmdzU3RvcmUiLCJfSnVtcFRvQm90dG9tQnV0dG9uIiwiX01lYXN1cmVkIiwiX0FzeW5jU3RvcmUiLCJfU0RLQ29udGV4dCIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIlRpbWVsaW5lQ2FyZCIsIlJlYWN0IiwiQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsImNvbnRleHQiLCJjcmVhdGVSZWYiLCJfaW5pdGlhbCIsIm5ld1N0YXRlIiwiaW5pdGlhbEV2ZW50SWQiLCJTZGtDb250ZXh0Q2xhc3MiLCJpbnN0YW5jZSIsInJvb21WaWV3U3RvcmUiLCJnZXRJbml0aWFsRXZlbnRJZCIsImlzSW5pdGlhbEV2ZW50SGlnaGxpZ2h0ZWQiLCJyZXBseVRvRXZlbnQiLCJnZXRRdW90aW5nRXZlbnQiLCJzZXRTdGF0ZSIsInBheWxvYWQiLCJhY3Rpb24iLCJBY3Rpb24iLCJFZGl0RXZlbnQiLCJlZGl0U3RhdGUiLCJldmVudCIsIkVkaXRvclN0YXRlVHJhbnNmZXIiLCJ1bmRlZmluZWQiLCJ0aW1lbGluZVBhbmVsIiwiY3VycmVudCIsInNjcm9sbFRvRXZlbnRJZk5lZWRlZCIsImdldElkIiwiaXNBdEVuZE9mTGl2ZVRpbWVsaW5lIiwiYXRFbmRPZkxpdmVUaW1lbGluZSIsInN0YXRlIiwiZGlzIiwiZGlzcGF0Y2giLCJWaWV3Um9vbSIsInJvb21faWQiLCJyb29tIiwicm9vbUlkIiwiZXZlbnRfaWQiLCJoaWdobGlnaHRlZCIsInJlcGx5aW5nVG9FdmVudCIsIm1ldHJpY3NUcmlnZ2VyIiwibmFycm93IiwianVtcFRvTGl2ZVRpbWVsaW5lIiwiZmlyZSIsIkZvY3VzU2VuZE1lc3NhZ2VDb21wb3NlciIsInNob3dSZWFkUmVjZWlwdHMiLCJTZXR0aW5nc1N0b3JlIiwiZ2V0VmFsdWUiLCJsYXlvdXQiLCJjb21wb25lbnREaWRNb3VudCIsImFkZExpc3RlbmVyIiwiVVBEQVRFX0VWRU5UIiwib25Sb29tVmlld1N0b3JlVXBkYXRlIiwiZGlzcGF0Y2hlclJlZiIsInJlZ2lzdGVyIiwib25BY3Rpb24iLCJyZWFkUmVjZWlwdHNTZXR0aW5nV2F0Y2hlciIsIndhdGNoU2V0dGluZyIsInZhbHVlIiwibGF5b3V0V2F0Y2hlclJlZiIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwicmVtb3ZlTGlzdGVuZXIiLCJ1bndhdGNoU2V0dGluZyIsInVucmVnaXN0ZXIiLCJyZW5kZXIiLCJoaWdobGlnaHRlZEV2ZW50SWQiLCJqdW1wVG9Cb3R0b20iLCJjcmVhdGVFbGVtZW50IiwiaGlnaGxpZ2h0IiwiZ2V0VW5yZWFkTm90aWZpY2F0aW9uQ291bnQiLCJOb3RpZmljYXRpb25Db3VudFR5cGUiLCJIaWdobGlnaHQiLCJvblNjcm9sbFRvQm90dG9tQ2xpY2siLCJpc1VwbG9hZGluZyIsIkNvbnRlbnRNZXNzYWdlcyIsInNoYXJlZEluc3RhbmNlIiwiZ2V0Q3VycmVudFVwbG9hZHMiLCJjb21wb3NlclJlbGF0aW9uIiwibXlNZW1iZXJzaGlwIiwiZ2V0TXlNZW1iZXJzaGlwIiwic2hvd0NvbXBvc2VyIiwiS25vd25NZW1iZXJzaGlwIiwiSm9pbiIsIlByb3ZpZGVyIiwidGltZWxpbmVSZW5kZXJpbmdUeXBlIiwibGl2ZVRpbWVsaW5lIiwidGltZWxpbmVTZXQiLCJnZXRMaXZlVGltZWxpbmUiLCJjbGFzc05hbWUiLCJjbGFzc05hbWVzIiwib25DbG9zZSIsIndpdGhvdXRTY3JvbGxDb250YWluZXIiLCJoZWFkZXIiLCJfdCIsInJlZiIsImNhcmQiLCJzZW5zb3IiLCJvbk1lYXN1cmVtZW50IiwibWFuYWdlUmVhZFJlY2VpcHRzIiwibWFuYWdlUmVhZE1hcmtlcnMiLCJzZW5kUmVhZFJlY2VpcHRPbkxvYWQiLCJzaG93VXJsUHJldmlldyIsIkxheW91dCIsIkJ1YmJsZSIsIkdyb3VwIiwiaGlkZVRocmVhZGVkTWVzc2FnZXMiLCJoaWRkZW4iLCJzaG93UmVhY3Rpb25zIiwicGVybWFsaW5rQ3JlYXRvciIsIm1lbWJlcnNMb2FkZWQiLCJldmVudElkIiwicmVzaXplTm90aWZpZXIiLCJvblNjcm9sbCIsInJlbGF0aW9uIiwiZTJlU3RhdHVzIiwiY29tcGFjdCIsImV4cG9ydHMiLCJSb29tQ29udGV4dCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3JpZ2h0X3BhbmVsL1RpbWVsaW5lQ2FyZC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjEsIDIwMjIgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHtcbiAgICBJRXZlbnRSZWxhdGlvbixcbiAgICBNYXRyaXhFdmVudCxcbiAgICBOb3RpZmljYXRpb25Db3VudFR5cGUsXG4gICAgUm9vbSxcbiAgICBFdmVudFRpbWVsaW5lU2V0LFxuICAgIFRocmVhZCxcbn0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgS25vd25NZW1iZXJzaGlwIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL3R5cGVzXCI7XG5cbmltcG9ydCBCYXNlQ2FyZCBmcm9tIFwiLi9CYXNlQ2FyZFwiO1xuaW1wb3J0IFJlc2l6ZU5vdGlmaWVyIGZyb20gXCIuLi8uLi8uLi91dGlscy9SZXNpemVOb3RpZmllclwiO1xuaW1wb3J0IE1lc3NhZ2VDb21wb3NlciBmcm9tIFwiLi4vcm9vbXMvTWVzc2FnZUNvbXBvc2VyXCI7XG5pbXBvcnQgeyBSb29tUGVybWFsaW5rQ3JlYXRvciB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9wZXJtYWxpbmtzL1Blcm1hbGlua3NcIjtcbmltcG9ydCB7IExheW91dCB9IGZyb20gXCIuLi8uLi8uLi9zZXR0aW5ncy9lbnVtcy9MYXlvdXRcIjtcbmltcG9ydCBUaW1lbGluZVBhbmVsIGZyb20gXCIuLi8uLi9zdHJ1Y3R1cmVzL1RpbWVsaW5lUGFuZWxcIjtcbmltcG9ydCB7IEUyRVN0YXR1cyB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9TaGllbGRVdGlsc1wiO1xuaW1wb3J0IEVkaXRvclN0YXRlVHJhbnNmZXIgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL0VkaXRvclN0YXRlVHJhbnNmZXJcIjtcbmltcG9ydCBSb29tQ29udGV4dCwgeyBUaW1lbGluZVJlbmRlcmluZ1R5cGUgfSBmcm9tIFwiLi4vLi4vLi4vY29udGV4dHMvUm9vbUNvbnRleHRcIjtcbmltcG9ydCBkaXMgZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgX3QgfSBmcm9tIFwiLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgeyBBY3Rpb25QYXlsb2FkIH0gZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvcGF5bG9hZHNcIjtcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2FjdGlvbnNcIjtcbmltcG9ydCBDb250ZW50TWVzc2FnZXMgZnJvbSBcIi4uLy4uLy4uL0NvbnRlbnRNZXNzYWdlc1wiO1xuaW1wb3J0IFVwbG9hZEJhciBmcm9tIFwiLi4vLi4vc3RydWN0dXJlcy9VcGxvYWRCYXJcIjtcbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlXCI7XG5pbXBvcnQgSnVtcFRvQm90dG9tQnV0dG9uIGZyb20gXCIuLi9yb29tcy9KdW1wVG9Cb3R0b21CdXR0b25cIjtcbmltcG9ydCB7IFZpZXdSb29tUGF5bG9hZCB9IGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL3BheWxvYWRzL1ZpZXdSb29tUGF5bG9hZFwiO1xuaW1wb3J0IE1lYXN1cmVkIGZyb20gXCIuLi9lbGVtZW50cy9NZWFzdXJlZFwiO1xuaW1wb3J0IHsgVVBEQVRFX0VWRU5UIH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9Bc3luY1N0b3JlXCI7XG5pbXBvcnQgeyBTZGtDb250ZXh0Q2xhc3MgfSBmcm9tIFwiLi4vLi4vLi4vY29udGV4dHMvU0RLQ29udGV4dFwiO1xuXG5pbnRlcmZhY2UgSVByb3BzIHtcbiAgICByb29tOiBSb29tO1xuICAgIG9uQ2xvc2U6ICgpID0+IHZvaWQ7XG4gICAgcmVzaXplTm90aWZpZXI6IFJlc2l6ZU5vdGlmaWVyO1xuICAgIHBlcm1hbGlua0NyZWF0b3I6IFJvb21QZXJtYWxpbmtDcmVhdG9yO1xuICAgIGUyZVN0YXR1cz86IEUyRVN0YXR1cztcbiAgICBjbGFzc05hbWVzPzogc3RyaW5nO1xuICAgIHRpbWVsaW5lU2V0OiBFdmVudFRpbWVsaW5lU2V0O1xuICAgIHRpbWVsaW5lUmVuZGVyaW5nVHlwZT86IFRpbWVsaW5lUmVuZGVyaW5nVHlwZTtcbiAgICBzaG93Q29tcG9zZXI/OiBib29sZWFuO1xuICAgIGNvbXBvc2VyUmVsYXRpb24/OiBJRXZlbnRSZWxhdGlvbjtcbn1cblxuaW50ZXJmYWNlIElTdGF0ZSB7XG4gICAgdGhyZWFkPzogVGhyZWFkO1xuICAgIGVkaXRTdGF0ZT86IEVkaXRvclN0YXRlVHJhbnNmZXI7XG4gICAgcmVwbHlUb0V2ZW50PzogTWF0cml4RXZlbnQ7XG4gICAgaW5pdGlhbEV2ZW50SWQ/OiBzdHJpbmc7XG4gICAgaXNJbml0aWFsRXZlbnRIaWdobGlnaHRlZD86IGJvb2xlYW47XG4gICAgbGF5b3V0OiBMYXlvdXQ7XG4gICAgYXRFbmRPZkxpdmVUaW1lbGluZTogYm9vbGVhbjtcbiAgICBuYXJyb3c6IGJvb2xlYW47XG5cbiAgICAvLyBzZXR0aW5nczpcbiAgICBzaG93UmVhZFJlY2VpcHRzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGltZWxpbmVDYXJkIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PElQcm9wcywgSVN0YXRlPiB7XG4gICAgcHVibGljIHN0YXRpYyBjb250ZXh0VHlwZSA9IFJvb21Db250ZXh0O1xuICAgIHB1YmxpYyBkZWNsYXJlIGNvbnRleHQ6IFJlYWN0LkNvbnRleHRUeXBlPHR5cGVvZiBSb29tQ29udGV4dD47XG5cbiAgICBwcml2YXRlIGRpc3BhdGNoZXJSZWY/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBsYXlvdXRXYXRjaGVyUmVmPzogc3RyaW5nO1xuICAgIHByaXZhdGUgdGltZWxpbmVQYW5lbCA9IFJlYWN0LmNyZWF0ZVJlZjxUaW1lbGluZVBhbmVsPigpO1xuICAgIHByaXZhdGUgY2FyZCA9IFJlYWN0LmNyZWF0ZVJlZjxIVE1MRGl2RWxlbWVudD4oKTtcbiAgICBwcml2YXRlIHJlYWRSZWNlaXB0c1NldHRpbmdXYXRjaGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHM6IElQcm9wcywgY29udGV4dDogUmVhY3QuQ29udGV4dFR5cGU8dHlwZW9mIFJvb21Db250ZXh0Pikge1xuICAgICAgICBzdXBlcihwcm9wcywgY29udGV4dCk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBzaG93UmVhZFJlY2VpcHRzOiBTZXR0aW5nc1N0b3JlLmdldFZhbHVlKFwic2hvd1JlYWRSZWNlaXB0c1wiLCBwcm9wcy5yb29tLnJvb21JZCksXG4gICAgICAgICAgICBsYXlvdXQ6IFNldHRpbmdzU3RvcmUuZ2V0VmFsdWUoXCJsYXlvdXRcIiksXG4gICAgICAgICAgICBhdEVuZE9mTGl2ZVRpbWVsaW5lOiB0cnVlLFxuICAgICAgICAgICAgbmFycm93OiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50RGlkTW91bnQoKTogdm9pZCB7XG4gICAgICAgIFNka0NvbnRleHRDbGFzcy5pbnN0YW5jZS5yb29tVmlld1N0b3JlLmFkZExpc3RlbmVyKFVQREFURV9FVkVOVCwgdGhpcy5vblJvb21WaWV3U3RvcmVVcGRhdGUpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXJSZWYgPSBkaXMucmVnaXN0ZXIodGhpcy5vbkFjdGlvbik7XG4gICAgICAgIHRoaXMucmVhZFJlY2VpcHRzU2V0dGluZ1dhdGNoZXIgPSBTZXR0aW5nc1N0b3JlLndhdGNoU2V0dGluZyhcInNob3dSZWFkUmVjZWlwdHNcIiwgbnVsbCwgKC4uLlssICwgLCB2YWx1ZV0pID0+XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgc2hvd1JlYWRSZWNlaXB0czogdmFsdWUgYXMgYm9vbGVhbiB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5sYXlvdXRXYXRjaGVyUmVmID0gU2V0dGluZ3NTdG9yZS53YXRjaFNldHRpbmcoXCJsYXlvdXRcIiwgbnVsbCwgKC4uLlssICwgLCB2YWx1ZV0pID0+XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgbGF5b3V0OiB2YWx1ZSBhcyBMYXlvdXQgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCk6IHZvaWQge1xuICAgICAgICBTZGtDb250ZXh0Q2xhc3MuaW5zdGFuY2Uucm9vbVZpZXdTdG9yZS5yZW1vdmVMaXN0ZW5lcihVUERBVEVfRVZFTlQsIHRoaXMub25Sb29tVmlld1N0b3JlVXBkYXRlKTtcblxuICAgICAgICBpZiAodGhpcy5yZWFkUmVjZWlwdHNTZXR0aW5nV2F0Y2hlcikge1xuICAgICAgICAgICAgU2V0dGluZ3NTdG9yZS51bndhdGNoU2V0dGluZyh0aGlzLnJlYWRSZWNlaXB0c1NldHRpbmdXYXRjaGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sYXlvdXRXYXRjaGVyUmVmKSB7XG4gICAgICAgICAgICBTZXR0aW5nc1N0b3JlLnVud2F0Y2hTZXR0aW5nKHRoaXMubGF5b3V0V2F0Y2hlclJlZik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kaXNwYXRjaGVyUmVmKSBkaXMudW5yZWdpc3Rlcih0aGlzLmRpc3BhdGNoZXJSZWYpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25Sb29tVmlld1N0b3JlVXBkYXRlID0gYXN5bmMgKF9pbml0aWFsPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBjb25zdCBuZXdTdGF0ZTogUGljazxJU3RhdGUsIGFueT4gPSB7XG4gICAgICAgICAgICBpbml0aWFsRXZlbnRJZDogU2RrQ29udGV4dENsYXNzLmluc3RhbmNlLnJvb21WaWV3U3RvcmUuZ2V0SW5pdGlhbEV2ZW50SWQoKSxcbiAgICAgICAgICAgIGlzSW5pdGlhbEV2ZW50SGlnaGxpZ2h0ZWQ6IFNka0NvbnRleHRDbGFzcy5pbnN0YW5jZS5yb29tVmlld1N0b3JlLmlzSW5pdGlhbEV2ZW50SGlnaGxpZ2h0ZWQoKSxcbiAgICAgICAgICAgIHJlcGx5VG9FdmVudDogU2RrQ29udGV4dENsYXNzLmluc3RhbmNlLnJvb21WaWV3U3RvcmUuZ2V0UXVvdGluZ0V2ZW50KCksXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25BY3Rpb24gPSAocGF5bG9hZDogQWN0aW9uUGF5bG9hZCk6IHZvaWQgPT4ge1xuICAgICAgICBzd2l0Y2ggKHBheWxvYWQuYWN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIEFjdGlvbi5FZGl0RXZlbnQ6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdFN0YXRlOiBwYXlsb2FkLmV2ZW50ID8gbmV3IEVkaXRvclN0YXRlVHJhbnNmZXIocGF5bG9hZC5ldmVudCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkLmV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lbGluZVBhbmVsLmN1cnJlbnQ/LnNjcm9sbFRvRXZlbnRJZk5lZWRlZChwYXlsb2FkLmV2ZW50LmdldElkKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25TY3JvbGwgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVsaW5lUGFuZWwgPSB0aGlzLnRpbWVsaW5lUGFuZWwuY3VycmVudDtcbiAgICAgICAgaWYgKCF0aW1lbGluZVBhbmVsKSByZXR1cm47XG4gICAgICAgIGlmICh0aW1lbGluZVBhbmVsLmlzQXRFbmRPZkxpdmVUaW1lbGluZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBhdEVuZE9mTGl2ZVRpbWVsaW5lOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBhdEVuZE9mTGl2ZVRpbWVsaW5lOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuaW5pdGlhbEV2ZW50SWQgJiYgdGhpcy5zdGF0ZS5pc0luaXRpYWxFdmVudEhpZ2hsaWdodGVkKSB7XG4gICAgICAgICAgICBkaXMuZGlzcGF0Y2g8Vmlld1Jvb21QYXlsb2FkPih7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBBY3Rpb24uVmlld1Jvb20sXG4gICAgICAgICAgICAgICAgcm9vbV9pZDogdGhpcy5wcm9wcy5yb29tLnJvb21JZCxcbiAgICAgICAgICAgICAgICBldmVudF9pZDogdGhpcy5zdGF0ZS5pbml0aWFsRXZlbnRJZCxcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVwbHlpbmdUb0V2ZW50OiB0aGlzLnN0YXRlLnJlcGx5VG9FdmVudCxcbiAgICAgICAgICAgICAgICBtZXRyaWNzVHJpZ2dlcjogdW5kZWZpbmVkLCAvLyByb29tIGRvZXNuJ3QgY2hhbmdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIG9uTWVhc3VyZW1lbnQgPSAobmFycm93OiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBuYXJyb3cgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUganVtcFRvTGl2ZVRpbWVsaW5lID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5pbml0aWFsRXZlbnRJZCAmJiB0aGlzLnN0YXRlLmlzSW5pdGlhbEV2ZW50SGlnaGxpZ2h0ZWQpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIHdlcmUgdmlld2luZyBhIGhpZ2hsaWdodGVkIGV2ZW50LCBmaXJpbmcgdmlld19yb29tIHdpdGhvdXRcbiAgICAgICAgICAgIC8vIGFuIGV2ZW50IHdpbGwgdGFrZSBjYXJlIG9mIGJvdGggY2xlYXJpbmcgdGhlIFVSTCBmcmFnbWVudCBhbmRcbiAgICAgICAgICAgIC8vIGp1bXBpbmcgdG8gdGhlIGJvdHRvbVxuICAgICAgICAgICAgZGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IEFjdGlvbi5WaWV3Um9vbSxcbiAgICAgICAgICAgICAgICByb29tX2lkOiB0aGlzLnByb3BzLnJvb20ucm9vbUlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2UgaGF2ZSB0byBqdW1wIG1hbnVhbGx5XG4gICAgICAgICAgICB0aGlzLnRpbWVsaW5lUGFuZWwuY3VycmVudD8uanVtcFRvTGl2ZVRpbWVsaW5lKCk7XG4gICAgICAgICAgICBkaXMuZmlyZShBY3Rpb24uRm9jdXNTZW5kTWVzc2FnZUNvbXBvc2VyKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIGNvbnN0IGhpZ2hsaWdodGVkRXZlbnRJZCA9IHRoaXMuc3RhdGUuaXNJbml0aWFsRXZlbnRIaWdobGlnaHRlZCA/IHRoaXMuc3RhdGUuaW5pdGlhbEV2ZW50SWQgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IGp1bXBUb0JvdHRvbTtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmF0RW5kT2ZMaXZlVGltZWxpbmUpIHtcbiAgICAgICAgICAgIGp1bXBUb0JvdHRvbSA9IChcbiAgICAgICAgICAgICAgICA8SnVtcFRvQm90dG9tQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodD17dGhpcy5wcm9wcy5yb29tLmdldFVucmVhZE5vdGlmaWNhdGlvbkNvdW50KE5vdGlmaWNhdGlvbkNvdW50VHlwZS5IaWdobGlnaHQpID4gMH1cbiAgICAgICAgICAgICAgICAgICAgb25TY3JvbGxUb0JvdHRvbUNsaWNrPXt0aGlzLmp1bXBUb0xpdmVUaW1lbGluZX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzVXBsb2FkaW5nID0gQ29udGVudE1lc3NhZ2VzLnNoYXJlZEluc3RhbmNlKCkuZ2V0Q3VycmVudFVwbG9hZHModGhpcy5wcm9wcy5jb21wb3NlclJlbGF0aW9uKS5sZW5ndGggPiAwO1xuXG4gICAgICAgIGNvbnN0IG15TWVtYmVyc2hpcCA9IHRoaXMucHJvcHMucm9vbS5nZXRNeU1lbWJlcnNoaXAoKTtcbiAgICAgICAgY29uc3Qgc2hvd0NvbXBvc2VyID0gbXlNZW1iZXJzaGlwID09PSBLbm93bk1lbWJlcnNoaXAuSm9pbjtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPFJvb21Db250ZXh0LlByb3ZpZGVyXG4gICAgICAgICAgICAgICAgdmFsdWU9e3tcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5jb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICB0aW1lbGluZVJlbmRlcmluZ1R5cGU6IHRoaXMucHJvcHMudGltZWxpbmVSZW5kZXJpbmdUeXBlID8/IHRoaXMuY29udGV4dC50aW1lbGluZVJlbmRlcmluZ1R5cGUsXG4gICAgICAgICAgICAgICAgICAgIGxpdmVUaW1lbGluZTogdGhpcy5wcm9wcy50aW1lbGluZVNldD8uZ2V0TGl2ZVRpbWVsaW5lKCksXG4gICAgICAgICAgICAgICAgICAgIG5hcnJvdzogdGhpcy5zdGF0ZS5uYXJyb3csXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8QmFzZUNhcmRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZXN9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xvc2U9e3RoaXMucHJvcHMub25DbG9zZX1cbiAgICAgICAgICAgICAgICAgICAgd2l0aG91dFNjcm9sbENvbnRhaW5lcj17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyPXtfdChcInJpZ2h0X3BhbmVsfHZpZGVvX3Jvb21fY2hhdHx0aXRsZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgcmVmPXt0aGlzLmNhcmR9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5jYXJkLmN1cnJlbnQgJiYgPE1lYXN1cmVkIHNlbnNvcj17dGhpcy5jYXJkLmN1cnJlbnR9IG9uTWVhc3VyZW1lbnQ9e3RoaXMub25NZWFzdXJlbWVudH0gLz59XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfVGltZWxpbmVDYXJkX3RpbWVsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7anVtcFRvQm90dG9tfVxuICAgICAgICAgICAgICAgICAgICAgICAgPFRpbWVsaW5lUGFuZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9e3RoaXMudGltZWxpbmVQYW5lbH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93UmVhZFJlY2VpcHRzPXt0aGlzLnN0YXRlLnNob3dSZWFkUmVjZWlwdHN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlUmVhZFJlY2VpcHRzPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZVJlYWRNYXJrZXJzPXtmYWxzZX0gLy8gTm8gUk0gc3VwcG9ydCBpbiB0aGUgVGltZWxpbmVDYXJkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlYWRSZWNlaXB0T25Mb2FkPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVsaW5lU2V0PXt0aGlzLnByb3BzLnRpbWVsaW5lU2V0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dVcmxQcmV2aWV3PXt0aGlzLmNvbnRleHQuc2hvd1VybFByZXZpZXd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJpZ2h0IHBhbmVsIHRpbWVsaW5lIChhbmQgdGhlcmVmb3JlIHRocmVhZHMpIGRvbid0IHN1cHBvcnQgSVJDIGxheW91dCBhdCB0aGlzIHRpbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQ9e3RoaXMuc3RhdGUubGF5b3V0ID09PSBMYXlvdXQuQnViYmxlID8gTGF5b3V0LkJ1YmJsZSA6IExheW91dC5Hcm91cH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlVGhyZWFkZWRNZXNzYWdlcz17ZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuPXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93UmVhY3Rpb25zPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X1Jvb21WaWV3X21lc3NhZ2VQYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWFsaW5rQ3JlYXRvcj17dGhpcy5wcm9wcy5wZXJtYWxpbmtDcmVhdG9yfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcnNMb2FkZWQ9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdFN0YXRlPXt0aGlzLnN0YXRlLmVkaXRTdGF0ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudElkPXt0aGlzLnN0YXRlLmluaXRpYWxFdmVudElkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZU5vdGlmaWVyPXt0aGlzLnByb3BzLnJlc2l6ZU5vdGlmaWVyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkRXZlbnRJZD17aGlnaGxpZ2h0ZWRFdmVudElkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU2Nyb2xsPXt0aGlzLm9uU2Nyb2xsfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAge2lzVXBsb2FkaW5nICYmIDxVcGxvYWRCYXIgcm9vbT17dGhpcy5wcm9wcy5yb29tfSByZWxhdGlvbj17dGhpcy5wcm9wcy5jb21wb3NlclJlbGF0aW9ufSAvPn1cblxuICAgICAgICAgICAgICAgICAgICB7c2hvd0NvbXBvc2VyICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxNZXNzYWdlQ29tcG9zZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb29tPXt0aGlzLnByb3BzLnJvb219XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb249e3RoaXMucHJvcHMuY29tcG9zZXJSZWxhdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpemVOb3RpZmllcj17dGhpcy5wcm9wcy5yZXNpemVOb3RpZmllcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseVRvRXZlbnQ9e3RoaXMuc3RhdGUucmVwbHlUb0V2ZW50fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1hbGlua0NyZWF0b3I9e3RoaXMucHJvcHMucGVybWFsaW5rQ3JlYXRvcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMmVTdGF0dXM9e3RoaXMucHJvcHMuZTJlU3RhdHVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhY3Q9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvQmFzZUNhcmQ+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