UNPKG

matrix-react-sdk

Version:
166 lines (160 loc) 23.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useFetchPastPolls = void 0; var _react = require("react"); var _matrix = require("matrix-js-sdk/src/matrix"); var _logger = require("matrix-js-sdk/src/logger"); /* Copyright 2024 New Vector Ltd. Copyright 2023 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. */ const getOldestEventTimestamp = timelineSet => { if (!timelineSet) { return; } const liveTimeline = timelineSet?.getLiveTimeline(); const events = liveTimeline.getEvents(); return events[0]?.getTs(); }; /** * Page backwards in timeline history * @param timelineSet - timelineset to page * @param matrixClient - client * @param canPageBackward - whether the timeline has more pages * @param oldestEventTimestamp - server ts of the oldest encountered event */ const pagePollHistory = async (timelineSet, matrixClient) => { if (!timelineSet) { return { canPageBackward: false }; } const liveTimeline = timelineSet.getLiveTimeline(); await matrixClient.paginateEventTimeline(liveTimeline, { backwards: true }); return { oldestEventTimestamp: getOldestEventTimestamp(timelineSet), canPageBackward: !!liveTimeline.getPaginationToken(_matrix.EventTimeline.BACKWARDS) }; }; /** * Page timeline backwards until either: * - event older than timestamp is encountered * - end of timeline is reached * @param timelineSet - timeline set to page * @param matrixClient - client * @param timestamp - epoch timestamp to page until * @param canPageBackward - whether the timeline has more pages * @param oldestEventTimestamp - server ts of the oldest encountered event */ const fetchHistoryUntilTimestamp = async (timelineSet, matrixClient, timestamp, canPageBackward, oldestEventTimestamp) => { if (!timelineSet || !canPageBackward || oldestEventTimestamp && oldestEventTimestamp < timestamp) { return; } const result = await pagePollHistory(timelineSet, matrixClient); return fetchHistoryUntilTimestamp(timelineSet, matrixClient, timestamp, result.canPageBackward, result.oldestEventTimestamp); }; const ONE_DAY_MS = 60000 * 60 * 24; /** * Fetches timeline history for given number of days in past * @param timelineSet - timelineset to page * @param matrixClient - client * @param historyPeriodDays - number of days of history to fetch, from current day * @returns isLoading - true while fetching * @returns oldestEventTimestamp - timestamp of oldest encountered poll, undefined when no polls found in timeline so far * @returns loadMorePolls - function to page timeline backwards, undefined when timeline cannot be paged backwards * @returns loadTimelineHistory - loads timeline history for the given history period */ const useTimelineHistory = (timelineSet, matrixClient, historyPeriodDays) => { const [isLoading, setIsLoading] = (0, _react.useState)(true); const [oldestEventTimestamp, setOldestEventTimestamp] = (0, _react.useState)(undefined); const [canPageBackward, setCanPageBackward] = (0, _react.useState)(false); const loadTimelineHistory = (0, _react.useCallback)(async () => { const endOfHistoryPeriodTimestamp = Date.now() - ONE_DAY_MS * historyPeriodDays; setIsLoading(true); try { const liveTimeline = timelineSet?.getLiveTimeline(); const canPageBackward = !!liveTimeline?.getPaginationToken(_matrix.Direction.Backward); const oldestEventTimestamp = getOldestEventTimestamp(timelineSet); await fetchHistoryUntilTimestamp(timelineSet, matrixClient, endOfHistoryPeriodTimestamp, canPageBackward, oldestEventTimestamp); setCanPageBackward(!!timelineSet?.getLiveTimeline()?.getPaginationToken(_matrix.EventTimeline.BACKWARDS)); setOldestEventTimestamp(getOldestEventTimestamp(timelineSet)); } catch (error) { _logger.logger.error("Failed to fetch room polls history", error); } finally { setIsLoading(false); } }, [historyPeriodDays, timelineSet, matrixClient]); const loadMorePolls = (0, _react.useCallback)(async () => { if (!timelineSet) { return; } setIsLoading(true); try { const result = await pagePollHistory(timelineSet, matrixClient); setCanPageBackward(result.canPageBackward); setOldestEventTimestamp(result.oldestEventTimestamp); } catch (error) { _logger.logger.error("Failed to fetch room polls history", error); } finally { setIsLoading(false); } }, [timelineSet, matrixClient]); return { isLoading, oldestEventTimestamp, loadTimelineHistory, loadMorePolls: canPageBackward ? loadMorePolls : undefined }; }; const filterDefinition = { room: { timeline: { types: [_matrix.M_POLL_START.name, _matrix.M_POLL_START.altName] } } }; /** * Fetches poll start events in the last N days of room history * @param room - room to fetch history for * @param matrixClient - client * @param historyPeriodDays - number of days of history to fetch, from current day * @returns isLoading - true while fetching history * @returns oldestEventTimestamp - timestamp of oldest encountered poll, undefined when no polls found in timeline so far * @returns loadMorePolls - function to page timeline backwards, undefined when timeline cannot be paged backwards */ const useFetchPastPolls = (room, matrixClient, historyPeriodDays = 30) => { const [timelineSet, setTimelineSet] = (0, _react.useState)(undefined); (0, _react.useEffect)(() => { const filter = new _matrix.Filter(matrixClient.getSafeUserId()); filter.setDefinition(filterDefinition); const getFilteredTimelineSet = async () => { const filterId = await matrixClient.getOrCreateFilter(`POLL_HISTORY_FILTER_${room.roomId}}`, filter); filter.filterId = filterId; const timelineSet = room.getOrCreateFilteredTimelineSet(filter); setTimelineSet(timelineSet); }; getFilteredTimelineSet(); }, [room, matrixClient]); const { isLoading, oldestEventTimestamp, loadMorePolls, loadTimelineHistory } = useTimelineHistory(timelineSet, matrixClient, historyPeriodDays); (0, _react.useEffect)(() => { loadTimelineHistory(); }, [loadTimelineHistory]); return { isLoading, oldestEventTimestamp, loadMorePolls }; }; exports.useFetchPastPolls = useFetchPastPolls; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX21hdHJpeCIsIl9sb2dnZXIiLCJnZXRPbGRlc3RFdmVudFRpbWVzdGFtcCIsInRpbWVsaW5lU2V0IiwibGl2ZVRpbWVsaW5lIiwiZ2V0TGl2ZVRpbWVsaW5lIiwiZXZlbnRzIiwiZ2V0RXZlbnRzIiwiZ2V0VHMiLCJwYWdlUG9sbEhpc3RvcnkiLCJtYXRyaXhDbGllbnQiLCJjYW5QYWdlQmFja3dhcmQiLCJwYWdpbmF0ZUV2ZW50VGltZWxpbmUiLCJiYWNrd2FyZHMiLCJvbGRlc3RFdmVudFRpbWVzdGFtcCIsImdldFBhZ2luYXRpb25Ub2tlbiIsIkV2ZW50VGltZWxpbmUiLCJCQUNLV0FSRFMiLCJmZXRjaEhpc3RvcnlVbnRpbFRpbWVzdGFtcCIsInRpbWVzdGFtcCIsInJlc3VsdCIsIk9ORV9EQVlfTVMiLCJ1c2VUaW1lbGluZUhpc3RvcnkiLCJoaXN0b3J5UGVyaW9kRGF5cyIsImlzTG9hZGluZyIsInNldElzTG9hZGluZyIsInVzZVN0YXRlIiwic2V0T2xkZXN0RXZlbnRUaW1lc3RhbXAiLCJ1bmRlZmluZWQiLCJzZXRDYW5QYWdlQmFja3dhcmQiLCJsb2FkVGltZWxpbmVIaXN0b3J5IiwidXNlQ2FsbGJhY2siLCJlbmRPZkhpc3RvcnlQZXJpb2RUaW1lc3RhbXAiLCJEYXRlIiwibm93IiwiRGlyZWN0aW9uIiwiQmFja3dhcmQiLCJlcnJvciIsImxvZ2dlciIsImxvYWRNb3JlUG9sbHMiLCJmaWx0ZXJEZWZpbml0aW9uIiwicm9vbSIsInRpbWVsaW5lIiwidHlwZXMiLCJNX1BPTExfU1RBUlQiLCJuYW1lIiwiYWx0TmFtZSIsInVzZUZldGNoUGFzdFBvbGxzIiwic2V0VGltZWxpbmVTZXQiLCJ1c2VFZmZlY3QiLCJmaWx0ZXIiLCJGaWx0ZXIiLCJnZXRTYWZlVXNlcklkIiwic2V0RGVmaW5pdGlvbiIsImdldEZpbHRlcmVkVGltZWxpbmVTZXQiLCJmaWx0ZXJJZCIsImdldE9yQ3JlYXRlRmlsdGVyIiwicm9vbUlkIiwiZ2V0T3JDcmVhdGVGaWx0ZXJlZFRpbWVsaW5lU2V0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3BvbGxzL3BvbGxIaXN0b3J5L2ZldGNoUGFzdFBvbGxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIzIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQge1xuICAgIE1fUE9MTF9TVEFSVCxcbiAgICBNYXRyaXhDbGllbnQsXG4gICAgRGlyZWN0aW9uLFxuICAgIEV2ZW50VGltZWxpbmUsXG4gICAgRXZlbnRUaW1lbGluZVNldCxcbiAgICBSb29tLFxuICAgIEZpbHRlcixcbiAgICBJRmlsdGVyRGVmaW5pdGlvbixcbn0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuXG5jb25zdCBnZXRPbGRlc3RFdmVudFRpbWVzdGFtcCA9ICh0aW1lbGluZVNldD86IEV2ZW50VGltZWxpbmVTZXQpOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmICghdGltZWxpbmVTZXQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxpdmVUaW1lbGluZSA9IHRpbWVsaW5lU2V0Py5nZXRMaXZlVGltZWxpbmUoKTtcbiAgICBjb25zdCBldmVudHMgPSBsaXZlVGltZWxpbmUuZ2V0RXZlbnRzKCk7XG4gICAgcmV0dXJuIGV2ZW50c1swXT8uZ2V0VHMoKTtcbn07XG5cbi8qKlxuICogUGFnZSBiYWNrd2FyZHMgaW4gdGltZWxpbmUgaGlzdG9yeVxuICogQHBhcmFtIHRpbWVsaW5lU2V0IC0gdGltZWxpbmVzZXQgdG8gcGFnZVxuICogQHBhcmFtIG1hdHJpeENsaWVudCAtIGNsaWVudFxuICogQHBhcmFtIGNhblBhZ2VCYWNrd2FyZCAtIHdoZXRoZXIgdGhlIHRpbWVsaW5lIGhhcyBtb3JlIHBhZ2VzXG4gKiBAcGFyYW0gb2xkZXN0RXZlbnRUaW1lc3RhbXAgLSBzZXJ2ZXIgdHMgb2YgdGhlIG9sZGVzdCBlbmNvdW50ZXJlZCBldmVudFxuICovXG5jb25zdCBwYWdlUG9sbEhpc3RvcnkgPSBhc3luYyAoXG4gICAgdGltZWxpbmVTZXQ6IEV2ZW50VGltZWxpbmVTZXQsXG4gICAgbWF0cml4Q2xpZW50OiBNYXRyaXhDbGllbnQsXG4pOiBQcm9taXNlPHtcbiAgICBvbGRlc3RFdmVudFRpbWVzdGFtcD86IG51bWJlcjtcbiAgICBjYW5QYWdlQmFja3dhcmQ6IGJvb2xlYW47XG59PiA9PiB7XG4gICAgaWYgKCF0aW1lbGluZVNldCkge1xuICAgICAgICByZXR1cm4geyBjYW5QYWdlQmFja3dhcmQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgY29uc3QgbGl2ZVRpbWVsaW5lID0gdGltZWxpbmVTZXQuZ2V0TGl2ZVRpbWVsaW5lKCk7XG5cbiAgICBhd2FpdCBtYXRyaXhDbGllbnQucGFnaW5hdGVFdmVudFRpbWVsaW5lKGxpdmVUaW1lbGluZSwge1xuICAgICAgICBiYWNrd2FyZHM6IHRydWUsXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBvbGRlc3RFdmVudFRpbWVzdGFtcDogZ2V0T2xkZXN0RXZlbnRUaW1lc3RhbXAodGltZWxpbmVTZXQpLFxuICAgICAgICBjYW5QYWdlQmFja3dhcmQ6ICEhbGl2ZVRpbWVsaW5lLmdldFBhZ2luYXRpb25Ub2tlbihFdmVudFRpbWVsaW5lLkJBQ0tXQVJEUyksXG4gICAgfTtcbn07XG5cbi8qKlxuICogUGFnZSB0aW1lbGluZSBiYWNrd2FyZHMgdW50aWwgZWl0aGVyOlxuICogLSBldmVudCBvbGRlciB0aGFuIHRpbWVzdGFtcCBpcyBlbmNvdW50ZXJlZFxuICogLSBlbmQgb2YgdGltZWxpbmUgaXMgcmVhY2hlZFxuICogQHBhcmFtIHRpbWVsaW5lU2V0IC0gdGltZWxpbmUgc2V0IHRvIHBhZ2VcbiAqIEBwYXJhbSBtYXRyaXhDbGllbnQgLSBjbGllbnRcbiAqIEBwYXJhbSB0aW1lc3RhbXAgLSBlcG9jaCB0aW1lc3RhbXAgdG8gcGFnZSB1bnRpbFxuICogQHBhcmFtIGNhblBhZ2VCYWNrd2FyZCAtIHdoZXRoZXIgdGhlIHRpbWVsaW5lIGhhcyBtb3JlIHBhZ2VzXG4gKiBAcGFyYW0gb2xkZXN0RXZlbnRUaW1lc3RhbXAgLSBzZXJ2ZXIgdHMgb2YgdGhlIG9sZGVzdCBlbmNvdW50ZXJlZCBldmVudFxuICovXG5jb25zdCBmZXRjaEhpc3RvcnlVbnRpbFRpbWVzdGFtcCA9IGFzeW5jIChcbiAgICB0aW1lbGluZVNldDogRXZlbnRUaW1lbGluZVNldCB8IHVuZGVmaW5lZCxcbiAgICBtYXRyaXhDbGllbnQ6IE1hdHJpeENsaWVudCxcbiAgICB0aW1lc3RhbXA6IG51bWJlcixcbiAgICBjYW5QYWdlQmFja3dhcmQ6IGJvb2xlYW4sXG4gICAgb2xkZXN0RXZlbnRUaW1lc3RhbXA/OiBudW1iZXIsXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoIXRpbWVsaW5lU2V0IHx8ICFjYW5QYWdlQmFja3dhcmQgfHwgKG9sZGVzdEV2ZW50VGltZXN0YW1wICYmIG9sZGVzdEV2ZW50VGltZXN0YW1wIDwgdGltZXN0YW1wKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhZ2VQb2xsSGlzdG9yeSh0aW1lbGluZVNldCwgbWF0cml4Q2xpZW50KTtcblxuICAgIHJldHVybiBmZXRjaEhpc3RvcnlVbnRpbFRpbWVzdGFtcChcbiAgICAgICAgdGltZWxpbmVTZXQsXG4gICAgICAgIG1hdHJpeENsaWVudCxcbiAgICAgICAgdGltZXN0YW1wLFxuICAgICAgICByZXN1bHQuY2FuUGFnZUJhY2t3YXJkLFxuICAgICAgICByZXN1bHQub2xkZXN0RXZlbnRUaW1lc3RhbXAsXG4gICAgKTtcbn07XG5cbmNvbnN0IE9ORV9EQVlfTVMgPSA2MDAwMCAqIDYwICogMjQ7XG4vKipcbiAqIEZldGNoZXMgdGltZWxpbmUgaGlzdG9yeSBmb3IgZ2l2ZW4gbnVtYmVyIG9mIGRheXMgaW4gcGFzdFxuICogQHBhcmFtIHRpbWVsaW5lU2V0IC0gdGltZWxpbmVzZXQgdG8gcGFnZVxuICogQHBhcmFtIG1hdHJpeENsaWVudCAtIGNsaWVudFxuICogQHBhcmFtIGhpc3RvcnlQZXJpb2REYXlzIC0gbnVtYmVyIG9mIGRheXMgb2YgaGlzdG9yeSB0byBmZXRjaCwgZnJvbSBjdXJyZW50IGRheVxuICogQHJldHVybnMgaXNMb2FkaW5nIC0gdHJ1ZSB3aGlsZSBmZXRjaGluZ1xuICogQHJldHVybnMgb2xkZXN0RXZlbnRUaW1lc3RhbXAgLSB0aW1lc3RhbXAgb2Ygb2xkZXN0IGVuY291bnRlcmVkIHBvbGwsIHVuZGVmaW5lZCB3aGVuIG5vIHBvbGxzIGZvdW5kIGluIHRpbWVsaW5lIHNvIGZhclxuICogQHJldHVybnMgbG9hZE1vcmVQb2xscyAtIGZ1bmN0aW9uIHRvIHBhZ2UgdGltZWxpbmUgYmFja3dhcmRzLCB1bmRlZmluZWQgd2hlbiB0aW1lbGluZSBjYW5ub3QgYmUgcGFnZWQgYmFja3dhcmRzXG4gKiBAcmV0dXJucyBsb2FkVGltZWxpbmVIaXN0b3J5IC0gbG9hZHMgdGltZWxpbmUgaGlzdG9yeSBmb3IgdGhlIGdpdmVuIGhpc3RvcnkgcGVyaW9kXG4gKi9cbmNvbnN0IHVzZVRpbWVsaW5lSGlzdG9yeSA9IChcbiAgICB0aW1lbGluZVNldDogRXZlbnRUaW1lbGluZVNldCB8IHVuZGVmaW5lZCxcbiAgICBtYXRyaXhDbGllbnQ6IE1hdHJpeENsaWVudCxcbiAgICBoaXN0b3J5UGVyaW9kRGF5czogbnVtYmVyLFxuKToge1xuICAgIGlzTG9hZGluZzogYm9vbGVhbjtcbiAgICBvbGRlc3RFdmVudFRpbWVzdGFtcD86IG51bWJlcjtcbiAgICBsb2FkVGltZWxpbmVIaXN0b3J5OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIGxvYWRNb3JlUG9sbHM/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xufSA9PiB7XG4gICAgY29uc3QgW2lzTG9hZGluZywgc2V0SXNMb2FkaW5nXSA9IHVzZVN0YXRlKHRydWUpO1xuICAgIGNvbnN0IFtvbGRlc3RFdmVudFRpbWVzdGFtcCwgc2V0T2xkZXN0RXZlbnRUaW1lc3RhbXBdID0gdXNlU3RhdGU8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAgIGNvbnN0IFtjYW5QYWdlQmFja3dhcmQsIHNldENhblBhZ2VCYWNrd2FyZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgICBjb25zdCBsb2FkVGltZWxpbmVIaXN0b3J5ID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBlbmRPZkhpc3RvcnlQZXJpb2RUaW1lc3RhbXAgPSBEYXRlLm5vdygpIC0gT05FX0RBWV9NUyAqIGhpc3RvcnlQZXJpb2REYXlzO1xuICAgICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBsaXZlVGltZWxpbmUgPSB0aW1lbGluZVNldD8uZ2V0TGl2ZVRpbWVsaW5lKCk7XG4gICAgICAgICAgICBjb25zdCBjYW5QYWdlQmFja3dhcmQgPSAhIWxpdmVUaW1lbGluZT8uZ2V0UGFnaW5hdGlvblRva2VuKERpcmVjdGlvbi5CYWNrd2FyZCk7XG4gICAgICAgICAgICBjb25zdCBvbGRlc3RFdmVudFRpbWVzdGFtcCA9IGdldE9sZGVzdEV2ZW50VGltZXN0YW1wKHRpbWVsaW5lU2V0KTtcblxuICAgICAgICAgICAgYXdhaXQgZmV0Y2hIaXN0b3J5VW50aWxUaW1lc3RhbXAoXG4gICAgICAgICAgICAgICAgdGltZWxpbmVTZXQsXG4gICAgICAgICAgICAgICAgbWF0cml4Q2xpZW50LFxuICAgICAgICAgICAgICAgIGVuZE9mSGlzdG9yeVBlcmlvZFRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICBjYW5QYWdlQmFja3dhcmQsXG4gICAgICAgICAgICAgICAgb2xkZXN0RXZlbnRUaW1lc3RhbXAsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBzZXRDYW5QYWdlQmFja3dhcmQoISF0aW1lbGluZVNldD8uZ2V0TGl2ZVRpbWVsaW5lKCk/LmdldFBhZ2luYXRpb25Ub2tlbihFdmVudFRpbWVsaW5lLkJBQ0tXQVJEUykpO1xuICAgICAgICAgICAgc2V0T2xkZXN0RXZlbnRUaW1lc3RhbXAoZ2V0T2xkZXN0RXZlbnRUaW1lc3RhbXAodGltZWxpbmVTZXQpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkZhaWxlZCB0byBmZXRjaCByb29tIHBvbGxzIGhpc3RvcnlcIiwgZXJyb3IpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH0sIFtoaXN0b3J5UGVyaW9kRGF5cywgdGltZWxpbmVTZXQsIG1hdHJpeENsaWVudF0pO1xuXG4gICAgY29uc3QgbG9hZE1vcmVQb2xscyA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKCF0aW1lbGluZVNldCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldElzTG9hZGluZyh0cnVlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhZ2VQb2xsSGlzdG9yeSh0aW1lbGluZVNldCwgbWF0cml4Q2xpZW50KTtcblxuICAgICAgICAgICAgc2V0Q2FuUGFnZUJhY2t3YXJkKHJlc3VsdC5jYW5QYWdlQmFja3dhcmQpO1xuICAgICAgICAgICAgc2V0T2xkZXN0RXZlbnRUaW1lc3RhbXAocmVzdWx0Lm9sZGVzdEV2ZW50VGltZXN0YW1wKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkZhaWxlZCB0byBmZXRjaCByb29tIHBvbGxzIGhpc3RvcnlcIiwgZXJyb3IpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH0sIFt0aW1lbGluZVNldCwgbWF0cml4Q2xpZW50XSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBpc0xvYWRpbmcsXG4gICAgICAgIG9sZGVzdEV2ZW50VGltZXN0YW1wLFxuICAgICAgICBsb2FkVGltZWxpbmVIaXN0b3J5LFxuICAgICAgICBsb2FkTW9yZVBvbGxzOiBjYW5QYWdlQmFja3dhcmQgPyBsb2FkTW9yZVBvbGxzIDogdW5kZWZpbmVkLFxuICAgIH07XG59O1xuXG5jb25zdCBmaWx0ZXJEZWZpbml0aW9uOiBJRmlsdGVyRGVmaW5pdGlvbiA9IHtcbiAgICByb29tOiB7XG4gICAgICAgIHRpbWVsaW5lOiB7XG4gICAgICAgICAgICB0eXBlczogW01fUE9MTF9TVEFSVC5uYW1lLCBNX1BPTExfU1RBUlQuYWx0TmFtZV0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5cbi8qKlxuICogRmV0Y2hlcyBwb2xsIHN0YXJ0IGV2ZW50cyBpbiB0aGUgbGFzdCBOIGRheXMgb2Ygcm9vbSBoaXN0b3J5XG4gKiBAcGFyYW0gcm9vbSAtIHJvb20gdG8gZmV0Y2ggaGlzdG9yeSBmb3JcbiAqIEBwYXJhbSBtYXRyaXhDbGllbnQgLSBjbGllbnRcbiAqIEBwYXJhbSBoaXN0b3J5UGVyaW9kRGF5cyAtIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gZmV0Y2gsIGZyb20gY3VycmVudCBkYXlcbiAqIEByZXR1cm5zIGlzTG9hZGluZyAtIHRydWUgd2hpbGUgZmV0Y2hpbmcgaGlzdG9yeVxuICogQHJldHVybnMgb2xkZXN0RXZlbnRUaW1lc3RhbXAgLSB0aW1lc3RhbXAgb2Ygb2xkZXN0IGVuY291bnRlcmVkIHBvbGwsIHVuZGVmaW5lZCB3aGVuIG5vIHBvbGxzIGZvdW5kIGluIHRpbWVsaW5lIHNvIGZhclxuICogQHJldHVybnMgbG9hZE1vcmVQb2xscyAtIGZ1bmN0aW9uIHRvIHBhZ2UgdGltZWxpbmUgYmFja3dhcmRzLCB1bmRlZmluZWQgd2hlbiB0aW1lbGluZSBjYW5ub3QgYmUgcGFnZWQgYmFja3dhcmRzXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VGZXRjaFBhc3RQb2xscyA9IChcbiAgICByb29tOiBSb29tLFxuICAgIG1hdHJpeENsaWVudDogTWF0cml4Q2xpZW50LFxuICAgIGhpc3RvcnlQZXJpb2REYXlzID0gMzAsXG4pOiB7XG4gICAgaXNMb2FkaW5nOiBib29sZWFuO1xuICAgIG9sZGVzdEV2ZW50VGltZXN0YW1wPzogbnVtYmVyO1xuICAgIGxvYWRNb3JlUG9sbHM/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xufSA9PiB7XG4gICAgY29uc3QgW3RpbWVsaW5lU2V0LCBzZXRUaW1lbGluZVNldF0gPSB1c2VTdGF0ZTxFdmVudFRpbWVsaW5lU2V0IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gbmV3IEZpbHRlcihtYXRyaXhDbGllbnQuZ2V0U2FmZVVzZXJJZCgpKTtcbiAgICAgICAgZmlsdGVyLnNldERlZmluaXRpb24oZmlsdGVyRGVmaW5pdGlvbik7XG4gICAgICAgIGNvbnN0IGdldEZpbHRlcmVkVGltZWxpbmVTZXQgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJJZCA9IGF3YWl0IG1hdHJpeENsaWVudC5nZXRPckNyZWF0ZUZpbHRlcihgUE9MTF9ISVNUT1JZX0ZJTFRFUl8ke3Jvb20ucm9vbUlkfX1gLCBmaWx0ZXIpO1xuICAgICAgICAgICAgZmlsdGVyLmZpbHRlcklkID0gZmlsdGVySWQ7XG4gICAgICAgICAgICBjb25zdCB0aW1lbGluZVNldCA9IHJvb20uZ2V0T3JDcmVhdGVGaWx0ZXJlZFRpbWVsaW5lU2V0KGZpbHRlcik7XG4gICAgICAgICAgICBzZXRUaW1lbGluZVNldCh0aW1lbGluZVNldCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0RmlsdGVyZWRUaW1lbGluZVNldCgpO1xuICAgIH0sIFtyb29tLCBtYXRyaXhDbGllbnRdKTtcblxuICAgIGNvbnN0IHsgaXNMb2FkaW5nLCBvbGRlc3RFdmVudFRpbWVzdGFtcCwgbG9hZE1vcmVQb2xscywgbG9hZFRpbWVsaW5lSGlzdG9yeSB9ID0gdXNlVGltZWxpbmVIaXN0b3J5KFxuICAgICAgICB0aW1lbGluZVNldCxcbiAgICAgICAgbWF0cml4Q2xpZW50LFxuICAgICAgICBoaXN0b3J5UGVyaW9kRGF5cyxcbiAgICApO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgbG9hZFRpbWVsaW5lSGlzdG9yeSgpO1xuICAgIH0sIFtsb2FkVGltZWxpbmVIaXN0b3J5XSk7XG5cbiAgICByZXR1cm4geyBpc0xvYWRpbmcsIG9sZGVzdEV2ZW50VGltZXN0YW1wLCBsb2FkTW9yZVBvbGxzIH07XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFRQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFVQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBZUEsTUFBTUcsdUJBQXVCLEdBQUlDLFdBQThCLElBQXlCO0VBQ3BGLElBQUksQ0FBQ0EsV0FBVyxFQUFFO0lBQ2Q7RUFDSjtFQUVBLE1BQU1DLFlBQVksR0FBR0QsV0FBVyxFQUFFRSxlQUFlLENBQUMsQ0FBQztFQUNuRCxNQUFNQyxN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UUFBUSxFQUFFO01BQ05DLEtBQUssRUFBRSxDQUFDQyxvQkFBWSxDQUFDQyxJQUFJLEVBQUVELG9CQUFZLENBQUNFLE9BQU87SUFDbkQ7RUFDSjtBQUNKLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sTUFBTUMsaUJBQWlCLEdBQUdBLENBQzdCTixJQUFVLEVBQ1YvQixZQUEwQixFQUMxQmEsaUJBQWlCLEdBQUcsRUFBRSxLQUtyQjtFQUNELE1BQU0sQ0FBQ3BCLFdBQVcsRUFBRTZDLGNBQWMsQ0FBQyxHQUFHLElBQUF0QixlQUFRLEVBQStCRSxTQUFTLENBQUM7RUFFdkYsSUFBQXFCLGdCQUFTLEVBQUMsTUFBTTtJQUNaLE1BQU1DLE1BQU0sR0FBRyxJQUFJQyxjQUFNLENBQUN6QyxZQUFZLENBQUMwQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ3ZERixNQUFNLENBQUNHLGFBQWEsQ0FBQ2IsZ0JBQWdCLENBQUM7SUFDdEMsTUFBTWMsc0JBQXNCLEdBQUcsTUFBQUEsQ0FBQSxLQUEyQjtNQUN0RCxNQUFNQyxRQUFRLEdBQUcsTUFBTTdDLFlBQVksQ0FBQzhDLGlCQUFpQixDQUFDLHVCQUF1QmYsSUFBSSxDQUFDZ0IsTUFBTSxHQUFHLEVBQUVQLE1BQU0sQ0FBQztNQUNwR0EsTUFBTSxDQUFDSyxRQUFRLEdBQUdBLFFBQVE7TUFDMUIsTUFBTXBELFdBQVcsR0FBR3NDLElBQUksQ0FBQ2lCLDhCQUE4QixDQUFDUixNQUFNLENBQUM7TUFDL0RGLGNBQWMsQ0FBQzdDLFdBQVcsQ0FBQztJQUMvQixDQUFDO0lBRURtRCxzQkFBc0IsQ0FBQyxDQUFDO0VBQzVCLENBQUMsRUFBRSxDQUFDYixJQUFJLEVBQUUvQixZQUFZLENBQUMsQ0FBQztFQUV4QixNQUFNO0lBQUVjLFNBQVM7SUFBRVYsb0JBQW9CO0lBQUV5QixhQUFhO0lBQUVUO0VBQW9CLENBQUMsR0FBR1Isa0JBQWtCLENBQzlGbkIsV0FBVyxFQUNYTyxZQUFZLEVBQ1phLGlCQUNKLENBQUM7RUFFRCxJQUFBMEIsZ0JBQVMsRUFBQyxNQUFNO0lBQ1puQixtQkFBbUIsQ0FBQyxDQUFDO0VBQ3pCLENBQUMsRUFBRSxDQUFDQSxtQkFBbUIsQ0FBQyxDQUFDO0VBRXpCLE9BQU87SUFBRU4sU0FBUztJQUFFVixvQkFBb0I7SUFBRXlCO0VBQWMsQ0FBQztBQUM3RCxDQUFDO0FBQUNvQixPQUFBLENBQUFaLGlCQUFBLEdBQUFBLGlCQUFBIiwiaWdub3JlTGlzdCI6W119