UNPKG

matrix-react-sdk

Version:
103 lines (100 loc) 14.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.RelationsHelperEvent = exports.RelationsHelper = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _matrix = require("matrix-js-sdk/src/matrix"); /* 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. */ let RelationsHelperEvent = exports.RelationsHelperEvent = /*#__PURE__*/function (RelationsHelperEvent) { RelationsHelperEvent["Add"] = "add"; return RelationsHelperEvent; }({}); /** * Helper class that manages a specific event type relation for an event. * Just create an instance and listen for new events for that relation. * Optionally receive the current events by calling emitCurrent(). * Clean up everything by calling destroy(). */ class RelationsHelper extends _matrix.TypedEventEmitter { constructor(_event, relationType, relationEventType, client) { super(); (0, _defineProperty2.default)(this, "relations", void 0); (0, _defineProperty2.default)(this, "eventId", void 0); (0, _defineProperty2.default)(this, "roomId", void 0); (0, _defineProperty2.default)(this, "setUpRelations", () => { this.setRelations(); if (this.relations) { this.relations.on(_matrix.RelationsEvent.Add, this.onRelationsAdd); } else { this.event.once(_matrix.MatrixEventEvent.RelationsCreated, this.onRelationsCreated); } }); (0, _defineProperty2.default)(this, "onRelationsCreated", () => { this.setRelations(); if (this.relations) { this.relations.on(_matrix.RelationsEvent.Add, this.onRelationsAdd); this.emitCurrent(); } else { this.event.once(_matrix.MatrixEventEvent.RelationsCreated, this.onRelationsCreated); } }); (0, _defineProperty2.default)(this, "onRelationsAdd", event => { this.emit(RelationsHelperEvent.Add, event); }); this.event = _event; this.relationType = relationType; this.relationEventType = relationEventType; this.client = client; const eventId = _event.getId(); if (!eventId) { throw new Error("unable to create RelationsHelper: missing event ID"); } const roomId = _event.getRoomId(); if (!roomId) { throw new Error("unable to create RelationsHelper: missing room ID"); } this.eventId = eventId; this.roomId = roomId; this.setUpRelations(); } setRelations() { const room = this.client.getRoom(this.event.getRoomId()); this.relations = room?.getUnfilteredTimelineSet()?.relations?.getChildEventsForEvent(this.eventId, this.relationType, this.relationEventType); } emitCurrent() { this.relations?.getRelations()?.forEach(e => this.emit(RelationsHelperEvent.Add, e)); } getCurrent() { return this.relations?.getRelations() || []; } /** * Fetches all related events from the server and emits them. */ async emitFetchCurrent() { let nextBatch = undefined; do { const response = await this.client.relations(this.roomId, this.eventId, this.relationType, this.relationEventType, { from: nextBatch, limit: 50 }); nextBatch = response?.nextBatch ?? undefined; response?.events.forEach(e => this.emit(RelationsHelperEvent.Add, e)); } while (nextBatch); } destroy() { this.removeAllListeners(); this.event.off(_matrix.MatrixEventEvent.RelationsCreated, this.onRelationsCreated); if (this.relations) { this.relations.off(_matrix.RelationsEvent.Add, this.onRelationsAdd); } } } exports.RelationsHelper = RelationsHelper; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIlJlbGF0aW9uc0hlbHBlckV2ZW50IiwiZXhwb3J0cyIsIlJlbGF0aW9uc0hlbHBlciIsIlR5cGVkRXZlbnRFbWl0dGVyIiwiY29uc3RydWN0b3IiLCJldmVudCIsInJlbGF0aW9uVHlwZSIsInJlbGF0aW9uRXZlbnRUeXBlIiwiY2xpZW50IiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJzZXRSZWxhdGlvbnMiLCJyZWxhdGlvbnMiLCJvbiIsIlJlbGF0aW9uc0V2ZW50IiwiQWRkIiwib25SZWxhdGlvbnNBZGQiLCJvbmNlIiwiTWF0cml4RXZlbnRFdmVudCIsIlJlbGF0aW9uc0NyZWF0ZWQiLCJvblJlbGF0aW9uc0NyZWF0ZWQiLCJlbWl0Q3VycmVudCIsImVtaXQiLCJldmVudElkIiwiZ2V0SWQiLCJFcnJvciIsInJvb21JZCIsImdldFJvb21JZCIsInNldFVwUmVsYXRpb25zIiwicm9vbSIsImdldFJvb20iLCJnZXRVbmZpbHRlcmVkVGltZWxpbmVTZXQiLCJnZXRDaGlsZEV2ZW50c0ZvckV2ZW50IiwiZ2V0UmVsYXRpb25zIiwiZm9yRWFjaCIsImUiLCJnZXRDdXJyZW50IiwiZW1pdEZldGNoQ3VycmVudCIsIm5leHRCYXRjaCIsInVuZGVmaW5lZCIsInJlc3BvbnNlIiwiZnJvbSIsImxpbWl0IiwiZXZlbnRzIiwiZGVzdHJveSIsInJlbW92ZUFsbExpc3RlbmVycyIsIm9mZiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ldmVudHMvUmVsYXRpb25zSGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIyIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCB7XG4gICAgTWF0cml4Q2xpZW50LFxuICAgIE1hdHJpeEV2ZW50LFxuICAgIE1hdHJpeEV2ZW50RXZlbnQsXG4gICAgUmVsYXRpb25UeXBlLFxuICAgIFR5cGVkRXZlbnRFbWl0dGVyLFxuICAgIFJlbGF0aW9ucyxcbiAgICBSZWxhdGlvbnNFdmVudCxcbn0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuXG5pbXBvcnQgeyBJRGVzdHJveWFibGUgfSBmcm9tIFwiLi4vdXRpbHMvSURlc3Ryb3lhYmxlXCI7XG5cbmV4cG9ydCBlbnVtIFJlbGF0aW9uc0hlbHBlckV2ZW50IHtcbiAgICBBZGQgPSBcImFkZFwiLFxufVxuXG5pbnRlcmZhY2UgRXZlbnRNYXAge1xuICAgIFtSZWxhdGlvbnNIZWxwZXJFdmVudC5BZGRdOiAoZXZlbnQ6IE1hdHJpeEV2ZW50KSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIEhlbHBlciBjbGFzcyB0aGF0IG1hbmFnZXMgYSBzcGVjaWZpYyBldmVudCB0eXBlIHJlbGF0aW9uIGZvciBhbiBldmVudC5cbiAqIEp1c3QgY3JlYXRlIGFuIGluc3RhbmNlIGFuZCBsaXN0ZW4gZm9yIG5ldyBldmVudHMgZm9yIHRoYXQgcmVsYXRpb24uXG4gKiBPcHRpb25hbGx5IHJlY2VpdmUgdGhlIGN1cnJlbnQgZXZlbnRzIGJ5IGNhbGxpbmcgZW1pdEN1cnJlbnQoKS5cbiAqIENsZWFuIHVwIGV2ZXJ5dGhpbmcgYnkgY2FsbGluZyBkZXN0cm95KCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWxhdGlvbnNIZWxwZXIgZXh0ZW5kcyBUeXBlZEV2ZW50RW1pdHRlcjxSZWxhdGlvbnNIZWxwZXJFdmVudCwgRXZlbnRNYXA+IGltcGxlbWVudHMgSURlc3Ryb3lhYmxlIHtcbiAgICBwcml2YXRlIHJlbGF0aW9ucz86IFJlbGF0aW9ucztcbiAgICBwcml2YXRlIGV2ZW50SWQ6IHN0cmluZztcbiAgICBwcml2YXRlIHJvb21JZDogc3RyaW5nO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGV2ZW50OiBNYXRyaXhFdmVudCxcbiAgICAgICAgcHJpdmF0ZSByZWxhdGlvblR5cGU6IFJlbGF0aW9uVHlwZSxcbiAgICAgICAgcHJpdmF0ZSByZWxhdGlvbkV2ZW50VHlwZTogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIGNsaWVudDogTWF0cml4Q2xpZW50LFxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50SWQgPSBldmVudC5nZXRJZCgpO1xuXG4gICAgICAgIGlmICghZXZlbnRJZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5hYmxlIHRvIGNyZWF0ZSBSZWxhdGlvbnNIZWxwZXI6IG1pc3NpbmcgZXZlbnQgSURcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb29tSWQgPSBldmVudC5nZXRSb29tSWQoKTtcblxuICAgICAgICBpZiAoIXJvb21JZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5hYmxlIHRvIGNyZWF0ZSBSZWxhdGlvbnNIZWxwZXI6IG1pc3Npbmcgcm9vbSBJRFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXZlbnRJZCA9IGV2ZW50SWQ7XG4gICAgICAgIHRoaXMucm9vbUlkID0gcm9vbUlkO1xuICAgICAgICB0aGlzLnNldFVwUmVsYXRpb25zKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRVcFJlbGF0aW9ucyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRSZWxhdGlvbnMoKTtcblxuICAgICAgICBpZiAodGhpcy5yZWxhdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMucmVsYXRpb25zLm9uKFJlbGF0aW9uc0V2ZW50LkFkZCwgdGhpcy5vblJlbGF0aW9uc0FkZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50Lm9uY2UoTWF0cml4RXZlbnRFdmVudC5SZWxhdGlvbnNDcmVhdGVkLCB0aGlzLm9uUmVsYXRpb25zQ3JlYXRlZCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvblJlbGF0aW9uc0NyZWF0ZWQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuc2V0UmVsYXRpb25zKCk7XG5cbiAgICAgICAgaWYgKHRoaXMucmVsYXRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLnJlbGF0aW9ucy5vbihSZWxhdGlvbnNFdmVudC5BZGQsIHRoaXMub25SZWxhdGlvbnNBZGQpO1xuICAgICAgICAgICAgdGhpcy5lbWl0Q3VycmVudCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ldmVudC5vbmNlKE1hdHJpeEV2ZW50RXZlbnQuUmVsYXRpb25zQ3JlYXRlZCwgdGhpcy5vblJlbGF0aW9uc0NyZWF0ZWQpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgc2V0UmVsYXRpb25zKCk6IHZvaWQge1xuICAgICAgICBjb25zdCByb29tID0gdGhpcy5jbGllbnQuZ2V0Um9vbSh0aGlzLmV2ZW50LmdldFJvb21JZCgpKTtcbiAgICAgICAgdGhpcy5yZWxhdGlvbnMgPSByb29tXG4gICAgICAgICAgICA/LmdldFVuZmlsdGVyZWRUaW1lbGluZVNldCgpXG4gICAgICAgICAgICA/LnJlbGF0aW9ucz8uZ2V0Q2hpbGRFdmVudHNGb3JFdmVudCh0aGlzLmV2ZW50SWQsIHRoaXMucmVsYXRpb25UeXBlLCB0aGlzLnJlbGF0aW9uRXZlbnRUeXBlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uUmVsYXRpb25zQWRkID0gKGV2ZW50OiBNYXRyaXhFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmVtaXQoUmVsYXRpb25zSGVscGVyRXZlbnQuQWRkLCBldmVudCk7XG4gICAgfTtcblxuICAgIHB1YmxpYyBlbWl0Q3VycmVudCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWxhdGlvbnM/LmdldFJlbGF0aW9ucygpPy5mb3JFYWNoKChlKSA9PiB0aGlzLmVtaXQoUmVsYXRpb25zSGVscGVyRXZlbnQuQWRkLCBlKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1cnJlbnQoKTogTWF0cml4RXZlbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9ucz8uZ2V0UmVsYXRpb25zKCkgfHwgW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBhbGwgcmVsYXRlZCBldmVudHMgZnJvbSB0aGUgc2VydmVyIGFuZCBlbWl0cyB0aGVtLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBlbWl0RmV0Y2hDdXJyZW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgbmV4dEJhdGNoOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5yZWxhdGlvbnMoXG4gICAgICAgICAgICAgICAgdGhpcy5yb29tSWQsXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudElkLFxuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpb25UeXBlLFxuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpb25FdmVudFR5cGUsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBmcm9tOiBuZXh0QmF0Y2gsXG4gICAgICAgICAgICAgICAgICAgIGxpbWl0OiA1MCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG5leHRCYXRjaCA9IHJlc3BvbnNlPy5uZXh0QmF0Y2ggPz8gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmVzcG9uc2U/LmV2ZW50cy5mb3JFYWNoKChlKSA9PiB0aGlzLmVtaXQoUmVsYXRpb25zSGVscGVyRXZlbnQuQWRkLCBlKSk7XG4gICAgICAgIH0gd2hpbGUgKG5leHRCYXRjaCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMuZXZlbnQub2ZmKE1hdHJpeEV2ZW50RXZlbnQuUmVsYXRpb25zQ3JlYXRlZCwgdGhpcy5vblJlbGF0aW9uc0NyZWF0ZWQpO1xuXG4gICAgICAgIGlmICh0aGlzLnJlbGF0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5yZWxhdGlvbnMub2ZmKFJlbGF0aW9uc0V2ZW50LkFkZCwgdGhpcy5vblJlbGF0aW9uc0FkZCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQSxJQW9CWUMsb0JBQW9CLEdBQUFDLE9BQUEsQ0FBQUQsb0JBQUEsMEJBQXBCQSxvQkFBb0I7RUFBcEJBLG9CQUFvQjtFQUFBLE9BQXBCQSxvQkFBb0I7QUFBQTtBQVFoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxNQUFNRSxlQUFlLFNBQVNDLHlCQUFpQixDQUF5RDtFQUtwR0MsV0FBV0EsQ0FDTkMsTUFBa0IsRUFDbEJDLFlBQTBCLEVBQzFCQyxpQkFBeUIsRUFDekJDLE1BQW9CLEVBQzlCO0lBQ0UsS0FBSyxDQUFDLENBQUM7SUFBQyxJQUFBQyxnQkFBQSxDQUFBQyxPQUFBO0lBQUEsSUFBQUQsZ0JBQUEsQ0FBQUMsT0FBQTtJQUFBLElBQUFELGdCQUFBLENBQUFDLE9BQUE7SUFBQSxJQUFBRCxnQkFBQSxDQUFBQyxPQUFBLDBCQW1CYSxNQUFZO01BQ2pDLElBQUksQ0FBQ0MsWUFBWSxDQUFDLENBQUM7TUFFbkIsSUFBSSxJQUFJLENBQUNDLFNBQVMsRUFBRTtRQUNoQixJQUFJLENBQUNBLFNBQVMsQ0FBQ0MsRUFBRSxDQUFDQyxzQkFBYyxDQUFDQyxHQUFHLEVBQUUsSUFBSSxDQUFDQyxjQUFjLENBQUM7TUFDOUQsQ0FBQyxNQUFNO1FBQ0gsSUFBSSxDQUFDWCxLQUFLLENBQUNZLElBQUksQ0FBQ0Msd0JBQWdCLENBQUNDLGdCQUFnQixFQUFFLElBQUksQ0FBQ0Msa0JBQWtCLENBQUM7TUFDL0U7SUFDSixDQUFDO0lBQUEsSUFBQVgsZ0JBQUEsQ0FBQUMsT0FBQSw4QkFFNEIsTUFBWTtNQUNyQyxJQUFJLENBQUNDLFlBQVksQ0FBQyxDQUFDO01BRW5CLElBQUksSUFBSSxDQUFDQyxTQUFTLEVBQUU7UUFDaEIsSUFBSSxDQUFDQSxTQUFTLENBQUNDLEVBQUUsQ0FBQ0Msc0JBQWMsQ0FBQ0MsR0FBRyxFQUFFLElBQUksQ0FBQ0MsY0FBYyxDQUFDO1FBQzFELElBQUksQ0FBQ0ssV0FBVyxDQUFDLENBQUM7TUFDdEIsQ0FBQyxNQUFNO1FBQ0gsSUFBSSxDQUFDaEIsS0FBSyxDQUFDWSxJQUFJLENBQUNDLHdCQUFnQixDQUFDQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUNDLGtCQUFrQixDQUFDO01BQy9FO0lBQ0osQ0FBQztJQUFBLElBQUFYLGdCQUFBLENBQUFDLE9BQUEsMEJBU3lCTCxLQUFrQixJQUFXO01BQ25ELElBQUksQ0FBQ2lCLElBQUksQ0FBQ3RCLG9CQUFvQixDQUFDZSxHQUFHLEVBQUVWLEtBQUssQ0FBQztJQUM5QyxDQUFDO0lBQUEsS0F0RFdBLEtBQWtCLEdBQWxCQSxNQUFrQjtJQUFBLEtBQ2xCQyxZQUEwQixHQUExQkEsWUFBMEI7SUFBQSxLQUMxQkMsaUJBQXlCLEdBQXpCQSxpQkFBeUI7SUFBQSxLQUN6QkMsTUFBb0IsR0FBcEJBLE1BQW9CO0lBSTVCLE1BQU1lLE9BQU8sR0FBR2xCLE1BQUssQ0FBQ21CLEtBQUssQ0FBQyxDQUFDO0lBRTdCLElBQUksQ0FBQ0QsT0FBTyxFQUFFO01BQ1YsTUFBTSxJQUFJRSxLQUFLLENBQUMsb0RBQW9ELENBQUM7SUFDekU7SUFFQSxNQUFNQyxNQUFNLEdBQUdyQixNQUFLLENBQUNzQixTQUFTLENBQUMsQ0FBQztJQUVoQyxJQUFJLENBQUNELE1BQU0sRUFBRTtNQUNULE1BQU0sSUFBSUQsS0FBSyxDQUFDLG1EQUFtRCxDQUFDO0lBQ3hFO0lBRUEsSUFBSSxDQUFDRixPQUFPLEdBQUdBLE9BQU87SUFDdEIsSUFBSSxDQUFDRyxNQUFNLEdBQUdBLE1BQU07SUFDcEIsSUFBSSxDQUFDRSxjQUFjLENBQUMsQ0FBQztFQUN6QjtFQXVCUWpCLFlBQVlBLENBQUEsRUFBUztJQUN6QixNQUFNa0IsSUFBSSxHQUFHLElBQUksQ0FBQ3JCLE1BQU0sQ0FBQ3NCLE9BQU8sQ0FBQyxJQUFJLENBQUN6QixLQUFLLENBQUNzQixTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3hELElBQUksQ0FBQ2YsU0FBUyxHQUFHaUIsSUFBSSxFQUNmRSx3QkFBd0IsQ0FBQyxDQUFDLEVBQzFCbkIsU0FBUyxFQUFFb0Isc0JBQXNCLENBQUMsSUFBSSxDQUFDVCxPQUFPLEVBQUUsSUFBSSxDQUFDakIsWUFBWSxFQUFFLElBQUksQ0FBQ0MsaUJBQWlCLENBQUM7RUFDcEc7RUFNT2MsV0FBV0EsQ0FBQSxFQUFTO0lBQ3ZCLElBQUksQ0FBQ1QsU0FBUyxFQUFFcUIsWUFBWSxDQUFDLENBQUMsRUFBRUMsT0FBTyxDQUFFQyxDQUFDLElBQUssSUFBSSxDQUFDYixJQUFJLENBQUN0QixvQkFBb0IsQ0FBQ2UsR0FBRyxFQUFFb0IsQ0FBQyxDQUFDLENBQUM7RUFDMUY7RUFFT0MsVUFBVUEsQ0FBQSxFQUFrQjtJQUMvQixPQUFPLElBQUksQ0FBQ3hCLFNBQVMsRUFBRXFCLFlBQVksQ0FBQyxDQUFDLElBQUksRUFBRTtFQUMvQzs7RUFFQTtBQUNKO0FBQ0E7RUFDSSxNQUFhSSxnQkFBZ0JBLENBQUEsRUFBa0I7SUFDM0MsSUFBSUMsU0FBNkIsR0FBR0MsU0FBUztJQUU3QyxHQUFHO01BQ0MsTUFBTUMsUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDaEMsTUFBTSxDQUFDSSxTQUFTLENBQ3hDLElBQUksQ0FBQ2MsTUFBTSxFQUNYLElBQUksQ0FBQ0gsT0FBTyxFQUNaLElBQUksQ0FBQ2pCLFlBQVksRUFDakIsSUFBSSxDQUFDQyxpQkFBaUIsRUFDdEI7UUFDSWtDLElBQUksRUFBRUgsU0FBUztRQUNmSSxLQUFLLEVBQUU7TUFDWCxDQUNKLENBQUM7TUFDREosU0FBUyxHQUFHRSxRQUFRLEVBQUVGLFNBQVMsSUFBSUMsU0FBUztNQUM1Q0MsUUFBUSxFQUFFRyxNQUFNLENBQUNULE9BQU8sQ0FBRUMsQ0FBQyxJQUFLLElBQUksQ0FBQ2IsSUFBSSxDQUFDdEIsb0JBQW9CLENBQUNlLEdBQUcsRUFBRW9CLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUMsUUFBUUcsU0FBUztFQUN0QjtFQUVPTSxPQUFPQSxDQUFBLEVBQVM7SUFDbkIsSUFBSSxDQUFDQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3pCLElBQUksQ0FBQ3hDLEtBQUssQ0FBQ3lDLEdBQUcsQ0FBQzVCLHdCQUFnQixDQUFDQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUNDLGtCQUFrQixDQUFDO0lBRTFFLElBQUksSUFBSSxDQUFDUixTQUFTLEVBQUU7TUFDaEIsSUFBSSxDQUFDQSxTQUFTLENBQUNrQyxHQUFHLENBQUNoQyxzQkFBYyxDQUFDQyxHQUFHLEVBQUUsSUFBSSxDQUFDQyxjQUFjLENBQUM7SUFDL0Q7RUFDSjtBQUNKO0FBQUNmLE9BQUEsQ0FBQUMsZUFBQSxHQUFBQSxlQUFBIiwiaWdub3JlTGlzdCI6W119