UNPKG

matrix-react-sdk

Version:
129 lines (123 loc) 16.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.VoiceBroadcastChunkEvents = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _ = require(".."); /* Copyright 2024 New Vector Ltd. Copyright 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. */ /** * Voice broadcast chunk collection. * Orders chunks by sequence (if available) or timestamp. */ class VoiceBroadcastChunkEvents { constructor() { (0, _defineProperty2.default)(this, "events", []); (0, _defineProperty2.default)(this, "addOrReplaceEvent", event => { this.events = this.events.filter(e => !this.equalByTxnIdOrId(event, e)); this.events.push(event); return true; }); (0, _defineProperty2.default)(this, "compareBySequence", (a, b) => { const aSequence = a.getContent()?.[_.VoiceBroadcastChunkEventType]?.sequence || 0; const bSequence = b.getContent()?.[_.VoiceBroadcastChunkEventType]?.sequence || 0; return aSequence - bSequence; }); (0, _defineProperty2.default)(this, "compareByTimestamp", (a, b) => { return a.getTs() - b.getTs(); }); } getEvents() { return [...this.events]; } getNext(event) { return this.events[this.events.indexOf(event) + 1]; } addEvent(event) { if (this.addOrReplaceEvent(event)) { this.sort(); } } addEvents(events) { const atLeastOneNew = events.reduce((newSoFar, event) => { return this.addOrReplaceEvent(event) || newSoFar; }, false); if (atLeastOneNew) { this.sort(); } } includes(event) { return !!this.events.find(e => this.equalByTxnIdOrId(event, e)); } /** * @returns {number} Length in milliseconds */ getLength() { return this.events.reduce((length, event) => { return length + this.calculateChunkLength(event); }, 0); } getLengthSeconds() { return this.getLength() / 1000; } /** * Returns the accumulated length to (excl.) a chunk event. */ getLengthTo(event) { let length = 0; for (let i = 0; i < this.events.indexOf(event); i++) { length += this.calculateChunkLength(this.events[i]); } return length; } findByTime(time) { let lengthSoFar = 0; for (let i = 0; i < this.events.length; i++) { lengthSoFar += this.calculateChunkLength(this.events[i]); if (lengthSoFar >= time) { return this.events[i]; } } return null; } isLast(event) { return this.events.indexOf(event) >= this.events.length - 1; } getSequenceForEvent(event) { const sequence = parseInt(event.getContent()?.[_.VoiceBroadcastChunkEventType]?.sequence, 10); if (!isNaN(sequence)) return sequence; if (this.events.includes(event)) return this.events.indexOf(event) + 1; return null; } getNumberOfEvents() { return this.events.length; } calculateChunkLength(event) { return event.getContent()?.["org.matrix.msc1767.audio"]?.duration || event.getContent()?.info?.duration || 0; } equalByTxnIdOrId(eventA, eventB) { return eventA.getTxnId() && eventB.getTxnId() && eventA.getTxnId() === eventB.getTxnId() || eventA.getId() === eventB.getId(); } /** * Sort by sequence, if available for all events. * Else fall back to timestamp. */ sort() { const compareFn = this.allHaveSequence() ? this.compareBySequence : this.compareByTimestamp; this.events.sort(compareFn); } allHaveSequence() { return !this.events.some(event => { const sequence = event.getContent()?.[_.VoiceBroadcastChunkEventType]?.sequence; return parseInt(sequence, 10) !== sequence; }); } } exports.VoiceBroadcastChunkEvents = VoiceBroadcastChunkEvents; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfIiwicmVxdWlyZSIsIlZvaWNlQnJvYWRjYXN0Q2h1bmtFdmVudHMiLCJjb25zdHJ1Y3RvciIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwiZXZlbnQiLCJldmVudHMiLCJmaWx0ZXIiLCJlIiwiZXF1YWxCeVR4bklkT3JJZCIsInB1c2giLCJhIiwiYiIsImFTZXF1ZW5jZSIsImdldENvbnRlbnQiLCJWb2ljZUJyb2FkY2FzdENodW5rRXZlbnRUeXBlIiwic2VxdWVuY2UiLCJiU2VxdWVuY2UiLCJnZXRUcyIsImdldEV2ZW50cyIsImdldE5leHQiLCJpbmRleE9mIiwiYWRkRXZlbnQiLCJhZGRPclJlcGxhY2VFdmVudCIsInNvcnQiLCJhZGRFdmVudHMiLCJhdExlYXN0T25lTmV3IiwicmVkdWNlIiwibmV3U29GYXIiLCJpbmNsdWRlcyIsImZpbmQiLCJnZXRMZW5ndGgiLCJsZW5ndGgiLCJjYWxjdWxhdGVDaHVua0xlbmd0aCIsImdldExlbmd0aFNlY29uZHMiLCJnZXRMZW5ndGhUbyIsImkiLCJmaW5kQnlUaW1lIiwidGltZSIsImxlbmd0aFNvRmFyIiwiaXNMYXN0IiwiZ2V0U2VxdWVuY2VGb3JFdmVudCIsInBhcnNlSW50IiwiaXNOYU4iLCJnZXROdW1iZXJPZkV2ZW50cyIsImR1cmF0aW9uIiwiaW5mbyIsImV2ZW50QSIsImV2ZW50QiIsImdldFR4bklkIiwiZ2V0SWQiLCJjb21wYXJlRm4iLCJhbGxIYXZlU2VxdWVuY2UiLCJjb21wYXJlQnlTZXF1ZW5jZSIsImNvbXBhcmVCeVRpbWVzdGFtcCIsInNvbWUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3ZvaWNlLWJyb2FkY2FzdC91dGlscy9Wb2ljZUJyb2FkY2FzdENodW5rRXZlbnRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIyIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCB7IE1hdHJpeEV2ZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuXG5pbXBvcnQgeyBWb2ljZUJyb2FkY2FzdENodW5rRXZlbnRUeXBlIH0gZnJvbSBcIi4uXCI7XG5cbi8qKlxuICogVm9pY2UgYnJvYWRjYXN0IGNodW5rIGNvbGxlY3Rpb24uXG4gKiBPcmRlcnMgY2h1bmtzIGJ5IHNlcXVlbmNlIChpZiBhdmFpbGFibGUpIG9yIHRpbWVzdGFtcC5cbiAqL1xuZXhwb3J0IGNsYXNzIFZvaWNlQnJvYWRjYXN0Q2h1bmtFdmVudHMge1xuICAgIHByaXZhdGUgZXZlbnRzOiBNYXRyaXhFdmVudFtdID0gW107XG5cbiAgICBwdWJsaWMgZ2V0RXZlbnRzKCk6IE1hdHJpeEV2ZW50W10ge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuZXZlbnRzXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TmV4dChldmVudDogTWF0cml4RXZlbnQpOiBNYXRyaXhFdmVudCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2ZW50c1t0aGlzLmV2ZW50cy5pbmRleE9mKGV2ZW50KSArIDFdO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRFdmVudChldmVudDogTWF0cml4RXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuYWRkT3JSZXBsYWNlRXZlbnQoZXZlbnQpKSB7XG4gICAgICAgICAgICB0aGlzLnNvcnQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGRFdmVudHMoZXZlbnRzOiBNYXRyaXhFdmVudFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGF0TGVhc3RPbmVOZXcgPSBldmVudHMucmVkdWNlKChuZXdTb0ZhcjogYm9vbGVhbiwgZXZlbnQ6IE1hdHJpeEV2ZW50KTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hZGRPclJlcGxhY2VFdmVudChldmVudCkgfHwgbmV3U29GYXI7XG4gICAgICAgIH0sIGZhbHNlKTtcblxuICAgICAgICBpZiAoYXRMZWFzdE9uZU5ldykge1xuICAgICAgICAgICAgdGhpcy5zb3J0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaW5jbHVkZXMoZXZlbnQ6IE1hdHJpeEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZXZlbnRzLmZpbmQoKGUpID0+IHRoaXMuZXF1YWxCeVR4bklkT3JJZChldmVudCwgZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IExlbmd0aCBpbiBtaWxsaXNlY29uZHNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2ZW50cy5yZWR1Y2UoKGxlbmd0aDogbnVtYmVyLCBldmVudDogTWF0cml4RXZlbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBsZW5ndGggKyB0aGlzLmNhbGN1bGF0ZUNodW5rTGVuZ3RoKGV2ZW50KTtcbiAgICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldExlbmd0aFNlY29uZHMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGVuZ3RoKCkgLyAxMDAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIGxlbmd0aCB0byAoZXhjbC4pIGEgY2h1bmsgZXZlbnQuXG4gICAgICovXG4gICAgcHVibGljIGdldExlbmd0aFRvKGV2ZW50OiBNYXRyaXhFdmVudCk6IG51bWJlciB7XG4gICAgICAgIGxldCBsZW5ndGggPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ldmVudHMuaW5kZXhPZihldmVudCk7IGkrKykge1xuICAgICAgICAgICAgbGVuZ3RoICs9IHRoaXMuY2FsY3VsYXRlQ2h1bmtMZW5ndGgodGhpcy5ldmVudHNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluZEJ5VGltZSh0aW1lOiBudW1iZXIpOiBNYXRyaXhFdmVudCB8IG51bGwge1xuICAgICAgICBsZXQgbGVuZ3RoU29GYXIgPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ldmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxlbmd0aFNvRmFyICs9IHRoaXMuY2FsY3VsYXRlQ2h1bmtMZW5ndGgodGhpcy5ldmVudHNbaV0pO1xuXG4gICAgICAgICAgICBpZiAobGVuZ3RoU29GYXIgPj0gdGltZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmV2ZW50c1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0xhc3QoZXZlbnQ6IE1hdHJpeEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2ZW50cy5pbmRleE9mKGV2ZW50KSA+PSB0aGlzLmV2ZW50cy5sZW5ndGggLSAxO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTZXF1ZW5jZUZvckV2ZW50KGV2ZW50OiBNYXRyaXhFdmVudCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBjb25zdCBzZXF1ZW5jZSA9IHBhcnNlSW50KGV2ZW50LmdldENvbnRlbnQoKT8uW1ZvaWNlQnJvYWRjYXN0Q2h1bmtFdmVudFR5cGVdPy5zZXF1ZW5jZSwgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKHNlcXVlbmNlKSkgcmV0dXJuIHNlcXVlbmNlO1xuXG4gICAgICAgIGlmICh0aGlzLmV2ZW50cy5pbmNsdWRlcyhldmVudCkpIHJldHVybiB0aGlzLmV2ZW50cy5pbmRleE9mKGV2ZW50KSArIDE7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE51bWJlck9mRXZlbnRzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2ZW50cy5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVDaHVua0xlbmd0aChldmVudDogTWF0cml4RXZlbnQpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gZXZlbnQuZ2V0Q29udGVudCgpPy5bXCJvcmcubWF0cml4Lm1zYzE3NjcuYXVkaW9cIl0/LmR1cmF0aW9uIHx8IGV2ZW50LmdldENvbnRlbnQoKT8uaW5mbz8uZHVyYXRpb24gfHwgMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZE9yUmVwbGFjZUV2ZW50ID0gKGV2ZW50OiBNYXRyaXhFdmVudCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICB0aGlzLmV2ZW50cyA9IHRoaXMuZXZlbnRzLmZpbHRlcigoZSkgPT4gIXRoaXMuZXF1YWxCeVR4bklkT3JJZChldmVudCwgZSkpO1xuICAgICAgICB0aGlzLmV2ZW50cy5wdXNoKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIHByaXZhdGUgZXF1YWxCeVR4bklkT3JJZChldmVudEE6IE1hdHJpeEV2ZW50LCBldmVudEI6IE1hdHJpeEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoZXZlbnRBLmdldFR4bklkKCkgJiYgZXZlbnRCLmdldFR4bklkKCkgJiYgZXZlbnRBLmdldFR4bklkKCkgPT09IGV2ZW50Qi5nZXRUeG5JZCgpKSB8fFxuICAgICAgICAgICAgZXZlbnRBLmdldElkKCkgPT09IGV2ZW50Qi5nZXRJZCgpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU29ydCBieSBzZXF1ZW5jZSwgaWYgYXZhaWxhYmxlIGZvciBhbGwgZXZlbnRzLlxuICAgICAqIEVsc2UgZmFsbCBiYWNrIHRvIHRpbWVzdGFtcC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNvcnQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbXBhcmVGbiA9IHRoaXMuYWxsSGF2ZVNlcXVlbmNlKCkgPyB0aGlzLmNvbXBhcmVCeVNlcXVlbmNlIDogdGhpcy5jb21wYXJlQnlUaW1lc3RhbXA7XG4gICAgICAgIHRoaXMuZXZlbnRzLnNvcnQoY29tcGFyZUZuKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXBhcmVCeVNlcXVlbmNlID0gKGE6IE1hdHJpeEV2ZW50LCBiOiBNYXRyaXhFdmVudCk6IG51bWJlciA9PiB7XG4gICAgICAgIGNvbnN0IGFTZXF1ZW5jZSA9IGEuZ2V0Q29udGVudCgpPy5bVm9pY2VCcm9hZGNhc3RDaHVua0V2ZW50VHlwZV0/LnNlcXVlbmNlIHx8IDA7XG4gICAgICAgIGNvbnN0IGJTZXF1ZW5jZSA9IGIuZ2V0Q29udGVudCgpPy5bVm9pY2VCcm9hZGNhc3RDaHVua0V2ZW50VHlwZV0/LnNlcXVlbmNlIHx8IDA7XG4gICAgICAgIHJldHVybiBhU2VxdWVuY2UgLSBiU2VxdWVuY2U7XG4gICAgfTtcblxuICAgIHByaXZhdGUgY29tcGFyZUJ5VGltZXN0YW1wID0gKGE6IE1hdHJpeEV2ZW50LCBiOiBNYXRyaXhFdmVudCk6IG51bWJlciA9PiB7XG4gICAgICAgIHJldHVybiBhLmdldFRzKCkgLSBiLmdldFRzKCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgYWxsSGF2ZVNlcXVlbmNlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuZXZlbnRzLnNvbWUoKGV2ZW50OiBNYXRyaXhFdmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VxdWVuY2UgPSBldmVudC5nZXRDb250ZW50KCk/LltWb2ljZUJyb2FkY2FzdENodW5rRXZlbnRUeXBlXT8uc2VxdWVuY2U7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoc2VxdWVuY2UsIDEwKSAhPT0gc2VxdWVuY2U7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFVQSxJQUFBQSxDQUFBLEdBQUFDLE9BQUE7QUFWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLE1BQU1DLHlCQUF5QixDQUFDO0VBQUFDLFlBQUE7SUFBQSxJQUFBQyxnQkFBQSxDQUFBQyxPQUFBLGtCQUNILEVBQUU7SUFBQSxJQUFBRCxnQkFBQSxDQUFBQyxPQUFBLDZCQTJGTEMsS0FBa0IsSUFBYztNQUN6RCxJQUFJLENBQUNDLE1BQU0sR0FBRyxJQUFJLENBQUNBLE1BQU0sQ0FBQ0MsTUFBTSxDQUFFQyxDQUFDLElBQUssQ0FBQyxJQUFJLENBQUNDLGdCQUFnQixDQUFDSixLQUFLLEVBQUVHLENBQUMsQ0FBQyxDQUFDO01BQ3pFLElBQUksQ0FBQ0YsTUFBTSxDQUFDSSxJQUFJLENBQUNMLEtBQUssQ0FBQztNQUN2QixPQUFPLElBQUk7SUFDZixDQUFDO0lBQUEsSUFBQUYsZ0JBQUEsQ0FBQUMsT0FBQSw2QkFrQjJCLENBQUNPLENBQWMsRUFBRUMsQ0FBYyxLQUFhO01BQ3BFLE1BQU1DLFNBQVMsR0FBR0YsQ0FBQyxDQUFDRyxVQUFVLENBQUMsQ0FBQyxHQUFHQyw4QkFBNEIsQ0FBQyxFQUFFQyxRQUFRLElBQUksQ0FBQztNQUMvRSxNQUFNQyxTQUFTLEdBQUdMLENBQUMsQ0FBQ0UsVUFBVSxDQUFDLENBQUMsR0FBR0MsOEJBQTRCLENBQUMsRUFBRUMsUUFBUSxJQUFJLENBQUM7TUFDL0UsT0FBT0gsU0FBUyxHQUFHSSxTQUFTO0lBQ2hDLENBQUM7SUFBQSxJQUFBZCxnQkFBQSxDQUFBQyxPQUFBLDhCQUU0QixDQUFDTyxDQUFjLEVBQUVDLENBQWMsS0FBYTtNQUNyRSxPQUFPRCxDQUFDLENBQUNPLEtBQUssQ0FBQyxDQUFDLEdBQUdOLENBQUMsQ0FBQ00sS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztFQUFBO0VBdkhNQyxTQUFTQSxDQUFBLEVBQWtCO0lBQzlCLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQ2IsTUFBTSxDQUFDO0VBQzNCO0VBRU9jLE9BQU9BLENBQUNmLEtBQWtCLEVBQTJCO0lBQ3hELE9BQU8sSUFBSSxDQUFDQyxNQUFNLENBQUMsSUFBSSxDQUFDQSxNQUFNLENBQUNlLE9BQU8sQ0FBQ2hCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUN0RDtFQUVPaUIsUUFBUUEsQ0FBQ2pCLEtBQWtCLEVBQVE7SUFDdEMsSUFBSSxJQUFJLENBQUNrQixpQkFBaUIsQ0FBQ2xCLEtBQUssQ0FBQyxFQUFFO01BQy9CLElBQUksQ0FBQ21CLElBQUksQ0FBQyxDQUFDO0lBQ2Y7RUFDSjtFQUVPQyxTQUFTQSxDQUFDbkIsTUFBcUIsRUFBUTtJQUMxQyxNQUFNb0IsYUFBYSxHQUFHcEIsTUFBTSxDQUFDcUIsTUFBTSxDQUFDLENBQUNDLFFBQWlCLEVBQUV2QixLQUFrQixLQUFjO01BQ3BGLE9BQU8sSUFBSSxDQUFDa0IsaUJBQWlCLENBQUNsQixLQUFLLENBQUMsSUFBSXVCLFFBQVE7SUFDcEQsQ0FBQyxFQUFFLEtBQUssQ0FBQztJQUVULElBQUlGLGFBQWEsRUFBRTtNQUNmLElBQUksQ0FBQ0YsSUFBSSxDQUFDLENBQUM7SUFDZjtFQUNKO0VBRU9LLFFBQVFBLENBQUN4QixLQUFrQixFQUFXO0lBQ3pDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQ0MsTUFBTSxDQUFDd0IsSUFBSSxDQUFFdEIsQ0FBQyxJQUFLLElBQUksQ0FBQ0MsZ0JBQWdCLENBQUNKLEtBQUssRUFBRUcsQ0FBQyxDQUFDLENBQUM7RUFDckU7O0VBRUE7QUFDSjtBQUNBO0VBQ1d1QixTQUFTQSxDQUFBLEVBQVc7SUFDdkIsT0FBTyxJQUFJLENBQUN6QixNQUFNLENBQUNxQixNQUFNLENBQUMsQ0FBQ0ssTUFBYyxFQUFFM0IsS0FBa0IsS0FBSztNQUM5RCxPQUFPMkIsTUFBTSxHQUFHLElBQUksQ0FBQ0Msb0JBQW9CLENBQUM1QixLQUFLLENBQUM7SUFDcEQsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNUO0VBRU82QixnQkFBZ0JBLENBQUEsRUFBVztJQUM5QixPQUFPLElBQUksQ0FBQ0gsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJO0VBQ2xDOztFQUVBO0FBQ0o7QUFDQTtFQUNXSSxXQUFXQSxDQUFDOUIsS0FBa0IsRUFBVTtJQUMzQyxJQUFJMkIsTUFBTSxHQUFHLENBQUM7SUFFZCxLQUFLLElBQUlJLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRyxJQUFJLENBQUM5QixNQUFNLENBQUNlLE9BQU8sQ0FBQ2hCLEtBQUssQ0FBQyxFQUFFK0IsQ0FBQyxFQUFFLEVBQUU7TUFDakRKLE1BQU0sSUFBSSxJQUFJLENBQUNDLG9CQUFvQixDQUFDLElBQUksQ0FBQzNCLE1BQU0sQ0FBQzhCLENBQUMsQ0FBQyxDQUFDO0lBQ3ZEO0lBRUEsT0FBT0osTUFBTTtFQUNqQjtFQUVPSyxVQUFVQSxDQUFDQyxJQUFZLEVBQXNCO0lBQ2hELElBQUlDLFdBQVcsR0FBRyxDQUFDO0lBRW5CLEtBQUssSUFBSUgsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHLElBQUksQ0FBQzlCLE1BQU0sQ0FBQzBCLE1BQU0sRUFBRUksQ0FBQyxFQUFFLEVBQUU7TUFDekNHLFdBQVcsSUFBSSxJQUFJLENBQUNOLG9CQUFvQixDQUFDLElBQUksQ0FBQzNCLE1BQU0sQ0FBQzhCLENBQUMsQ0FBQyxDQUFDO01BRXhELElBQUlHLFdBQVcsSUFBSUQsSUFBSSxFQUFFO1FBQ3JCLE9BQU8sSUFBSSxDQUFDaEMsTUFBTSxDQUFDOEIsQ0FBQyxDQUFDO01BQ3pCO0lBQ0o7SUFFQSxPQUFPLElBQUk7RUFDZjtFQUVPSSxNQUFNQSxDQUFDbkMsS0FBa0IsRUFBVztJQUN2QyxPQUFPLElBQUksQ0FBQ0MsTUFBTSxDQUFDZSxPQUFPLENBQUNoQixLQUFLLENBQUMsSUFBSSxJQUFJLENBQUNDLE1BQU0sQ0FBQzBCLE1BQU0sR0FBRyxDQUFDO0VBQy9EO0VBRU9TLG1CQUFtQkEsQ0FBQ3BDLEtBQWtCLEVBQWlCO0lBQzFELE1BQU1XLFFBQVEsR0FBRzBCLFFBQVEsQ0FBQ3JDLEtBQUssQ0FBQ1MsVUFBVSxDQUFDLENBQUMsR0FBR0MsOEJBQTRCLENBQUMsRUFBRUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztJQUMzRixJQUFJLENBQUMyQixLQUFLLENBQUMzQixRQUFRLENBQUMsRUFBRSxPQUFPQSxRQUFRO0lBRXJDLElBQUksSUFBSSxDQUFDVixNQUFNLENBQUN1QixRQUFRLENBQUN4QixLQUFLLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQ0MsTUFBTSxDQUFDZSxPQUFPLENBQUNoQixLQUFLLENBQUMsR0FBRyxDQUFDO0lBRXRFLE9BQU8sSUFBSTtFQUNmO0VBRU91QyxpQkFBaUJBLENBQUEsRUFBVztJQUMvQixPQUFPLElBQUksQ0FBQ3RDLE1BQU0sQ0FBQzBCLE1BQU07RUFDN0I7RUFFUUMsb0JBQW9CQSxDQUFDNUIsS0FBa0IsRUFBVTtJQUNyRCxPQUFPQSxLQUFLLENBQUNTLFVBQVUsQ0FBQyxDQUFDLEdBQUcsMEJBQTBCLENBQUMsRUFBRStCLFFBQVEsSUFBSXhDLEtBQUssQ0FBQ1MsVUFBVSxDQUFDLENBQUMsRUFBRWdDLElBQUksRUFBRUQsUUFBUSxJQUFJLENBQUM7RUFDaEg7RUFRUXBDLGdCQUFnQkEsQ0FBQ3NDLE1BQW1CLEVBQUVDLE1BQW1CLEVBQVc7SUFDeEUsT0FDS0QsTUFBTSxDQUFDRSxRQUFRLENBQUMsQ0FBQyxJQUFJRCxNQUFNLENBQUNDLFFBQVEsQ0FBQyxDQUFDLElBQUlGLE1BQU0sQ0FBQ0UsUUFBUSxDQUFDLENBQUMsS0FBS0QsTUFBTSxDQUFDQyxRQUFRLENBQUMsQ0FBQyxJQUNsRkYsTUFBTSxDQUFDRyxLQUFLLENBQUMsQ0FBQyxLQUFLRixNQUFNLENBQUNFLEtBQUssQ0FBQyxDQUFDO0VBRXpDOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0VBQ1kxQixJQUFJQSxDQUFBLEVBQVM7SUFDakIsTUFBTTJCLFNBQVMsR0FBRyxJQUFJLENBQUNDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDQyxpQkFBaUIsR0FBRyxJQUFJLENBQUNDLGtCQUFrQjtJQUMzRixJQUFJLENBQUNoRCxNQUFNLENBQUNrQixJQUFJLENBQUMyQixTQUFTLENBQUM7RUFDL0I7RUFZUUMsZUFBZUEsQ0FBQSxFQUFZO0lBQy9CLE9BQU8sQ0FBQyxJQUFJLENBQUM5QyxNQUFNLENBQUNpRCxJQUFJLENBQUVsRCxLQUFrQixJQUFLO01BQzdDLE1BQU1XLFFBQVEsR0FBR1gsS0FBSyxDQUFDUyxVQUFVLENBQUMsQ0FBQyxHQUFHQyw4QkFBNEIsQ0FBQyxFQUFFQyxRQUFRO01BQzdFLE9BQU8wQixRQUFRLENBQUMxQixRQUFRLEVBQUUsRUFBRSxDQUFDLEtBQUtBLFFBQVE7SUFDOUMsQ0FBQyxDQUFDO0VBQ047QUFDSjtBQUFDd0MsT0FBQSxDQUFBdkQseUJBQUEsR0FBQUEseUJBQUEiLCJpZ25vcmVMaXN0IjpbXX0=