UNPKG

matrix-react-sdk

Version:
131 lines (127 loc) 22.7 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 _logger = require("matrix-js-sdk/src/logger"); var _Exporter = _interopRequireDefault(require("./Exporter")); var _languageHandler = require("../../languageHandler"); var _TextForEvent = require("../../TextForEvent"); var _EventTileFactory = require("../../events/EventTileFactory"); var _SettingsStore = _interopRequireDefault(require("../../settings/SettingsStore")); var _DateUtils = require("../../DateUtils"); /* 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 PlainTextExporter extends _Exporter.default { constructor(room, exportType, exportOptions, setProgressText) { super(room, exportType, exportOptions, setProgressText); (0, _defineProperty2.default)(this, "totalSize", void 0); (0, _defineProperty2.default)(this, "mediaOmitText", void 0); (0, _defineProperty2.default)(this, "textForReplyEvent", content => { const REPLY_REGEX = /> <(.*?)>(.*?)\n\n(.*)/s; const REPLY_SOURCE_MAX_LENGTH = 32; const match = REPLY_REGEX.exec(content.body); // if the reply format is invalid, then return the body if (!match) return content.body; let rplSource; const rplName = match[1]; const rplText = match[3]; rplSource = match[2].substring(1); // Get the first non-blank line from the source. const lines = rplSource.split("\n").filter(line => !/^\s*$/.test(line)); if (lines.length > 0) { // Cut to a maximum length. rplSource = lines[0].substring(0, REPLY_SOURCE_MAX_LENGTH); // Ellipsis if needed. if (lines[0].length > REPLY_SOURCE_MAX_LENGTH) { rplSource = rplSource + "..."; } // Wrap in formatting rplSource = ` "${rplSource}"`; } else { // Don't show a source because we couldn't format one. rplSource = ""; } return `<${rplName}${rplSource}> ${rplText}`; }); (0, _defineProperty2.default)(this, "plainTextForEvent", async mxEv => { const senderDisplayName = mxEv.sender && mxEv.sender.name ? mxEv.sender.name : mxEv.getSender(); let mediaText = ""; if (this.isAttachment(mxEv)) { if (this.exportOptions.attachmentsIncluded) { try { const blob = await this.getMediaBlob(mxEv); if (this.totalSize + blob.size > this.exportOptions.maxSize) { mediaText = ` (${this.mediaOmitText})`; } else { this.totalSize += blob.size; const filePath = this.getFilePath(mxEv); mediaText = " (" + (0, _languageHandler._t)("export_chat|file_attached") + ")"; this.addFile(filePath, blob); if (this.totalSize == this.exportOptions.maxSize) { this.exportOptions.attachmentsIncluded = false; } } } catch (error) { mediaText = " (" + (0, _languageHandler._t)("export_chat|error_fetching_file") + ")"; _logger.logger.log("Error fetching file " + error); } } else mediaText = ` (${this.mediaOmitText})`; } if (this.isReply(mxEv)) return senderDisplayName + ": " + this.textForReplyEvent(mxEv.getContent()) + mediaText;else return (0, _TextForEvent.textForEvent)(mxEv, this.room.client) + mediaText; }); this.totalSize = 0; this.mediaOmitText = !this.exportOptions.attachmentsIncluded ? (0, _languageHandler._t)("export_chat|media_omitted") : (0, _languageHandler._t)("export_chat|media_omitted_file_size"); } get destinationFileName() { return this.makeFileNameNoExtension() + ".txt"; } async createOutput(events) { let content = ""; for (let i = 0; i < events.length; i++) { const event = events[i]; this.updateProgress((0, _languageHandler._t)("export_chat|processing_event_n", { number: i + 1, total: events.length }), false, true); if (this.cancelled) return this.cleanUp(); if (!(0, _EventTileFactory.haveRendererForEvent)(event, this.room.client, false)) continue; const textForEvent = await this.plainTextForEvent(event); content += textForEvent && `${(0, _DateUtils.formatFullDate)(new Date(event.getTs()), _SettingsStore.default.getValue("showTwelveHourTimestamps"))} - ${textForEvent}\n`; } return content; } async export() { this.updateProgress((0, _languageHandler._t)("export_chat|starting_export")); this.updateProgress((0, _languageHandler._t)("export_chat|fetching_events")); const fetchStart = performance.now(); const res = await this.getRequiredEvents(); const fetchEnd = performance.now(); _logger.logger.log(`Fetched ${res.length} events in ${(fetchEnd - fetchStart) / 1000}s`); this.updateProgress((0, _languageHandler._t)("export_chat|creating_output")); const text = await this.createOutput(res); if (this.files.length) { this.addFile("export.txt", new Blob([text])); await this.downloadZIP(); } else { const fileName = this.destinationFileName; this.downloadPlainText(fileName, text); } const exportEnd = performance.now(); if (this.cancelled) { _logger.logger.info("Export cancelled successfully"); } else { _logger.logger.info("Export successful!"); _logger.logger.log(`Exported ${res.length} events in ${(exportEnd - fetchStart) / 1000} seconds`); } this.cleanUp(); } } exports.default = PlainTextExporter; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwicmVxdWlyZSIsIl9FeHBvcnRlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX1RleHRGb3JFdmVudCIsIl9FdmVudFRpbGVGYWN0b3J5IiwiX1NldHRpbmdzU3RvcmUiLCJfRGF0ZVV0aWxzIiwiUGxhaW5UZXh0RXhwb3J0ZXIiLCJFeHBvcnRlciIsImNvbnN0cnVjdG9yIiwicm9vbSIsImV4cG9ydFR5cGUiLCJleHBvcnRPcHRpb25zIiwic2V0UHJvZ3Jlc3NUZXh0IiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJjb250ZW50IiwiUkVQTFlfUkVHRVgiLCJSRVBMWV9TT1VSQ0VfTUFYX0xFTkdUSCIsIm1hdGNoIiwiZXhlYyIsImJvZHkiLCJycGxTb3VyY2UiLCJycGxOYW1lIiwicnBsVGV4dCIsInN1YnN0cmluZyIsImxpbmVzIiwic3BsaXQiLCJmaWx0ZXIiLCJsaW5lIiwidGVzdCIsImxlbmd0aCIsIm14RXYiLCJzZW5kZXJEaXNwbGF5TmFtZSIsInNlbmRlciIsIm5hbWUiLCJnZXRTZW5kZXIiLCJtZWRpYVRleHQiLCJpc0F0dGFjaG1lbnQiLCJhdHRhY2htZW50c0luY2x1ZGVkIiwiYmxvYiIsImdldE1lZGlhQmxvYiIsInRvdGFsU2l6ZSIsInNpemUiLCJtYXhTaXplIiwibWVkaWFPbWl0VGV4dCIsImZpbGVQYXRoIiwiZ2V0RmlsZVBhdGgiLCJfdCIsImFkZEZpbGUiLCJlcnJvciIsImxvZ2dlciIsImxvZyIsImlzUmVwbHkiLCJ0ZXh0Rm9yUmVwbHlFdmVudCIsImdldENvbnRlbnQiLCJ0ZXh0Rm9yRXZlbnQiLCJjbGllbnQiLCJkZXN0aW5hdGlvbkZpbGVOYW1lIiwibWFrZUZpbGVOYW1lTm9FeHRlbnNpb24iLCJjcmVhdGVPdXRwdXQiLCJldmVudHMiLCJpIiwiZXZlbnQiLCJ1cGRhdGVQcm9ncmVzcyIsIm51bWJlciIsInRvdGFsIiwiY2FuY2VsbGVkIiwiY2xlYW5VcCIsImhhdmVSZW5kZXJlckZvckV2ZW50IiwicGxhaW5UZXh0Rm9yRXZlbnQiLCJmb3JtYXRGdWxsRGF0ZSIsIkRhdGUiLCJnZXRUcyIsIlNldHRpbmdzU3RvcmUiLCJnZXRWYWx1ZSIsImV4cG9ydCIsImZldGNoU3RhcnQiLCJwZXJmb3JtYW5jZSIsIm5vdyIsInJlcyIsImdldFJlcXVpcmVkRXZlbnRzIiwiZmV0Y2hFbmQiLCJ0ZXh0IiwiZmlsZXMiLCJCbG9iIiwiZG93bmxvYWRaSVAiLCJmaWxlTmFtZSIsImRvd25sb2FkUGxhaW5UZXh0IiwiZXhwb3J0RW5kIiwiaW5mbyIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvZXhwb3J0VXRpbHMvUGxhaW5UZXh0RXhwb3J0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIxLCAyMDIyIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCB7IFJvb20sIElDb250ZW50LCBNYXRyaXhFdmVudCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcblxuaW1wb3J0IEV4cG9ydGVyIGZyb20gXCIuL0V4cG9ydGVyXCI7XG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7IEV4cG9ydFR5cGUsIElFeHBvcnRPcHRpb25zIH0gZnJvbSBcIi4vZXhwb3J0VXRpbHNcIjtcbmltcG9ydCB7IHRleHRGb3JFdmVudCB9IGZyb20gXCIuLi8uLi9UZXh0Rm9yRXZlbnRcIjtcbmltcG9ydCB7IGhhdmVSZW5kZXJlckZvckV2ZW50IH0gZnJvbSBcIi4uLy4uL2V2ZW50cy9FdmVudFRpbGVGYWN0b3J5XCI7XG5pbXBvcnQgU2V0dGluZ3NTdG9yZSBmcm9tIFwiLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3NTdG9yZVwiO1xuaW1wb3J0IHsgZm9ybWF0RnVsbERhdGUgfSBmcm9tIFwiLi4vLi4vRGF0ZVV0aWxzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsYWluVGV4dEV4cG9ydGVyIGV4dGVuZHMgRXhwb3J0ZXIge1xuICAgIHByb3RlY3RlZCB0b3RhbFNpemU6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgbWVkaWFPbWl0VGV4dDogc3RyaW5nO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICByb29tOiBSb29tLFxuICAgICAgICBleHBvcnRUeXBlOiBFeHBvcnRUeXBlLFxuICAgICAgICBleHBvcnRPcHRpb25zOiBJRXhwb3J0T3B0aW9ucyxcbiAgICAgICAgc2V0UHJvZ3Jlc3NUZXh0OiBSZWFjdC5EaXNwYXRjaDxSZWFjdC5TZXRTdGF0ZUFjdGlvbjxzdHJpbmc+PixcbiAgICApIHtcbiAgICAgICAgc3VwZXIocm9vbSwgZXhwb3J0VHlwZSwgZXhwb3J0T3B0aW9ucywgc2V0UHJvZ3Jlc3NUZXh0KTtcbiAgICAgICAgdGhpcy50b3RhbFNpemUgPSAwO1xuICAgICAgICB0aGlzLm1lZGlhT21pdFRleHQgPSAhdGhpcy5leHBvcnRPcHRpb25zLmF0dGFjaG1lbnRzSW5jbHVkZWRcbiAgICAgICAgICAgID8gX3QoXCJleHBvcnRfY2hhdHxtZWRpYV9vbWl0dGVkXCIpXG4gICAgICAgICAgICA6IF90KFwiZXhwb3J0X2NoYXR8bWVkaWFfb21pdHRlZF9maWxlX3NpemVcIik7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkZXN0aW5hdGlvbkZpbGVOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ha2VGaWxlTmFtZU5vRXh0ZW5zaW9uKCkgKyBcIi50eHRcIjtcbiAgICB9XG5cbiAgICBwdWJsaWMgdGV4dEZvclJlcGx5RXZlbnQgPSAoY29udGVudDogSUNvbnRlbnQpOiBzdHJpbmcgPT4ge1xuICAgICAgICBjb25zdCBSRVBMWV9SRUdFWCA9IC8+IDwoLio/KT4oLio/KVxcblxcbiguKikvcztcbiAgICAgICAgY29uc3QgUkVQTFlfU09VUkNFX01BWF9MRU5HVEggPSAzMjtcblxuICAgICAgICBjb25zdCBtYXRjaCA9IFJFUExZX1JFR0VYLmV4ZWMoY29udGVudC5ib2R5KTtcblxuICAgICAgICAvLyBpZiB0aGUgcmVwbHkgZm9ybWF0IGlzIGludmFsaWQsIHRoZW4gcmV0dXJuIHRoZSBib2R5XG4gICAgICAgIGlmICghbWF0Y2gpIHJldHVybiBjb250ZW50LmJvZHk7XG5cbiAgICAgICAgbGV0IHJwbFNvdXJjZTogc3RyaW5nO1xuICAgICAgICBjb25zdCBycGxOYW1lID0gbWF0Y2hbMV07XG4gICAgICAgIGNvbnN0IHJwbFRleHQgPSBtYXRjaFszXTtcblxuICAgICAgICBycGxTb3VyY2UgPSBtYXRjaFsyXS5zdWJzdHJpbmcoMSk7XG4gICAgICAgIC8vIEdldCB0aGUgZmlyc3Qgbm9uLWJsYW5rIGxpbmUgZnJvbSB0aGUgc291cmNlLlxuICAgICAgICBjb25zdCBsaW5lcyA9IHJwbFNvdXJjZS5zcGxpdChcIlxcblwiKS5maWx0ZXIoKGxpbmUpID0+ICEvXlxccyokLy50ZXN0KGxpbmUpKTtcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIEN1dCB0byBhIG1heGltdW0gbGVuZ3RoLlxuICAgICAgICAgICAgcnBsU291cmNlID0gbGluZXNbMF0uc3Vic3RyaW5nKDAsIFJFUExZX1NPVVJDRV9NQVhfTEVOR1RIKTtcbiAgICAgICAgICAgIC8vIEVsbGlwc2lzIGlmIG5lZWRlZC5cbiAgICAgICAgICAgIGlmIChsaW5lc1swXS5sZW5ndGggPiBSRVBMWV9TT1VSQ0VfTUFYX0xFTkdUSCkge1xuICAgICAgICAgICAgICAgIHJwbFNvdXJjZSA9IHJwbFNvdXJjZSArIFwiLi4uXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXcmFwIGluIGZvcm1hdHRpbmdcbiAgICAgICAgICAgIHJwbFNvdXJjZSA9IGAgXCIke3JwbFNvdXJjZX1cImA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBEb24ndCBzaG93IGEgc291cmNlIGJlY2F1c2Ugd2UgY291bGRuJ3QgZm9ybWF0IG9uZS5cbiAgICAgICAgICAgIHJwbFNvdXJjZSA9IFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYDwke3JwbE5hbWV9JHtycGxTb3VyY2V9PiAke3JwbFRleHR9YDtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIHBsYWluVGV4dEZvckV2ZW50ID0gYXN5bmMgKG14RXY6IE1hdHJpeEV2ZW50KTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgY29uc3Qgc2VuZGVyRGlzcGxheU5hbWUgPSBteEV2LnNlbmRlciAmJiBteEV2LnNlbmRlci5uYW1lID8gbXhFdi5zZW5kZXIubmFtZSA6IG14RXYuZ2V0U2VuZGVyKCk7XG4gICAgICAgIGxldCBtZWRpYVRleHQgPSBcIlwiO1xuICAgICAgICBpZiAodGhpcy5pc0F0dGFjaG1lbnQobXhFdikpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmV4cG9ydE9wdGlvbnMuYXR0YWNobWVudHNJbmNsdWRlZCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCB0aGlzLmdldE1lZGlhQmxvYihteEV2KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudG90YWxTaXplICsgYmxvYi5zaXplID4gdGhpcy5leHBvcnRPcHRpb25zLm1heFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVGV4dCA9IGAgKCR7dGhpcy5tZWRpYU9taXRUZXh0fSlgO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b3RhbFNpemUgKz0gYmxvYi5zaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSB0aGlzLmdldEZpbGVQYXRoKG14RXYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUZXh0ID0gXCIgKFwiICsgX3QoXCJleHBvcnRfY2hhdHxmaWxlX2F0dGFjaGVkXCIpICsgXCIpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEZpbGUoZmlsZVBhdGgsIGJsb2IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudG90YWxTaXplID09IHRoaXMuZXhwb3J0T3B0aW9ucy5tYXhTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBvcnRPcHRpb25zLmF0dGFjaG1lbnRzSW5jbHVkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lZGlhVGV4dCA9IFwiIChcIiArIF90KFwiZXhwb3J0X2NoYXR8ZXJyb3JfZmV0Y2hpbmdfZmlsZVwiKSArIFwiKVwiO1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKFwiRXJyb3IgZmV0Y2hpbmcgZmlsZSBcIiArIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgbWVkaWFUZXh0ID0gYCAoJHt0aGlzLm1lZGlhT21pdFRleHR9KWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNSZXBseShteEV2KSkgcmV0dXJuIHNlbmRlckRpc3BsYXlOYW1lICsgXCI6IFwiICsgdGhpcy50ZXh0Rm9yUmVwbHlFdmVudChteEV2LmdldENvbnRlbnQoKSkgKyBtZWRpYVRleHQ7XG4gICAgICAgIGVsc2UgcmV0dXJuIHRleHRGb3JFdmVudChteEV2LCB0aGlzLnJvb20uY2xpZW50KSArIG1lZGlhVGV4dDtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZU91dHB1dChldmVudHM6IE1hdHJpeEV2ZW50W10pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBsZXQgY29udGVudCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IGV2ZW50c1tpXTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUHJvZ3Jlc3MoXG4gICAgICAgICAgICAgICAgX3QoXCJleHBvcnRfY2hhdHxwcm9jZXNzaW5nX2V2ZW50X25cIiwge1xuICAgICAgICAgICAgICAgICAgICBudW1iZXI6IGkgKyAxLFxuICAgICAgICAgICAgICAgICAgICB0b3RhbDogZXZlbnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbmNlbGxlZCkgcmV0dXJuIHRoaXMuY2xlYW5VcCgpO1xuICAgICAgICAgICAgaWYgKCFoYXZlUmVuZGVyZXJGb3JFdmVudChldmVudCwgdGhpcy5yb29tLmNsaWVudCwgZmFsc2UpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IHRleHRGb3JFdmVudCA9IGF3YWl0IHRoaXMucGxhaW5UZXh0Rm9yRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgY29udGVudCArPVxuICAgICAgICAgICAgICAgIHRleHRGb3JFdmVudCAmJlxuICAgICAgICAgICAgICAgIGAke2Zvcm1hdEZ1bGxEYXRlKFxuICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZShldmVudC5nZXRUcygpKSxcbiAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShcInNob3dUd2VsdmVIb3VyVGltZXN0YW1wc1wiKSxcbiAgICAgICAgICAgICAgICApfSAtICR7dGV4dEZvckV2ZW50fVxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGV4cG9ydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy51cGRhdGVQcm9ncmVzcyhfdChcImV4cG9ydF9jaGF0fHN0YXJ0aW5nX2V4cG9ydFwiKSk7XG4gICAgICAgIHRoaXMudXBkYXRlUHJvZ3Jlc3MoX3QoXCJleHBvcnRfY2hhdHxmZXRjaGluZ19ldmVudHNcIikpO1xuXG4gICAgICAgIGNvbnN0IGZldGNoU3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5nZXRSZXF1aXJlZEV2ZW50cygpO1xuICAgICAgICBjb25zdCBmZXRjaEVuZCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gICAgICAgIGxvZ2dlci5sb2coYEZldGNoZWQgJHtyZXMubGVuZ3RofSBldmVudHMgaW4gJHsoZmV0Y2hFbmQgLSBmZXRjaFN0YXJ0KSAvIDEwMDB9c2ApO1xuXG4gICAgICAgIHRoaXMudXBkYXRlUHJvZ3Jlc3MoX3QoXCJleHBvcnRfY2hhdHxjcmVhdGluZ19vdXRwdXRcIikpO1xuICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVPdXRwdXQocmVzKTtcblxuICAgICAgICBpZiAodGhpcy5maWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRmlsZShcImV4cG9ydC50eHRcIiwgbmV3IEJsb2IoW3RleHRdKSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRvd25sb2FkWklQKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IHRoaXMuZGVzdGluYXRpb25GaWxlTmFtZTtcbiAgICAgICAgICAgIHRoaXMuZG93bmxvYWRQbGFpblRleHQoZmlsZU5hbWUsIHRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhwb3J0RW5kID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhcIkV4cG9ydCBjYW5jZWxsZWQgc3VjY2Vzc2Z1bGx5XCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXCJFeHBvcnQgc3VjY2Vzc2Z1bCFcIik7XG4gICAgICAgICAgICBsb2dnZXIubG9nKGBFeHBvcnRlZCAke3Jlcy5sZW5ndGh9IGV2ZW50cyBpbiAkeyhleHBvcnRFbmQgLSBmZXRjaFN0YXJ0KSAvIDEwMDB9IHNlY29uZHNgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYW5VcCgpO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFTQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFHQSxJQUFBQyxTQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBRUEsSUFBQUksYUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssaUJBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLGNBQUEsR0FBQUosc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFPLFVBQUEsR0FBQVAsT0FBQTtBQWxCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFjZSxNQUFNUSxpQkFBaUIsU0FBU0MsaUJBQVEsQ0FBQztFQUk3Q0MsV0FBV0EsQ0FDZEMsSUFBVSxFQUNWQyxVQUFzQixFQUN0QkMsYUFBNkIsRUFDN0JDLGVBQTZELEVBQy9EO0lBQ0UsS0FBSyxDQUFDSCxJQUFJLEVBQUVDLFVBQVUsRUFBRUMsYUFBYSxFQUFFQyxlQUFlLENBQUM7SUFBQyxJ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