UNPKG

hivessh

Version:

HiveSsh is an innovative library designed to streamline SSH2 connections and simplify task execution on Linux servers.

353 lines 46.7 kB
export const logNames = [ "Fatal", "Error", "Warning", "Info", "Trace", "Debug", ]; export const logShorts = [ "FAT", "ERR", "WAR", "INF", "TRA", "DEB", ]; export const customLogType = {}; export const fatalLogType = getLogTypeByLevel(0); export const errorLogType = getLogTypeByLevel(4); export const warningLogType = getLogTypeByLevel(8); export const infoLogType = getLogTypeByLevel(12); export const traceLogType = getLogTypeByLevel(16); export const debugLogType = getLogTypeByLevel(20); export function getLogTypeByLevel(level) { if (level == 0 || level == 4 || level == 8 || level == 12 || level == 16 || level == 20) { return { level: level, name: logNames[level / 4], short: logShorts[level / 4] }; } if (customLogType[level]) { return { name: customLogType[level].name, short: (customLogType[level].short) .toUpperCase() .slice(0, 3), level: level, }; } return { level: level, name: "Unknown", short: "UNK", }; } export function defaultLogParser(log) { return getLogTimestemp(log.time) + "|" + log.type.short + "|" + (log.area ? log.area + "| " : " ") + (log.value .split("\n") .join("\n ")) + (log.value.includes("\n") ? "\n" : ""); } export function getLogTimestemp(date) { if (typeof date == "number") { date = new Date(date); } let year = date.getFullYear(); let month = ('0' + (date.getMonth() + 1)).slice(-2); let day = ('0' + date.getDate()).slice(-2); let hours = ('0' + date.getHours()).slice(-2); let minutes = ('0' + date.getMinutes()).slice(-2); let seconds = ('0' + date.getSeconds()).slice(-2); return `${year}.${month}.${day}-${hours}:${minutes}:${seconds}`; } export class Logger { prefix; logs; pipeTargets; static StdOut = new Logger((log) => { console.info(defaultLogParser(log)); }); static StdStreams = new Logger((log) => { if (log.type.level < 10) { console.error(defaultLogParser(log)); } else { console.info(defaultLogParser(log)); } }); constructor(pipeTargets = undefined, prefix = "", logs = []) { this.prefix = prefix; this.logs = logs; if (pipeTargets) { if (Array.isArray(pipeTargets)) { this.pipeTargets = pipeTargets; } else { this.pipeTargets = [pipeTargets]; } for (const pipeTarget of this.pipeTargets) { if (!pipeTarget || pipeTarget == null || (typeof pipeTarget != "function" && typeof pipeTarget != "object")) { throw new Error("Pipe target need to be an object with log method or a calback function"); } else if (pipeTarget == this) { throw new Error("Cant select a logger as its own pipe target"); } } } } rewrite = (options) => { const settings = { ...options, isArea: !options.isArea ? undefined : Array.isArray(options.isArea) ? options.isArea : [options.isArea], notArea: !options.notArea ? undefined : Array.isArray(options.notArea) ? options.notArea : [options.notArea], startsWithArea: !options.startsWithArea ? undefined : Array.isArray(options.startsWithArea) ? options.startsWithArea : [options.startsWithArea], newAreaPrefix: options.newAreaPrefix ? parseArea(options.newAreaPrefix) : undefined, }; return (log) => { if (log.area) { if (settings.justWithoutArea == true) { return; } if (settings.notArea && settings.notArea.includes(log.area)) { return; } if (settings.isArea && !settings.isArea.includes(log.area)) { return; } if (settings.startsWithArea) { let found = false; for (const startsWithArea of settings.startsWithArea) { if (log.area.startsWith(startsWithArea)) { found = true; break; } } if (!found) { return; } } } else if (settings.justWithArea == true || (settings.isArea && settings.isArea.length > 0 || settings.startsWithArea && settings.startsWithArea.length > 0)) { return; } if (settings.maxLogLevel && log.type.level > settings.maxLogLevel) { return; } if (settings.minLogLevel && log.type.level < settings.minLogLevel) { return; } this.addLog({ ...log, area: log.area ? (settings.newAreaPrefix ? settings.newAreaPrefix + "-" + log.area : log.area) : (settings.newAreaPrefix ? settings.newAreaPrefix : undefined) }); }; }; pipe(pipeTarget, justNewLogs = false) { if (!pipeTarget || pipeTarget == null || (typeof pipeTarget != "function" && typeof pipeTarget != "object")) { throw new Error("Pipe target need to be an object with log method or a calback function"); } else if (pipeTarget == this) { throw new Error("Cant select a logger as its own pipe target"); } if (!justNewLogs) { for (const log of this.logs) { if (typeof pipeTarget == "function") { pipeTarget(log); } else { pipeTarget.addLog(log); } } } if (!this.pipeTargets) { this.pipeTargets = []; } this.pipeTargets.push(pipeTarget); } unpipe(pipeTarget) { if (!this.pipeTargets || pipeTarget == this) { return; } if (!pipeTarget || pipeTarget == null || (typeof pipeTarget != "function" && typeof pipeTarget != "object")) { throw new Error("Pipe target need to be an object with log method or a calback function"); } if (typeof pipeTarget == "function") { const pipeTargetString = "" + pipeTarget; this.pipeTargets = this.pipeTargets.filter((v) => { if (typeof v == "function") { return "" + v != pipeTargetString; } return true; }); } else { this.pipeTargets = this.pipeTargets.filter((v) => { if (typeof v == "object") { return v != pipeTarget; } return true; }); } if (this.pipeTargets.length == 0) { this.pipeTargets = undefined; } } unpipeAll() { this.pipeTargets = undefined; } clear() { this.logs = []; } fatal(value, area) { this.log(fatalLogType, value, area); } error(value, area) { this.log(errorLogType, value, area); } warn(value, area) { this.log(warningLogType, value, area); } info(value, area) { this.log(infoLogType, value, area); } trace(value, area) { this.log(traceLogType, value, area); } debug(value, area) { this.log(debugLogType, value, area); } log(level, value, area) { this.addLog({ type: typeof level == "number" ? getLogTypeByLevel(level) : level, value: (this.prefix != undefined ? this.prefix + value : value), area: area ? parseArea(area) : undefined, time: Date.now(), }); } addLog(log) { this.logs.push(log); if (this.pipeTargets) { for (const pipeTarget of this.pipeTargets) { if (typeof pipeTarget == "function") { pipeTarget(log); } else { pipeTarget.addLog(log); } } } } getAbove(level, includeLevel) { return this.logs.filter((v) => includeLevel ? v.type.level >= level : v.type.level > level); } getBelow(level, includeLevel) { return this.logs.filter((v) => includeLevel ? v.type.level <= level : v.type.level < level); } getLogsWithAreas(areas) { return this.logs.filter((v) => v.area ? areas.includes(v.area) : false); } getLogsInArea(areas) { return this.logs.filter((v) => { if (!v.area) { return false; } for (const area of areas) { if (area.startsWith(v.area)) { return true; } } return false; }); } getLogsNotInAreas(areas) { return this.logs.filter((v) => v.area ? !areas.includes(v.area) : !areas.includes("default")); } parseLogs(logParser = defaultLogParser) { let out = ""; for (const log of this.logs) { out += logParser(log) + "\n"; } return out; } } export function parseArea(area) { area = area.toLowerCase(); while (area.startsWith("-")) { area = area.slice(1); } while (area.endsWith("-")) { area = area.slice(0, -1); } if (area.includes(" ")) { area = area.split(" ").join("-"); } if (area.includes("_")) { area = area.split("_").join("-"); } if (area.includes("#")) { area = area.split("#").join("-"); } if (area.includes(";")) { area = area.split(";").join("-"); } if (area.includes("/")) { area = area.split("/").join("-"); } if (area.includes("\\")) { area = area.split("\\").join("-"); } return area; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUc7SUFDcEIsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPO0NBQy9DLENBQUE7QUFHVixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUc7SUFDckIsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLO0NBQ2xDLENBQUE7QUFHVixNQUFNLENBQUMsTUFBTSxhQUFhLEdBS3RCLEVBQUUsQ0FBQTtBQUVOLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBWSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUN6RCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQVksaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDekQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFZLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQzNELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBWSxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUN6RCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQVksaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDMUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFZLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBUTFELE1BQU0sVUFBVSxpQkFBaUIsQ0FDN0IsS0FBYTtJQUViLElBQ0ksS0FBSyxJQUFJLENBQUM7UUFDVixLQUFLLElBQUksQ0FBQztRQUNWLEtBQUssSUFBSSxDQUFDO1FBQ1YsS0FBSyxJQUFJLEVBQUU7UUFDWCxLQUFLLElBQUksRUFBRTtRQUNYLEtBQUssSUFBSSxFQUFFLEVBQ2IsQ0FBQztRQUNDLE9BQU87WUFDSCxLQUFLLEVBQUUsS0FB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SUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNyQixJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDcEMsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3JCLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNwQyxDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDckIsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3BDLENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNyQixJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDcEMsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3RCLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNyQyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUE7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5leHBvcnQgY29uc3QgbG9nTmFtZXMgPSBbXG4gICAgXCJGYXRhbFwiLCBcIkVycm9yXCIsIFwiV2FybmluZ1wiLCBcIkluZm9cIiwgXCJUcmFjZVwiLCBcIkRlYnVnXCIsXG5dIGFzIGNvbnN0XG5leHBvcnQgdHlwZSBMb2dOYW1lID0gdHlwZW9mIGxvZ05hbWVzW251bWJlcl1cblxuZXhwb3J0IGNvbnN0IGxvZ1Nob3J0cyA9IFtcbiAgICBcIkZBVFwiLCBcIkVSUlwiLCBcIldBUlwiLCBcIklORlwiLCBcIlRSQVwiLCBcIkRFQlwiLFxuXSBhcyBjb25zdFxuZXhwb3J0IHR5cGUgTG9nU2hvcnQgPSB0eXBlb2YgbG9nU2hvcnRzW251bWJlcl1cblxuZXhwb3J0IGNvbnN0IGN1c3RvbUxvZ1R5cGU6IHtcbiAgICBbbGV2ZWw6IG51bWJlcl06IHtcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICBzaG9ydDogc3RyaW5nLFxuICAgIH1cbn0gPSB7fVxuXG5leHBvcnQgY29uc3QgZmF0YWxMb2dUeXBlOiBMb2dUeXBlID0gZ2V0TG9nVHlwZUJ5TGV2ZWwoMClcbmV4cG9ydCBjb25zdCBlcnJvckxvZ1R5cGU6IExvZ1R5cGUgPSBnZXRMb2dUeXBlQnlMZXZlbCg0KVxuZXhwb3J0IGNvbnN0IHdhcm5pbmdMb2dUeXBlOiBMb2dUeXBlID0gZ2V0TG9nVHlwZUJ5TGV2ZWwoOClcbmV4cG9ydCBjb25zdCBpbmZvTG9nVHlwZTogTG9nVHlwZSA9IGdldExvZ1R5cGVCeUxldmVsKDEyKVxuZXhwb3J0IGNvbnN0IHRyYWNlTG9nVHlwZTogTG9nVHlwZSA9IGdldExvZ1R5cGVCeUxldmVsKDE2KVxuZXhwb3J0IGNvbnN0IGRlYnVnTG9nVHlwZTogTG9nVHlwZSA9IGdldExvZ1R5cGVCeUxldmVsKDIwKVxuXG5leHBvcnQgaW50ZXJmYWNlIExvZ1R5cGUge1xuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzaG9ydDogc3RyaW5nLFxuICAgIGxldmVsOiBudW1iZXIsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2dUeXBlQnlMZXZlbChcbiAgICBsZXZlbDogbnVtYmVyXG4pOiBMb2dUeXBlIHtcbiAgICBpZiAoXG4gICAgICAgIGxldmVsID09IDAgfHxcbiAgICAgICAgbGV2ZWwgPT0gNCB8fFxuICAgICAgICBsZXZlbCA9PSA4IHx8XG4gICAgICAgIGxldmVsID09IDEyIHx8XG4gICAgICAgIGxldmVsID09IDE2IHx8XG4gICAgICAgIGxldmVsID09IDIwXG4gICAgKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZXZlbDogbGV2ZWwsXG4gICAgICAgICAgICBuYW1lOiBsb2dOYW1lc1tsZXZlbCAvIDRdLFxuICAgICAgICAgICAgc2hvcnQ6IGxvZ1Nob3J0c1tsZXZlbCAvIDRdXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY3VzdG9tTG9nVHlwZVtsZXZlbF0pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGN1c3RvbUxvZ1R5cGVbbGV2ZWxdLm5hbWUsXG4gICAgICAgICAgICBzaG9ydDogKGN1c3RvbUxvZ1R5cGVbbGV2ZWxdLnNob3J0KVxuICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgICAgICAgbGV2ZWw6IGxldmVsLFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGV2ZWw6IGxldmVsLFxuICAgICAgICBuYW1lOiBcIlVua25vd25cIixcbiAgICAgICAgc2hvcnQ6IFwiVU5LXCIsXG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvZyB7XG4gICAgdGltZTogbnVtYmVyLFxuICAgIHR5cGU6IExvZ1R5cGUsXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBhcmVhPzogc3RyaW5nLFxufVxuXG5leHBvcnQgdHlwZSBMb2dQYXJzZXIgPSAobG9nOiBMb2cpID0+IHN0cmluZ1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdExvZ1BhcnNlcihsb2c6IExvZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdldExvZ1RpbWVzdGVtcChsb2cudGltZSkgK1xuICAgICAgICBcInxcIiArIGxvZy50eXBlLnNob3J0ICtcbiAgICAgICAgXCJ8XCIgKyAoXG4gICAgICAgICAgICBsb2cuYXJlYSA/XG4gICAgICAgICAgICAgICAgbG9nLmFyZWEgKyBcInwgXCIgOlxuICAgICAgICAgICAgICAgIFwiIFwiXG4gICAgICAgICkgKyAoXG4gICAgICAgICAgICBsb2cudmFsdWVcbiAgICAgICAgICAgICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgICAgICAgICAuam9pbihcIlxcbiAgXCIpXG4gICAgICAgICkgKyAoXG4gICAgICAgICAgICBsb2cudmFsdWUuaW5jbHVkZXMoXCJcXG5cIikgP1xuICAgICAgICAgICAgICAgIFwiXFxuXCIgOlxuICAgICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9nVGltZXN0ZW1wKGRhdGU6IERhdGUgfCBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgZGF0ZSA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgIGRhdGUgPSBuZXcgRGF0ZShkYXRlKVxuICAgIH1cblxuICAgIGxldCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpXG4gICAgbGV0IG1vbnRoID0gKCcwJyArIChkYXRlLmdldE1vbnRoKCkgKyAxKSkuc2xpY2UoLTIpXG4gICAgbGV0IGRheSA9ICgnMCcgKyBkYXRlLmdldERhdGUoKSkuc2xpY2UoLTIpXG4gICAgbGV0IGhvdXJzID0gKCcwJyArIGRhdGUuZ2V0SG91cnMoKSkuc2xpY2UoLTIpXG4gICAgbGV0IG1pbnV0ZXMgPSAoJzAnICsgZGF0ZS5nZXRNaW51dGVzKCkpLnNsaWNlKC0yKVxuICAgIGxldCBzZWNvbmRzID0gKCcwJyArIGRhdGUuZ2V0U2Vjb25kcygpKS5zbGljZSgtMilcblxuICAgIHJldHVybiBgJHt5ZWFyfS4ke21vbnRofS4ke2RheX0tJHtob3Vyc306JHttaW51dGVzfToke3NlY29uZHN9YFxufVxuXG5leHBvcnQgdHlwZSBQaXBlVGFyZ2V0RnVuYyA9ICgobG9nOiBMb2cpID0+IGFueSlcbmV4cG9ydCBpbnRlcmZhY2UgUGlwZVRhcmdldE9iamVjdCB7XG4gICAgYWRkTG9nOiAobG9nOiBMb2cpID0+IGFueVxufVxuXG5leHBvcnQgdHlwZSBQaXBlVGFyZ2V0ID0gUGlwZVRhcmdldEZ1bmMgfCBQaXBlVGFyZ2V0T2JqZWN0XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9nUmV3cml0ZU9wdGlvbnMge1xuICAgIGlzQXJlYT86IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIG5vdEFyZWE/OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBzdGFydHNXaXRoQXJlYT86IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIG5ld0FyZWFQcmVmaXg/OiBzdHJpbmcsXG4gICAganVzdFdpdGhvdXRBcmVhPzogYm9vbGVhbixcbiAgICBqdXN0V2l0aEFyZWE/OiBib29sZWFuLFxuICAgIG1pbkxvZ0xldmVsPzogbnVtYmVyLFxuICAgIG1heExvZ0xldmVsPzogbnVtYmVyLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvZ1Jld3JpdGVTZXR0aW5ncyB7XG4gICAgaXNBcmVhOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgICBub3RBcmVhOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgICBzdGFydHNXaXRoQXJlYTogc3RyaW5nW10gfCB1bmRlZmluZWQsXG4gICAgbmV3QXJlYVByZWZpeDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGp1c3RXaXRob3V0QXJlYT86IGJvb2xlYW4sXG4gICAganVzdFdpdGhBcmVhPzogYm9vbGVhbixcbiAgICBtaW5Mb2dMZXZlbD86IG51bWJlcixcbiAgICBtYXhMb2dMZXZlbD86IG51bWJlcixcbn1cblxuZXhwb3J0IGNsYXNzIExvZ2dlciB7XG4gICAgcGlwZVRhcmdldHM6IFBpcGVUYXJnZXRbXSB8IHVuZGVmaW5lZFxuXG4gICAgc3RhdGljIFN0ZE91dDogTG9nZ2VyID0gbmV3IExvZ2dlcihcbiAgICAgICAgKGxvZzogTG9nKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oZGVmYXVsdExvZ1BhcnNlcihsb2cpKVxuICAgICAgICB9XG4gICAgKVxuXG4gICAgc3RhdGljIFN0ZFN0cmVhbXM6IExvZ2dlciA9IG5ldyBMb2dnZXIoXG4gICAgICAgIChsb2c6IExvZyk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKGxvZy50eXBlLmxldmVsIDwgMTApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGRlZmF1bHRMb2dQYXJzZXIobG9nKSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKGRlZmF1bHRMb2dQYXJzZXIobG9nKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIClcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwaXBlVGFyZ2V0czogUGlwZVRhcmdldCB8IFBpcGVUYXJnZXRbXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICAgICAgcHVibGljIHByZWZpeDogc3RyaW5nIHwgdW5kZWZpbmVkID0gXCJcIixcbiAgICAgICAgcHVibGljIGxvZ3M6IExvZ1tdID0gW10sXG4gICAgKSB7XG4gICAgICAgIGlmIChwaXBlVGFyZ2V0cykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGlwZVRhcmdldHMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5waXBlVGFyZ2V0cyA9IHBpcGVUYXJnZXRzXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucGlwZVRhcmdldHMgPSBbcGlwZVRhcmdldHNdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBpcGVUYXJnZXQgb2YgdGhpcy5waXBlVGFyZ2V0cykge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIXBpcGVUYXJnZXQgfHxcbiAgICAgICAgICAgICAgICAgICAgcGlwZVRhcmdldCA9PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwaXBlVGFyZ2V0ICE9IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHBpcGVUYXJnZXQgIT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUGlwZSB0YXJnZXQgbmVlZCB0byBiZSBhbiBvYmplY3Qgd2l0aCBsb2cgbWV0aG9kIG9yIGEgY2FsYmFjayBmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBpcGVUYXJnZXQgPT0gdGhpcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW50IHNlbGVjdCBhIGxvZ2dlciBhcyBpdHMgb3duIHBpcGUgdGFyZ2V0XCIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV3cml0ZSA9IChcbiAgICAgICAgb3B0aW9uczogTG9nUmV3cml0ZU9wdGlvbnNcbiAgICApOiBQaXBlVGFyZ2V0RnVuYyA9PiB7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzOiBMb2dSZXdyaXRlU2V0dGluZ3MgPSB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgaXNBcmVhOiAhb3B0aW9ucy5pc0FyZWEgP1xuICAgICAgICAgICAgICAgIHVuZGVmaW5lZCA6XG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShvcHRpb25zLmlzQXJlYSkgP1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmlzQXJlYSA6XG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25zLmlzQXJlYV0sXG4gICAgICAgICAgICBub3RBcmVhOiAhb3B0aW9ucy5ub3RBcmVhID9cbiAgICAgICAgICAgICAgICB1bmRlZmluZWQgOlxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkob3B0aW9ucy5ub3RBcmVhKSA/XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMubm90QXJlYSA6XG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25zLm5vdEFyZWFdLFxuICAgICAgICAgICAgc3RhcnRzV2l0aEFyZWE6ICFvcHRpb25zLnN0YXJ0c1dpdGhBcmVhID9cbiAgICAgICAgICAgICAgICB1bmRlZmluZWQgOlxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkob3B0aW9ucy5zdGFydHNXaXRoQXJlYSkgP1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnN0YXJ0c1dpdGhBcmVhIDpcbiAgICAgICAgICAgICAgICAgICAgW29wdGlvbnMuc3RhcnRzV2l0aEFyZWFdLFxuICAgICAgICAgICAgbmV3QXJlYVByZWZpeDogb3B0aW9ucy5uZXdBcmVhUHJlZml4ID9cbiAgICAgICAgICAgICAgICBwYXJzZUFyZWEob3B0aW9ucy5uZXdBcmVhUHJlZml4KSA6XG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChsb2cpID0+IHtcbiAgICAgICAgICAgIGlmIChsb2cuYXJlYSkge1xuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5qdXN0V2l0aG91dEFyZWEgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm5vdEFyZWEgJiZcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mubm90QXJlYS5pbmNsdWRlcyhsb2cuYXJlYSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5pc0FyZWEgJiZcbiAgICAgICAgICAgICAgICAgICAgIXNldHRpbmdzLmlzQXJlYS5pbmNsdWRlcyhsb2cuYXJlYSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zdGFydHNXaXRoQXJlYVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQ6IGJvb2xlYW4gPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0YXJ0c1dpdGhBcmVhIG9mIHNldHRpbmdzLnN0YXJ0c1dpdGhBcmVhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmFyZWEuc3RhcnRzV2l0aChzdGFydHNXaXRoQXJlYSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBzZXR0aW5ncy5qdXN0V2l0aEFyZWEgPT0gdHJ1ZSB8fFxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuaXNBcmVhICYmXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmlzQXJlYS5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnN0YXJ0c1dpdGhBcmVhICYmXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnN0YXJ0c1dpdGhBcmVhLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNldHRpbmdzLm1heExvZ0xldmVsICYmXG4gICAgICAgICAgICAgICAgbG9nLnR5cGUubGV2ZWwgPiBzZXR0aW5ncy5tYXhMb2dMZXZlbFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBzZXR0aW5ncy5taW5Mb2dMZXZlbCAmJlxuICAgICAgICAgICAgICAgIGxvZy50eXBlLmxldmVsIDwgc2V0dGluZ3MubWluTG9nTGV2ZWxcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmFkZExvZyh7XG4gICAgICAgICAgICAgICAgLi4ubG9nLFxuICAgICAgICAgICAgICAgIGFyZWE6IGxvZy5hcmVhID8gKFxuICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5uZXdBcmVhUHJlZml4ID9cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm5ld0FyZWFQcmVmaXggKyBcIi1cIiArIGxvZy5hcmVhIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5hcmVhXG4gICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MubmV3QXJlYVByZWZpeCA/XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5uZXdBcmVhUHJlZml4IDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwaXBlKFxuICAgICAgICBwaXBlVGFyZ2V0OiBQaXBlVGFyZ2V0LFxuICAgICAgICBqdXN0TmV3TG9nczogYm9vbGVhbiA9IGZhbHNlXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICFwaXBlVGFyZ2V0IHx8XG4gICAgICAgICAgICBwaXBlVGFyZ2V0ID09IG51bGwgfHxcbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICB0eXBlb2YgcGlwZVRhcmdldCAhPSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgcGlwZVRhcmdldCAhPSBcIm9iamVjdFwiXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiUGlwZSB0YXJnZXQgbmVlZCB0byBiZSBhbiBvYmplY3Qgd2l0aCBsb2cgbWV0aG9kIG9yIGEgY2FsYmFjayBmdW5jdGlvblwiXG4gICAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSBpZiAocGlwZVRhcmdldCA9PSB0aGlzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW50IHNlbGVjdCBhIGxvZ2dlciBhcyBpdHMgb3duIHBpcGUgdGFyZ2V0XCIpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWp1c3ROZXdMb2dzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxvZyBvZiB0aGlzLmxvZ3MpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBpcGVUYXJnZXQgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHBpcGVUYXJnZXQobG9nKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBpcGVUYXJnZXQuYWRkTG9nKGxvZylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMucGlwZVRhcmdldHMpIHtcbiAgICAgICAgICAgIHRoaXMucGlwZVRhcmdldHMgPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5waXBlVGFyZ2V0cy5wdXNoKHBpcGVUYXJnZXQpXG4gICAgfVxuXG4gICAgdW5waXBlKFxuICAgICAgICBwaXBlVGFyZ2V0OiBQaXBlVGFyZ2V0LFxuICAgICk6IHZvaWQge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5waXBlVGFyZ2V0cyB8fFxuICAgICAgICAgICAgcGlwZVRhcmdldCA9PSB0aGlzXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhcGlwZVRhcmdldCB8fFxuICAgICAgICAgICAgcGlwZVRhcmdldCA9PSBudWxsIHx8XG4gICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgdHlwZW9mIHBpcGVUYXJnZXQgIT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHBpcGVUYXJnZXQgIT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIlBpcGUgdGFyZ2V0IG5lZWQgdG8gYmUgYW4gb2JqZWN0IHdpdGggbG9nIG1ldGhvZCBvciBhIGNhbGJhY2sgZnVuY3Rpb25cIlxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwaXBlVGFyZ2V0ID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgY29uc3QgcGlwZVRhcmdldFN0cmluZyA9IFwiXCIgKyBwaXBlVGFyZ2V0XG5cbiAgICAgICAgICAgIHRoaXMucGlwZVRhcmdldHMgPSB0aGlzLnBpcGVUYXJnZXRzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAodikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHYgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIiArIHYgIT0gcGlwZVRhcmdldFN0cmluZ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5waXBlVGFyZ2V0cyA9IHRoaXMucGlwZVRhcmdldHMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdiAhPSBwaXBlVGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5waXBlVGFyZ2V0cy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5waXBlVGFyZ2V0cyA9IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdW5waXBlQWxsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBpcGVUYXJnZXRzID0gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9ncyA9IFtdXG4gICAgfVxuXG4gICAgZmF0YWwoXG4gICAgICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgICAgIGFyZWE/OiBzdHJpbmcsXG4gICAgKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgZmF0YWxMb2dUeXBlLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBhcmVhXG4gICAgICAgIClcbiAgICB9XG5cbiAgICBlcnJvcihcbiAgICAgICAgdmFsdWU6IHN0cmluZyxcbiAgICAgICAgYXJlYT86IHN0cmluZyxcbiAgICApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2coXG4gICAgICAgICAgICBlcnJvckxvZ1R5cGUsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGFyZWFcbiAgICAgICAgKVxuICAgIH1cblxuICAgIHdhcm4oXG4gICAgICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgICAgIGFyZWE/OiBzdHJpbmcsXG4gICAgKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgd2FybmluZ0xvZ1R5cGUsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGFyZWFcbiAgICAgICAgKVxuICAgIH1cblxuICAgIGluZm8oXG4gICAgICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgICAgIGFyZWE/OiBzdHJpbmcsXG4gICAgKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgaW5mb0xvZ1R5cGUsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGFyZWFcbiAgICAgICAgKVxuICAgIH1cblxuICAgIHRyYWNlKFxuICAgICAgICB2YWx1ZTogc3RyaW5nLFxuICAgICAgICBhcmVhPzogc3RyaW5nLFxuICAgICk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvZyhcbiAgICAgICAgICAgIHRyYWNlTG9nVHlwZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgYXJlYVxuICAgICAgICApXG4gICAgfVxuXG4gICAgZGVidWcoXG4gICAgICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgICAgIGFyZWE/OiBzdHJpbmcsXG4gICAgKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgZGVidWdMb2dUeXBlLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBhcmVhXG4gICAgICAgIClcbiAgICB9XG5cbiAgICBsb2coXG4gICAgICAgIGxldmVsOiBudW1iZXIgfCBMb2dUeXBlLFxuICAgICAgICB2YWx1ZTogc3RyaW5nLFxuICAgICAgICBhcmVhPzogc3RyaW5nLFxuICAgICk6IHZvaWQge1xuICAgICAgICB0aGlzLmFkZExvZyh7XG4gICAgICAgICAgICB0eXBlOiB0eXBlb2YgbGV2ZWwgPT0gXCJudW1iZXJcIiA/XG4gICAgICAgICAgICAgICAgZ2V0TG9nVHlwZUJ5TGV2ZWwobGV2ZWwpIDpcbiAgICAgICAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICAgIHZhbHVlOiAoXG4gICAgICAgICAgICAgICAgdGhpcy5wcmVmaXggIT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVmaXggKyB2YWx1ZSA6XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgYXJlYTogYXJlYSA/XG4gICAgICAgICAgICAgICAgcGFyc2VBcmVhKGFyZWEpIDpcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICB0aW1lOiBEYXRlLm5vdygpLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGFkZExvZyhcbiAgICAgICAgbG9nOiBMb2csXG4gICAgKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9ncy5wdXNoKGxvZylcblxuICAgICAgICBpZiAodGhpcy5waXBlVGFyZ2V0cykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwaXBlVGFyZ2V0IG9mIHRoaXMucGlwZVRhcmdldHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBpcGVUYXJnZXQgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHBpcGVUYXJnZXQobG9nKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBpcGVUYXJnZXQuYWRkTG9nKGxvZylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRBYm92ZShcbiAgICAgICAgbGV2ZWw6IG51bWJlcixcbiAgICAgICAgaW5jbHVkZUxldmVsOiBib29sZWFuLFxuICAgICk6IExvZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9ncy5maWx0ZXIoXG4gICAgICAgICAgICAodikgPT4gaW5jbHVkZUxldmVsID9cbiAgICAgICAgICAgICAgICB2LnR5cGUubGV2ZWwgPj0gbGV2ZWwgOlxuICAgICAgICAgICAgICAgIHYudHlwZS5sZXZlbCA+IGxldmVsXG4gICAgICAgIClcbiAgICB9XG5cbiAgICBnZXRCZWxvdyhcbiAgICAgICAgbGV2ZWw6IG51bWJlcixcbiAgICAgICAgaW5jbHVkZUxldmVsOiBib29sZWFuLFxuICAgICk6IExvZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9ncy5maWx0ZXIoXG4gICAgICAgICAgICAodikgPT4gaW5jbHVkZUxldmVsID9cbiAgICAgICAgICAgICAgICB2LnR5cGUubGV2ZWwgPD0gbGV2ZWwgOlxuICAgICAgICAgICAgICAgIHYudHlwZS5sZXZlbCA8IGxldmVsXG4gICAgICAgIClcbiAgICB9XG5cbiAgICBnZXRMb2dzV2l0aEFyZWFzKFxuICAgICAgICBhcmVhczogc3RyaW5nW11cbiAgICApOiBMb2dbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvZ3MuZmlsdGVyKFxuICAgICAgICAgICAgKHYpID0+IHYuYXJlYSA/XG4gICAgICAgICAgICAgICAgYXJlYXMuaW5jbHVkZXModi5hcmVhKSA6XG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgKVxuICAgIH1cblxuICAgIGdldExvZ3NJbkFyZWEoXG4gICAgICAgIGFyZWFzOiBzdHJpbmdbXVxuICAgICk6IExvZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9ncy5maWx0ZXIoXG4gICAgICAgICAgICAodikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdi5hcmVhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXJlYSBvZiBhcmVhcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJlYS5zdGFydHNXaXRoKHYuYXJlYSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIClcbiAgICB9XG5cbiAgICBnZXRMb2dzTm90SW5BcmVhcyhcbiAgICAgICAgYXJlYXM6IHN0cmluZ1tdXG4gICAgKTogTG9nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2dzLmZpbHRlcihcbiAgICAgICAgICAgICh2KSA9PiB2LmFyZWEgP1xuICAgICAgICAgICAgICAgICFhcmVhcy5pbmNsdWRlcyh2LmFyZWEpIDpcbiAgICAgICAgICAgICAgICAhYXJlYXMuaW5jbHVkZXMoXCJkZWZhdWx0XCIpXG4gICAgICAgIClcbiAgICB9XG5cbiAgICBwYXJzZUxvZ3MoXG4gICAgICAgIGxvZ1BhcnNlcjogTG9nUGFyc2VyID0gZGVmYXVsdExvZ1BhcnNlcixcbiAgICApIHtcbiAgICAgICAgbGV0IG91dDogc3RyaW5nID0gXCJcIlxuICAgICAgICBmb3IgKGNvbnN0IGxvZyBvZiB0aGlzLmxvZ3MpIHtcbiAgICAgICAgICAgIG91dCArPSBsb2dQYXJzZXIobG9nKSArIFwiXFxuXCJcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VBcmVhKFxuICAgIGFyZWE6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgICBhcmVhID0gYXJlYS50b0xvd2VyQ2FzZSgpXG4gICAgd2hpbGUgKGFyZWEuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgYXJlYSA9IGFyZWEuc2xpY2UoMSlcbiAgICB9XG5cbiAgICB3aGlsZSAoYXJlYS5lbmRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgYXJlYSA9IGFyZWEuc2xpY2UoMCwgLTEpXG4gICAgfVxuXG4gICAgaWYgKGFyZWEuaW5jbHVkZXMoXCIgXCIpKSB7XG4gICAgICAgIGFyZWEgPSBhcmVhLnNwbGl0KFwiIFwiKS5qb2luKFwiLVwiKVxuICAgIH1cbiAgICBpZiAoYXJlYS5pbmNsdWRlcyhcIl9cIikpIHtcbiAgICAgICAgYXJlYSA9IGFyZWEuc3BsaXQoXCJfXCIpLmpvaW4oXCItXCIpXG4gICAgfVxuICAgIGlmIChhcmVhLmluY2x1ZGVzKFwiI1wiKSkge1xuICAgICAgICBhcmVhID0gYXJlYS5zcGxpdChcIiNcIikuam9pbihcIi1cIilcbiAgICB9XG4gICAgaWYgKGFyZWEuaW5jbHVkZXMoXCI7XCIpKSB7XG4gICAgICAgIGFyZWEgPSBhcmVhLnNwbGl0KFwiO1wiKS5qb2luKFwiLVwiKVxuICAgIH1cbiAgICBpZiAoYXJlYS5pbmNsdWRlcyhcIi9cIikpIHtcbiAgICAgICAgYXJlYSA9IGFyZWEuc3BsaXQoXCIvXCIpLmpvaW4oXCItXCIpXG4gICAgfVxuICAgIGlmIChhcmVhLmluY2x1ZGVzKFwiXFxcXFwiKSkge1xuICAgICAgICBhcmVhID0gYXJlYS5zcGxpdChcIlxcXFxcIikuam9pbihcIi1cIilcbiAgICB9XG4gICAgcmV0dXJuIGFyZWFcbn0iXX0=