UNPKG

matrix-react-sdk

Version:
299 lines (293 loc) 44.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.longestBacktickSequence = longestBacktickSequence; exports.parseEvent = parseEvent; exports.parsePlainTextMessage = parsePlainTextMessage; var _matrix = require("matrix-js-sdk/src/matrix"); var _HtmlUtils = require("../HtmlUtils"); var _Permalinks = require("../utils/permalinks/Permalinks"); var _parts = require("./parts"); var _SdkConfig = _interopRequireDefault(require("../SdkConfig")); var _colour = require("../utils/colour"); var _Reply = require("../utils/Reply"); /* Copyright 2024 New Vector Ltd. Copyright 2019, 2020 The Matrix.org Foundation C.I.C. Copyright 2019 New Vector Ltd SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ const LIST_TYPES = ["UL", "OL", "LI"]; // Escapes all markup in the given text function escape(text) { return text.replace(/[\\*_[\]`<]|^>/g, match => `\\${match}`); } // Finds the length of the longest backtick sequence in the given text, used for // escaping backticks in code blocks function longestBacktickSequence(text) { let length = 0; let currentLength = 0; for (const c of text) { if (c === "`") { currentLength++; } else { length = Math.max(length, currentLength); currentLength = 0; } } return Math.max(length, currentLength); } function isListChild(n) { return LIST_TYPES.includes(n.parentNode?.nodeName || ""); } function parseAtRoomMentions(text, pc, opts) { const ATROOM = "@room"; const parts = []; text.split(ATROOM).forEach((textPart, i, arr) => { if (textPart.length) { parts.push(...pc.plainWithEmoji(opts.shouldEscape ? escape(textPart) : textPart)); } // it's safe to never append @room after the last textPart // as split will report an empty string at the end if // `text` ended in @room. const isLast = i === arr.length - 1; if (!isLast) { parts.push(pc.atRoomPill(ATROOM)); } }); return parts; } function parseLink(n, pc, opts) { const { href } = n; const resourceId = (0, _Permalinks.getPrimaryPermalinkEntity)(href); // The room/user ID switch (resourceId?.[0]) { case "@": return [pc.userPill(n.textContent || "", resourceId)]; case "#": return [pc.roomPill(resourceId)]; } const children = Array.from(n.childNodes); if (href === n.textContent && children.every(c => c.nodeType === Node.TEXT_NODE)) { return parseAtRoomMentions(n.textContent, pc, opts); } else { return [pc.plain("["), ...parseChildren(n, pc, opts), pc.plain(`](${href})`)]; } } function parseImage(n, pc, opts) { const { alt, src } = n; return pc.plainWithEmoji(`![${escape(alt)}](${src})`); } function parseCodeBlock(n, pc, opts) { if (!n.textContent) return []; let language = ""; if (n.firstChild?.nodeName === "CODE") { for (const className of n.firstChild.classList) { if (className.startsWith("language-") && !className.startsWith("language-_")) { language = className.slice("language-".length); break; } } } const text = n.textContent.replace(/\n$/, ""); // Escape backticks by using even more backticks for the fence if necessary const fence = "`".repeat(Math.max(3, longestBacktickSequence(text) + 1)); const parts = [...pc.plainWithEmoji(fence + language), pc.newline()]; text.split("\n").forEach(line => { parts.push(...pc.plainWithEmoji(line)); parts.push(pc.newline()); }); parts.push(pc.plain(fence)); return parts; } function parseHeader(n, pc, opts) { const depth = parseInt(n.nodeName.slice(1), 10); const prefix = pc.plain("#".repeat(depth) + " "); return [prefix, ...parseChildren(n, pc, opts)]; } function checkIgnored(n) { if (n.nodeType === Node.TEXT_NODE) { // Element adds \n text nodes in a lot of places, // which should be ignored return n.nodeValue === "\n"; } else if (n.nodeType === Node.ELEMENT_NODE) { return n.nodeName === "MX-REPLY"; } return true; } function prefixLines(parts, prefix, pc) { parts.unshift(pc.plain(prefix)); for (let i = 0; i < parts.length; i++) { if (parts[i].type === _parts.Type.Newline) { parts.splice(i + 1, 0, pc.plain(prefix)); i += 1; } } } function parseChildren(n, pc, opts, mkListItem) { let prev; return Array.from(n.childNodes).flatMap(c => { const parsed = parseNode(c, pc, opts, mkListItem); if (parsed.length && prev && ((0, _HtmlUtils.checkBlockNode)(prev) || (0, _HtmlUtils.checkBlockNode)(c))) { if (isListChild(c)) { // Use tighter spacing within lists parsed.unshift(pc.newline()); } else { parsed.unshift(pc.newline(), pc.newline()); } } if (parsed.length) prev = c; return parsed; }); } function parseNode(n, pc, opts, mkListItem) { if (checkIgnored(n)) return []; switch (n.nodeType) { case Node.TEXT_NODE: return parseAtRoomMentions(n.nodeValue || "", pc, opts); case Node.ELEMENT_NODE: switch (n.nodeName) { case "H1": case "H2": case "H3": case "H4": case "H5": case "H6": return parseHeader(n, pc, opts); case "A": return parseLink(n, pc, opts); case "IMG": return parseImage(n, pc, opts); case "BR": return [pc.newline()]; case "HR": return [pc.plain("---")]; case "EM": return [pc.plain("_"), ...parseChildren(n, pc, opts), pc.plain("_")]; case "STRONG": return [pc.plain("**"), ...parseChildren(n, pc, opts), pc.plain("**")]; case "DEL": return [pc.plain("<del>"), ...parseChildren(n, pc, opts), pc.plain("</del>")]; case "S": return [pc.plain("<s>"), ...parseChildren(n, pc, opts), pc.plain("</s>")]; case "SUB": return [pc.plain("<sub>"), ...parseChildren(n, pc, opts), pc.plain("</sub>")]; case "SUP": return [pc.plain("<sup>"), ...parseChildren(n, pc, opts), pc.plain("</sup>")]; case "U": return [pc.plain("<u>"), ...parseChildren(n, pc, opts), pc.plain("</u>")]; case "PRE": return parseCodeBlock(n, pc, opts); case "CODE": { // Escape backticks by using multiple backticks for the fence if necessary const fence = "`".repeat(longestBacktickSequence(n.textContent || "") + 1); return pc.plainWithEmoji(`${fence}${n.textContent}${fence}`); } case "BLOCKQUOTE": { const parts = parseChildren(n, pc, opts); prefixLines(parts, "> ", pc); return parts; } case "LI": return mkListItem?.(n) ?? parseChildren(n, pc, opts); case "UL": { const parts = parseChildren(n, pc, opts, li => [pc.plain("- "), ...parseChildren(li, pc, opts)]); if (isListChild(n)) { prefixLines(parts, " ", pc); } return parts; } case "OL": { let counter = n.start ?? 1; const parts = parseChildren(n, pc, opts, li => { const parts = [pc.plain(`${counter}. `), ...parseChildren(li, pc, opts)]; counter++; return parts; }); if (isListChild(n)) { prefixLines(parts, " ", pc); } return parts; } case "DIV": case "SPAN": // Math nodes are translated back into delimited latex strings if (n.hasAttribute("data-mx-maths")) { const delims = _SdkConfig.default.get().latex_maths_delims; const delimLeft = n.nodeName === "SPAN" ? delims?.inline?.left ?? "\\(" : delims?.display?.left ?? "\\["; const delimRight = n.nodeName === "SPAN" ? delims?.inline?.right ?? "\\)" : delims?.display?.right ?? "\\]"; const tex = n.getAttribute("data-mx-maths"); return pc.plainWithEmoji(`${delimLeft}${tex}${delimRight}`); } // Spoilers are translated back into their slash command form else if (n.hasAttribute("data-mx-spoiler")) { return [pc.plain("/spoiler "), ...parseChildren(n, pc, opts)]; } } } return parseChildren(n, pc, opts); } function parseHtmlMessage(html, pc, opts) { // no nodes from parsing here should be inserted in the document, // as scripts in event handlers, etc would be executed then. // we're only taking text, so that is fine const parts = parseNode(new DOMParser().parseFromString(html, "text/html").body, pc, opts); if (opts.isQuotedMessage) { prefixLines(parts, "> ", pc); } return parts; } function parsePlainTextMessage(body, pc, opts) { const lines = body.split(/\r\n|\r|\n/g); // split on any new-line combination not just \n, collapses \r\n return lines.reduce((parts, line, i) => { if (opts.isQuotedMessage) { parts.push(pc.plain("> ")); } parts.push(...parseAtRoomMentions(line, pc, opts)); const isLast = i === lines.length - 1; if (!isLast) { parts.push(pc.newline()); } return parts; }, []); } function parseEvent(event, pc, opts = { shouldEscape: true }) { const content = event.getContent(); let parts; const isEmote = content.msgtype === _matrix.MsgType.Emote; let isRainbow = false; if (content.format === "org.matrix.custom.html") { parts = parseHtmlMessage(content.formatted_body || "", pc, opts); if (content.body && content.formatted_body && (0, _colour.textToHtmlRainbow)(content.body) === content.formatted_body) { isRainbow = true; } } else { let body = content.body || ""; if (event.replyEventId) { body = (0, _Reply.stripPlainReply)(body); } parts = parsePlainTextMessage(body, pc, opts); } if (isEmote && isRainbow) { parts.unshift(pc.plain("/rainbowme ")); } else if (isRainbow) { parts.unshift(pc.plain("/rainbow ")); } else if (isEmote) { parts.unshift(pc.plain("/me ")); } return parts; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl9IdG1sVXRpbHMiLCJfUGVybWFsaW5rcyIsIl9wYXJ0cyIsIl9TZGtDb25maWciLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2NvbG91ciIsIl9SZXBseSIsIkxJU1RfVFlQRVMiLCJlc2NhcGUiLCJ0ZXh0IiwicmVwbGFjZSIsIm1hdGNoIiwibG9uZ2VzdEJhY2t0aWNrU2VxdWVuY2UiLCJsZW5ndGgiLCJjdXJyZW50TGVuZ3RoIiwiYyIsIk1hdGgiLCJtYXgiLCJpc0xpc3RDaGlsZCIsIm4iLCJpbmNsdWRlcyIsInBhcmVudE5vZGUiLCJub2RlTmFtZSIsInBhcnNlQXRSb29tTWVudGlvbnMiLCJwYyIsIm9wdHMiLCJBVFJPT00iLCJwYXJ0cyIsInNwbGl0IiwiZm9yRWFjaCIsInRleHRQYXJ0IiwiaSIsImFyciIsInB1c2giLCJwbGFpbldpdGhFbW9qaSIsInNob3VsZEVzY2FwZSIsImlzTGFzdCIsImF0Um9vbVBpbGwiLCJwYXJzZUxpbmsiLCJocmVmIiwicmVzb3VyY2VJZCIsImdldFByaW1hcnlQZXJtYWxpbmtFbnRpdHkiLCJ1c2VyUGlsbCIsInRleHRDb250ZW50Iiwicm9vbVBpbGwiLCJjaGlsZHJlbiIsIkFycmF5IiwiZnJvbSIsImNoaWxkTm9kZXMiLCJldmVyeSIsIm5vZGVUeXBlIiwiTm9kZSIsIlRFWFRfTk9ERSIsInBsYWluIiwicGFyc2VDaGlsZHJlbiIsInBhcnNlSW1hZ2UiLCJhbHQiLCJzcmMiLCJwYXJzZUNvZGVCbG9jayIsImxhbmd1YWdlIiwiZmlyc3RDaGlsZCIsImNsYXNzTmFtZSIsImNsYXNzTGlzdCIsInN0YXJ0c1dpdGgiLCJzbGljZSIsImZlbmNlIiwicmVwZWF0IiwibmV3bGluZSIsImxpbmUiLCJwYXJzZUhlYWRlciIsImRlcHRoIiwicGFyc2VJbnQiLCJwcmVmaXgiLCJjaGVja0lnbm9yZWQiLCJub2RlVmFsdWUiLCJFTEVNRU5UX05PREUiLCJwcmVmaXhMaW5lcyIsInVuc2hpZnQiLCJ0eXBlIiwiVHlwZSIsIk5ld2xpbmUiLCJzcGxpY2UiLCJta0xpc3RJdGVtIiwicHJldiIsImZsYXRNYXAiLCJwYXJzZWQiLCJwYXJzZU5vZGUiLCJjaGVja0Jsb2NrTm9kZSIsImxpIiwiY291bnRlciIsInN0YXJ0IiwiaGFzQXR0cmlidXRlIiwiZGVsaW1zIiwiU2RrQ29uZmlnIiwiZ2V0IiwibGF0ZXhfbWF0aHNfZGVsaW1zIiwiZGVsaW1MZWZ0IiwiaW5saW5lIiwibGVmdCIsImRpc3BsYXkiLCJkZWxpbVJpZ2h0IiwicmlnaHQiLCJ0ZXgiLCJnZXRBdHRyaWJ1dGUiLCJwYXJzZUh0bWxNZXNzYWdlIiwiaHRtbCIsIkRPTVBhcnNlciIsInBhcnNlRnJvbVN0cmluZyIsImJvZHkiLCJpc1F1b3RlZE1lc3NhZ2UiLCJwYXJzZVBsYWluVGV4dE1lc3NhZ2UiLCJsaW5lcyIsInJlZHVjZSIsInBhcnNlRXZlbnQiLCJldmVudCIsImNvbnRlbnQiLCJnZXRDb250ZW50IiwiaXNFbW90ZSIsIm1zZ3R5cGUiLCJNc2dUeXBlIiwiRW1vdGUiLCJpc1JhaW5ib3ciLCJmb3JtYXQiLCJmb3JtYXR0ZWRfYm9keSIsInRleHRUb0h0bWxSYWluYm93IiwicmVwbHlFdmVudElkIiwic3RyaXBQbGFpblJlcGx5Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VkaXRvci9kZXNlcmlhbGl6ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxOSwgMjAyMCBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuQ29weXJpZ2h0IDIwMTkgTmV3IFZlY3RvciBMdGRcblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IHsgTWF0cml4RXZlbnQsIE1zZ1R5cGUgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5cbmltcG9ydCB7IGNoZWNrQmxvY2tOb2RlIH0gZnJvbSBcIi4uL0h0bWxVdGlsc1wiO1xuaW1wb3J0IHsgZ2V0UHJpbWFyeVBlcm1hbGlua0VudGl0eSB9IGZyb20gXCIuLi91dGlscy9wZXJtYWxpbmtzL1Blcm1hbGlua3NcIjtcbmltcG9ydCB7IFBhcnQsIFBhcnRDcmVhdG9yLCBUeXBlIH0gZnJvbSBcIi4vcGFydHNcIjtcbmltcG9ydCBTZGtDb25maWcgZnJvbSBcIi4uL1Nka0NvbmZpZ1wiO1xuaW1wb3J0IHsgdGV4dFRvSHRtbFJhaW5ib3cgfSBmcm9tIFwiLi4vdXRpbHMvY29sb3VyXCI7XG5pbXBvcnQgeyBzdHJpcFBsYWluUmVwbHkgfSBmcm9tIFwiLi4vdXRpbHMvUmVwbHlcIjtcblxuY29uc3QgTElTVF9UWVBFUyA9IFtcIlVMXCIsIFwiT0xcIiwgXCJMSVwiXTtcblxuLy8gRXNjYXBlcyBhbGwgbWFya3VwIGluIHRoZSBnaXZlbiB0ZXh0XG5mdW5jdGlvbiBlc2NhcGUodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9bXFxcXCpfW1xcXWA8XXxePi9nLCAobWF0Y2gpID0+IGBcXFxcJHttYXRjaH1gKTtcbn1cblxuLy8gRmluZHMgdGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBiYWNrdGljayBzZXF1ZW5jZSBpbiB0aGUgZ2l2ZW4gdGV4dCwgdXNlZCBmb3Jcbi8vIGVzY2FwaW5nIGJhY2t0aWNrcyBpbiBjb2RlIGJsb2Nrc1xuZXhwb3J0IGZ1bmN0aW9uIGxvbmdlc3RCYWNrdGlja1NlcXVlbmNlKHRleHQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgbGV0IGN1cnJlbnRMZW5ndGggPSAwO1xuXG4gICAgZm9yIChjb25zdCBjIG9mIHRleHQpIHtcbiAgICAgICAgaWYgKGMgPT09IFwiYFwiKSB7XG4gICAgICAgICAgICBjdXJyZW50TGVuZ3RoKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZW5ndGggPSBNYXRoLm1heChsZW5ndGgsIGN1cnJlbnRMZW5ndGgpO1xuICAgICAgICAgICAgY3VycmVudExlbmd0aCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gTWF0aC5tYXgobGVuZ3RoLCBjdXJyZW50TGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24gaXNMaXN0Q2hpbGQobjogTm9kZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBMSVNUX1RZUEVTLmluY2x1ZGVzKG4ucGFyZW50Tm9kZT8ubm9kZU5hbWUgfHwgXCJcIik7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQXRSb29tTWVudGlvbnModGV4dDogc3RyaW5nLCBwYzogUGFydENyZWF0b3IsIG9wdHM6IElQYXJzZU9wdGlvbnMpOiBQYXJ0W10ge1xuICAgIGNvbnN0IEFUUk9PTSA9IFwiQHJvb21cIjtcbiAgICBjb25zdCBwYXJ0czogUGFydFtdID0gW107XG4gICAgdGV4dC5zcGxpdChBVFJPT00pLmZvckVhY2goKHRleHRQYXJ0LCBpLCBhcnIpID0+IHtcbiAgICAgICAgaWYgKHRleHRQYXJ0Lmxlbmd0aCkge1xuICAgICAgICAgICAgcGFydHMucHVzaCguLi5wYy5wbGFpbldpdGhFbW9qaShvcHRzLnNob3VsZEVzY2FwZSA/IGVzY2FwZSh0ZXh0UGFydCkgOiB0ZXh0UGFydCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGl0J3Mgc2FmZSB0byBuZXZlciBhcHBlbmQgQHJvb20gYWZ0ZXIgdGhlIGxhc3QgdGV4dFBhcnRcbiAgICAgICAgLy8gYXMgc3BsaXQgd2lsbCByZXBvcnQgYW4gZW1wdHkgc3RyaW5nIGF0IHRoZSBlbmQgaWZcbiAgICAgICAgLy8gYHRleHRgIGVuZGVkIGluIEByb29tLlxuICAgICAgICBjb25zdCBpc0xhc3QgPSBpID09PSBhcnIubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKCFpc0xhc3QpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2gocGMuYXRSb29tUGlsbChBVFJPT00pKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBwYXJ0cztcbn1cblxuZnVuY3Rpb24gcGFyc2VMaW5rKG46IE5vZGUsIHBjOiBQYXJ0Q3JlYXRvciwgb3B0czogSVBhcnNlT3B0aW9ucyk6IFBhcnRbXSB7XG4gICAgY29uc3QgeyBocmVmIH0gPSBuIGFzIEhUTUxBbmNob3JFbGVtZW50O1xuICAgIGNvbnN0IHJlc291cmNlSWQgPSBnZXRQcmltYXJ5UGVybWFsaW5rRW50aXR5KGhyZWYpOyAvLyBUaGUgcm9vbS91c2VyIElEXG5cbiAgICBzd2l0Y2ggKHJlc291cmNlSWQ/LlswXSkge1xuICAgICAgICBjYXNlIFwiQFwiOlxuICAgICAgICAgICAgcmV0dXJuIFtwYy51c2VyUGlsbChuLnRleHRDb250ZW50IHx8IFwiXCIsIHJlc291cmNlSWQpXTtcbiAgICAgICAgY2FzZSBcIiNcIjpcbiAgICAgICAgICAgIHJldHVybiBbcGMucm9vbVBpbGwocmVzb3VyY2VJZCldO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShuLmNoaWxkTm9kZXMpO1xuICAgIGlmIChocmVmID09PSBuLnRleHRDb250ZW50ICYmIGNoaWxkcmVuLmV2ZXJ5KChjKSA9PiBjLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlQXRSb29tTWVudGlvbnMobi50ZXh0Q29udGVudCwgcGMsIG9wdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbcGMucGxhaW4oXCJbXCIpLCAuLi5wYXJzZUNoaWxkcmVuKG4sIHBjLCBvcHRzKSwgcGMucGxhaW4oYF0oJHtocmVmfSlgKV07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUltYWdlKG46IE5vZGUsIHBjOiBQYXJ0Q3JlYXRvciwgb3B0czogSVBhcnNlT3B0aW9ucyk6IFBhcnRbXSB7XG4gICAgY29uc3QgeyBhbHQsIHNyYyB9ID0gbiBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIHJldHVybiBwYy5wbGFpbldpdGhFbW9qaShgIVske2VzY2FwZShhbHQpfV0oJHtzcmN9KWApO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNvZGVCbG9jayhuOiBOb2RlLCBwYzogUGFydENyZWF0b3IsIG9wdHM6IElQYXJzZU9wdGlvbnMpOiBQYXJ0W10ge1xuICAgIGlmICghbi50ZXh0Q29udGVudCkgcmV0dXJuIFtdO1xuXG4gICAgbGV0IGxhbmd1YWdlID0gXCJcIjtcbiAgICBpZiAobi5maXJzdENoaWxkPy5ub2RlTmFtZSA9PT0gXCJDT0RFXCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBjbGFzc05hbWUgb2YgKG4uZmlyc3RDaGlsZCBhcyBIVE1MRWxlbWVudCkuY2xhc3NMaXN0KSB7XG4gICAgICAgICAgICBpZiAoY2xhc3NOYW1lLnN0YXJ0c1dpdGgoXCJsYW5ndWFnZS1cIikgJiYgIWNsYXNzTmFtZS5zdGFydHNXaXRoKFwibGFuZ3VhZ2UtX1wiKSkge1xuICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gY2xhc3NOYW1lLnNsaWNlKFwibGFuZ3VhZ2UtXCIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRleHQgPSBuLnRleHRDb250ZW50LnJlcGxhY2UoL1xcbiQvLCBcIlwiKTtcbiAgICAvLyBFc2NhcGUgYmFja3RpY2tzIGJ5IHVzaW5nIGV2ZW4gbW9yZSBiYWNrdGlja3MgZm9yIHRoZSBmZW5jZSBpZiBuZWNlc3NhcnlcbiAgICBjb25zdCBmZW5jZSA9IFwiYFwiLnJlcGVhdChNYXRoLm1heCgzLCBsb25nZXN0QmFja3RpY2tTZXF1ZW5jZSh0ZXh0KSArIDEpKTtcbiAgICBjb25zdCBwYXJ0czogUGFydFtdID0gWy4uLnBjLnBsYWluV2l0aEVtb2ppKGZlbmNlICsgbGFuZ3VhZ2UpLCBwYy5uZXdsaW5lKCldO1xuXG4gICAgdGV4dC5zcGxpdChcIlxcblwiKS5mb3JFYWNoKChsaW5lKSA9PiB7XG4gICAgICAgIHBhcnRzLnB1c2goLi4ucGMucGxhaW5XaXRoRW1vamkobGluZSkpO1xuICAgICAgICBwYXJ0cy5wdXNoKHBjLm5ld2xpbmUoKSk7XG4gICAgfSk7XG5cbiAgICBwYXJ0cy5wdXNoKHBjLnBsYWluKGZlbmNlKSk7XG4gICAgcmV0dXJuIHBhcnRzO1xufVxuXG5mdW5jdGlvbiBwYXJzZUhlYWRlcihuOiBOb2RlLCBwYzogUGFydENyZWF0b3IsIG9wdHM6IElQYXJzZU9wdGlvbnMpOiBQYXJ0W10ge1xuICAgIGNvbnN0IGRlcHRoID0gcGFyc2VJbnQobi5ub2RlTmFtZS5zbGljZSgxKSwgMTApO1xuICAgIGNvbnN0IHByZWZpeCA9IHBjLnBsYWluKFwiI1wiLnJlcGVhdChkZXB0aCkgKyBcIiBcIik7XG4gICAgcmV0dXJuIFtwcmVmaXgsIC4uLnBhcnNlQ2hpbGRyZW4obiwgcGMsIG9wdHMpXTtcbn1cblxuZnVuY3Rpb24gY2hlY2tJZ25vcmVkKG46IE5vZGUpOiBib29sZWFuIHtcbiAgICBpZiAobi5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgLy8gRWxlbWVudCBhZGRzIFxcbiB0ZXh0IG5vZGVzIGluIGEgbG90IG9mIHBsYWNlcyxcbiAgICAgICAgLy8gd2hpY2ggc2hvdWxkIGJlIGlnbm9yZWRcbiAgICAgICAgcmV0dXJuIG4ubm9kZVZhbHVlID09PSBcIlxcblwiO1xuICAgIH0gZWxzZSBpZiAobi5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgcmV0dXJuIG4ubm9kZU5hbWUgPT09IFwiTVgtUkVQTFlcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHByZWZpeExpbmVzKHBhcnRzOiBQYXJ0W10sIHByZWZpeDogc3RyaW5nLCBwYzogUGFydENyZWF0b3IpOiB2b2lkIHtcbiAgICBwYXJ0cy51bnNoaWZ0KHBjLnBsYWluKHByZWZpeCkpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBhcnRzW2ldLnR5cGUgPT09IFR5cGUuTmV3bGluZSkge1xuICAgICAgICAgICAgcGFydHMuc3BsaWNlKGkgKyAxLCAwLCBwYy5wbGFpbihwcmVmaXgpKTtcbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VDaGlsZHJlbihuOiBOb2RlLCBwYzogUGFydENyZWF0b3IsIG9wdHM6IElQYXJzZU9wdGlvbnMsIG1rTGlzdEl0ZW0/OiAobGk6IE5vZGUpID0+IFBhcnRbXSk6IFBhcnRbXSB7XG4gICAgbGV0IHByZXY6IENoaWxkTm9kZSB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShuLmNoaWxkTm9kZXMpLmZsYXRNYXAoKGMpID0+IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VOb2RlKGMsIHBjLCBvcHRzLCBta0xpc3RJdGVtKTtcbiAgICAgICAgaWYgKHBhcnNlZC5sZW5ndGggJiYgcHJldiAmJiAoY2hlY2tCbG9ja05vZGUocHJldikgfHwgY2hlY2tCbG9ja05vZGUoYykpKSB7XG4gICAgICAgICAgICBpZiAoaXNMaXN0Q2hpbGQoYykpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdGlnaHRlciBzcGFjaW5nIHdpdGhpbiBsaXN0c1xuICAgICAgICAgICAgICAgIHBhcnNlZC51bnNoaWZ0KHBjLm5ld2xpbmUoKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhcnNlZC51bnNoaWZ0KHBjLm5ld2xpbmUoKSwgcGMubmV3bGluZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VkLmxlbmd0aCkgcHJldiA9IGM7XG4gICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTm9kZShuOiBOb2RlLCBwYzogUGFydENyZWF0b3IsIG9wdHM6IElQYXJzZU9wdGlvbnMsIG1rTGlzdEl0ZW0/OiAobGk6IE5vZGUpID0+IFBhcnRbXSk6IFBhcnRbXSB7XG4gICAgaWYgKGNoZWNrSWdub3JlZChuKSkgcmV0dXJuIFtdO1xuXG4gICAgc3dpdGNoIChuLm5vZGVUeXBlKSB7XG4gICAgICAgIGNhc2UgTm9kZS5URVhUX05PREU6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VBdFJvb21NZW50aW9ucyhuLm5vZGVWYWx1ZSB8fCBcIlwiLCBwYywgb3B0cyk7XG4gICAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREU6XG4gICAgICAgICAgICBzd2l0Y2ggKG4ubm9kZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiSDFcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiSDJcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiSDNcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiSDRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiSDVcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiSDZcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSGVhZGVyKG4sIHBjLCBvcHRzKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiQVwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VMaW5rKG4sIHBjLCBvcHRzKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiSU1HXCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUltYWdlKG4sIHBjLCBvcHRzKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiQlJcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtwYy5uZXdsaW5lKCldO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJIUlwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3BjLnBsYWluKFwiLS0tXCIpXTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiRU1cIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtwYy5wbGFpbihcIl9cIiksIC4uLnBhcnNlQ2hpbGRyZW4obiwgcGMsIG9wdHMpLCBwYy5wbGFpbihcIl9cIildO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJTVFJPTkdcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtwYy5wbGFpbihcIioqXCIpLCAuLi5wYXJzZUNoaWxkcmVuKG4sIHBjLCBvcHRzKSwgcGMucGxhaW4oXCIqKlwiKV07XG4gICAgICAgICAgICAgICAgY2FzZSBcIkRFTFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3BjLnBsYWluKFwiPGRlbD5cIiksIC4uLnBhcnNlQ2hpbGRyZW4obiwgcGMsIG9wdHMpLCBwYy5wbGFpbihcIjwvZGVsPlwiKV07XG4gICAgICAgICAgICAgICAgY2FzZSBcIlNcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtwYy5wbGFpbihcIjxzPlwiKSwgLi4ucGFyc2VDaGlsZHJlbihuLCBwYywgb3B0cyksIHBjLnBsYWluKFwiPC9zPlwiKV07XG4gICAgICAgICAgICAgICAgY2FzZSBcIlNVQlwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3BjLnBsYWluKFwiPHN1Yj5cIiksIC4uLnBhcnNlQ2hpbGRyZW4obiwgcGMsIG9wdHMpLCBwYy5wbGFpbihcIjwvc3ViPlwiKV07XG4gICAgICAgICAgICAgICAgY2FzZSBcIlNVUFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3BjLnBsYWluKFwiPHN1cD5cIiksIC4uLnBhcnNlQ2hpbGRyZW4obiwgcGMsIG9wdHMpLCBwYy5wbGFpbihcIjwvc3VwPlwiKV07XG4gICAgICAgICAgICAgICAgY2FzZSBcIlVcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtwYy5wbGFpbihcIjx1PlwiKSwgLi4ucGFyc2VDaGlsZHJlbihuLCBwYywgb3B0cyksIHBjLnBsYWluKFwiPC91PlwiKV07XG4gICAgICAgICAgICAgICAgY2FzZSBcIlBSRVwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VDb2RlQmxvY2sobiwgcGMsIG9wdHMpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJDT0RFXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRXNjYXBlIGJhY2t0aWNrcyBieSB1c2luZyBtdWx0aXBsZSBiYWNrdGlja3MgZm9yIHRoZSBmZW5jZSBpZiBuZWNlc3NhcnlcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmVuY2UgPSBcImBcIi5yZXBlYXQobG9uZ2VzdEJhY2t0aWNrU2VxdWVuY2Uobi50ZXh0Q29udGVudCB8fCBcIlwiKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGMucGxhaW5XaXRoRW1vamkoYCR7ZmVuY2V9JHtuLnRleHRDb250ZW50fSR7ZmVuY2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgXCJCTE9DS1FVT1RFXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwYXJzZUNoaWxkcmVuKG4sIHBjLCBvcHRzKTtcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4TGluZXMocGFydHMsIFwiPiBcIiwgcGMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFydHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgXCJMSVwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWtMaXN0SXRlbT8uKG4pID8/IHBhcnNlQ2hpbGRyZW4obiwgcGMsIG9wdHMpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJVTFwiOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gcGFyc2VDaGlsZHJlbihuLCBwYywgb3B0cywgKGxpKSA9PiBbcGMucGxhaW4oXCItIFwiKSwgLi4ucGFyc2VDaGlsZHJlbihsaSwgcGMsIG9wdHMpXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0xpc3RDaGlsZChuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4TGluZXMocGFydHMsIFwiICAgIFwiLCBwYyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIFwiT0xcIjoge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY291bnRlciA9IChuIGFzIEhUTUxPTGlzdEVsZW1lbnQpLnN0YXJ0ID8/IDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gcGFyc2VDaGlsZHJlbihuLCBwYywgb3B0cywgKGxpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJ0cyA9IFtwYy5wbGFpbihgJHtjb3VudGVyfS4gYCksIC4uLnBhcnNlQ2hpbGRyZW4obGksIHBjLCBvcHRzKV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyKys7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFydHM7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNMaXN0Q2hpbGQobikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeExpbmVzKHBhcnRzLCBcIiAgICBcIiwgcGMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0cztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBcIkRJVlwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJTUEFOXCI6XG4gICAgICAgICAgICAgICAgICAgIC8vIE1hdGggbm9kZXMgYXJlIHRyYW5zbGF0ZWQgYmFjayBpbnRvIGRlbGltaXRlZCBsYXRleCBzdHJpbmdzXG4gICAgICAgICAgICAgICAgICAgIGlmICgobiBhcyBFbGVtZW50KS5oYXNBdHRyaWJ1dGUoXCJkYXRhLW14LW1hdGhzXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWxpbXMgPSBTZGtDb25maWcuZ2V0KCkubGF0ZXhfbWF0aHNfZGVsaW1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsaW1MZWZ0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLm5vZGVOYW1lID09PSBcIlNQQU5cIiA/IChkZWxpbXM/LmlubGluZT8ubGVmdCA/PyBcIlxcXFwoXCIpIDogKGRlbGltcz8uZGlzcGxheT8ubGVmdCA/PyBcIlxcXFxbXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsaW1SaWdodCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5ub2RlTmFtZSA9PT0gXCJTUEFOXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoZGVsaW1zPy5pbmxpbmU/LnJpZ2h0ID8/IFwiXFxcXClcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZGVsaW1zPy5kaXNwbGF5Py5yaWdodCA/PyBcIlxcXFxdXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4ID0gKG4gYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiZGF0YS1teC1tYXRoc1wiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBjLnBsYWluV2l0aEVtb2ppKGAke2RlbGltTGVmdH0ke3RleH0ke2RlbGltUmlnaHR9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gU3BvaWxlcnMgYXJlIHRyYW5zbGF0ZWQgYmFjayBpbnRvIHRoZWlyIHNsYXNoIGNvbW1hbmQgZm9ybVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgobiBhcyBFbGVtZW50KS5oYXNBdHRyaWJ1dGUoXCJkYXRhLW14LXNwb2lsZXJcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbcGMucGxhaW4oXCIvc3BvaWxlciBcIiksIC4uLnBhcnNlQ2hpbGRyZW4obiwgcGMsIG9wdHMpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJzZUNoaWxkcmVuKG4sIHBjLCBvcHRzKTtcbn1cblxuaW50ZXJmYWNlIElQYXJzZU9wdGlvbnMge1xuICAgIGlzUXVvdGVkTWVzc2FnZT86IGJvb2xlYW47XG4gICAgc2hvdWxkRXNjYXBlPzogYm9vbGVhbjtcbn1cblxuZnVuY3Rpb24gcGFyc2VIdG1sTWVzc2FnZShodG1sOiBzdHJpbmcsIHBjOiBQYXJ0Q3JlYXRvciwgb3B0czogSVBhcnNlT3B0aW9ucyk6IFBhcnRbXSB7XG4gICAgLy8gbm8gbm9kZXMgZnJvbSBwYXJzaW5nIGhlcmUgc2hvdWxkIGJlIGluc2VydGVkIGluIHRoZSBkb2N1bWVudCxcbiAgICAvLyBhcyBzY3JpcHRzIGluIGV2ZW50IGhhbmRsZXJzLCBldGMgd291bGQgYmUgZXhlY3V0ZWQgdGhlbi5cbiAgICAvLyB3ZSdyZSBvbmx5IHRha2luZyB0ZXh0LCBzbyB0aGF0IGlzIGZpbmVcbiAgICBjb25zdCBwYXJ0cyA9IHBhcnNlTm9kZShuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGh0bWwsIFwidGV4dC9odG1sXCIpLmJvZHksIHBjLCBvcHRzKTtcbiAgICBpZiAob3B0cy5pc1F1b3RlZE1lc3NhZ2UpIHtcbiAgICAgICAgcHJlZml4TGluZXMocGFydHMsIFwiPiBcIiwgcGMpO1xuICAgIH1cbiAgICByZXR1cm4gcGFydHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBsYWluVGV4dE1lc3NhZ2UoYm9keTogc3RyaW5nLCBwYzogUGFydENyZWF0b3IsIG9wdHM6IElQYXJzZU9wdGlvbnMpOiBQYXJ0W10ge1xuICAgIGNvbnN0IGxpbmVzID0gYm9keS5zcGxpdCgvXFxyXFxufFxccnxcXG4vZyk7IC8vIHNwbGl0IG9uIGFueSBuZXctbGluZSBjb21iaW5hdGlvbiBub3QganVzdCBcXG4sIGNvbGxhcHNlcyBcXHJcXG5cbiAgICByZXR1cm4gbGluZXMucmVkdWNlKChwYXJ0cywgbGluZSwgaSkgPT4ge1xuICAgICAgICBpZiAob3B0cy5pc1F1b3RlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2gocGMucGxhaW4oXCI+IFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgcGFydHMucHVzaCguLi5wYXJzZUF0Um9vbU1lbnRpb25zKGxpbmUsIHBjLCBvcHRzKSk7XG4gICAgICAgIGNvbnN0IGlzTGFzdCA9IGkgPT09IGxpbmVzLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmICghaXNMYXN0KSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKHBjLm5ld2xpbmUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnRzO1xuICAgIH0sIFtdIGFzIFBhcnRbXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUV2ZW50KGV2ZW50OiBNYXRyaXhFdmVudCwgcGM6IFBhcnRDcmVhdG9yLCBvcHRzOiBJUGFyc2VPcHRpb25zID0geyBzaG91bGRFc2NhcGU6IHRydWUgfSk6IFBhcnRbXSB7XG4gICAgY29uc3QgY29udGVudCA9IGV2ZW50LmdldENvbnRlbnQoKTtcbiAgICBsZXQgcGFydHM6IFBhcnRbXTtcbiAgICBjb25zdCBpc0Vtb3RlID0gY29udGVudC5tc2d0eXBlID09PSBNc2dUeXBlLkVtb3RlO1xuICAgIGxldCBpc1JhaW5ib3cgPSBmYWxzZTtcblxuICAgIGlmIChjb250ZW50LmZvcm1hdCA9PT0gXCJvcmcubWF0cml4LmN1c3RvbS5odG1sXCIpIHtcbiAgICAgICAgcGFydHMgPSBwYXJzZUh0bWxNZXNzYWdlKGNvbnRlbnQuZm9ybWF0dGVkX2JvZHkgfHwgXCJcIiwgcGMsIG9wdHMpO1xuICAgICAgICBpZiAoY29udGVudC5ib2R5ICYmIGNvbnRlbnQuZm9ybWF0dGVkX2JvZHkgJiYgdGV4dFRvSHRtbFJhaW5ib3coY29udGVudC5ib2R5KSA9PT0gY29udGVudC5mb3JtYXR0ZWRfYm9keSkge1xuICAgICAgICAgICAgaXNSYWluYm93ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBib2R5ID0gY29udGVudC5ib2R5IHx8IFwiXCI7XG4gICAgICAgIGlmIChldmVudC5yZXBseUV2ZW50SWQpIHtcbiAgICAgICAgICAgIGJvZHkgPSBzdHJpcFBsYWluUmVwbHkoYm9keSk7XG4gICAgICAgIH1cbiAgICAgICAgcGFydHMgPSBwYXJzZVBsYWluVGV4dE1lc3NhZ2UoYm9keSwgcGMsIG9wdHMpO1xuICAgIH1cblxuICAgIGlmIChpc0Vtb3RlICYmIGlzUmFpbmJvdykge1xuICAgICAgICBwYXJ0cy51bnNoaWZ0KHBjLnBsYWluKFwiL3JhaW5ib3dtZSBcIikpO1xuICAgIH0gZWxzZSBpZiAoaXNSYWluYm93KSB7XG4gICAgICAgIHBhcnRzLnVuc2hpZnQocGMucGxhaW4oXCIvcmFpbmJvdyBcIikpO1xuICAgIH0gZWxzZSBpZiAoaXNFbW90ZSkge1xuICAgICAgICBwYXJ0cy51bnNoaWZ0KHBjLnBsYWluKFwiL21lIFwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnRzO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFTQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFFQSxJQUFBQyxVQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxXQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxNQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxVQUFBLEdBQUFDLHNCQUFBLENBQUFMLE9BQUE7QUFDQSxJQUFBTSxPQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxNQUFBLEdBQUFQLE9BQUE7QUFoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFXQSxNQUFNUSxVQUFVLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQzs7QUFF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LENBQUMsRUFBRSxFQUFZLENBQUM7QUFDcEI7QUFFTyxTQUFTc0YsVUFBVUEsQ0FBQ0MsS0FBa0IsRUFBRTFGLEVBQWUsRUFBRUMsSUFBbUIsR0FBRztFQUFFVSxZQUFZLEVBQUU7QUFBSyxDQUFDLEVBQVU7RUFDbEgsTUFBTWdGLE9BQU8sR0FBR0QsS0FBSyxDQUFDRSxVQUFVLENBQUMsQ0FBQztFQUNsQyxJQUFJekYsS0FBYTtFQUNqQixNQUFNMEYsT0FBTyxHQUFHRixPQUFPLENBQUNHLE9BQU8sS0FBS0MsZUFBTyxDQUFDQyxLQUFLO0VBQ2pELElBQUlDLFNBQVMsR0FBRyxLQUFLO0VBRXJCLElBQUlOLE9BQU8sQ0FBQ08sTUFBTSxLQUFLLHdCQUF3QixFQUFFO0lBQzdDL0YsS0FBSyxHQUFHNkUsZ0JBQWdCLENBQUNXLE9BQU8sQ0FBQ1EsY0FBYyxJQUFJLEVBQUUsRUFBRW5HLEVBQUUsRUFBRUMsSUFBSSxDQUFDO0lBQ2hFLElBQUkwRixPQUFPLENBQUNQLElBQUksSUFBSU8sT0FBTyxDQUFDUSxjQUFjLElBQUksSUFBQUMseUJBQWlCLEVBQUNULE9BQU8sQ0FBQ1AsSUFBSSxDQUFDLEtBQUtPLE9BQU8sQ0FBQ1EsY0FBYyxFQUFFO01BQ3RHRixTQUFTLEdBQUcsSUFBSTtJQUNwQjtFQUNKLENBQUMsTUFBTTtJQUNILElBQUliLElBQUksR0FBR08sT0FBTyxDQUFDUCxJQUFJLElBQUksRUFBRTtJQUM3QixJQUFJTSxLQUFLLENBQUNXLFlBQVksRUFBRTtNQUNwQmpCLElBQUksR0FBRyxJQUFBa0Isc0JBQWUsRUFBQ2xCLElBQUksQ0FBQztJQUNoQztJQUNBakYsS0FBSyxHQUFHbUYscUJBQXFCLENBQUNGLElBQUksRUFBRXBGLEVBQUUsRUFBRUMsSUFBSSxDQUFDO0VBQ2pEO0VBRUEsSUFBSTRGLE9BQU8sSUFBSUksU0FBUyxFQUFFO0lBQ3RCOUYsS0FBSyxDQUFDa0QsT0FBTyxDQUFDckQsRUFBRSxDQUFDNkIsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0VBQzFDLENBQUMsTUFBTSxJQUFJb0UsU0FBUyxFQUFFO0lBQ2xCOUYsS0FBSyxDQUFDa0QsT0FBTyxDQUFDckQsRUFBRSxDQUFDNkIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0VBQ3hDLENBQUMsTUFBTSxJQUFJZ0UsT0FBTyxFQUFFO0lBQ2hCMUYsS0FBSyxDQUFDa0QsT0FBTyxDQUFDckQsRUFBRSxDQUFDNkIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0VBQ25DO0VBRUEsT0FBTzFCLEtBQUs7QUFDaEIiLCJpZ25vcmVMaXN0IjpbXX0=