diff --git a/dist/kasper.js b/dist/kasper.js index 66a5e2a..37e15b9 100644 --- a/dist/kasper.js +++ b/dist/kasper.js @@ -63,24 +63,41 @@ const ErrorTemplates = { "K007-1": (a) => a.message, "K007-2": (a) => a.message }; +function codeSnippet(source, line, col, context = 2) { + const lines = source.split("\n"); + const errorLine = line - 1; + const start = Math.max(0, errorLine - context); + const end = Math.min(lines.length - 1, errorLine + context); + const result = [""]; + for (let i = start; i <= end; i++) { + const indicator = i === errorLine ? ">" : " "; + result.push(` ${indicator} | ${lines[i]}`); + if (i === errorLine && col > 0) { + const pointer = " ".repeat(6 + col - 1) + "^"; + result.push(pointer); + } + } + return result.join("\n"); +} class KasperError extends Error { - constructor(code, args = {}, line, col, tagName) { + constructor(code, args = {}, options = {}) { + const { line, col, tag, source } = options; const isDev = typeof process !== "undefined" ? process.env.NODE_ENV !== "production" : true; const template = ErrorTemplates[code]; const message = template ? template(args) : typeof args === "string" ? args : "Unknown error"; - const location = line !== void 0 ? ` (${line}:${col})` : ""; - const tagInfo = tagName ? ` - at <${tagName}>` : ""; + const tagInfo = tag ? ` + at <${tag}>` : ""; + const snippet = line !== void 0 && source ? codeSnippet(source, line, col ?? 0) : ""; const link = isDev ? ` - -See: https://kasperjs.top/reference/errors#${code.toLowerCase().replace(".", "")}` : ""; - super(`[${code}] ${message}${location}${tagInfo}${link}`); +See: https://kasperjs.top/reference/errors#${code.toLowerCase().replace(".", "")} +` : ""; + super(`[${code}] ${message}${tagInfo}${snippet}${link}`); this.code = code; this.args = args; + this.name = "KasperError"; this.line = line; this.col = col; - this.tagName = tagName; - this.name = "KasperError"; + this.tagName = tag; } withTag(tagName) { if (!this.tagName) { @@ -91,6 +108,28 @@ See: https://kasperjs.top/reference/errors#${code.toLowerCase().replace(".", "") return this; } } +let globalHandler = null; +function setErrorHandler(handler) { + globalHandler = handler ?? null; +} +function handleError(error, phase, component) { + const err = error instanceof Error ? error : new Error(String(error)); + if (component && typeof component.onError === "function") { + try { + component.onError(err, phase); + return; + } catch (e) { + } + } + if (globalHandler) { + try { + globalHandler(err, { component, phase }); + return; + } catch (_) { + } + } + console.error(`[Kasper] Error during ${phase}:`, err); +} let activeEffect = null; const effectStack = []; let batching = false; @@ -125,7 +164,7 @@ class Signal { try { watcher(newValue, oldValue); } catch (e) { - console.error("Watcher error:", e); + handleError(e, "watcher"); } } } @@ -230,7 +269,7 @@ function batch(fn) { try { watcher(); } catch (e) { - console.error("Watcher error:", e); + handleError(e, "watcher"); } } } @@ -746,9 +785,10 @@ const SelfClosingTags = [ "wbr" ]; class ExpressionParser { - parse(tokens) { + parse(tokens, source = "") { this.current = 0; this.tokens = tokens; + this.source = source; const expressions = []; while (!this.eof()) { expressions.push(this.expression()); @@ -793,7 +833,7 @@ class ExpressionParser { ); } error(code, token, args = {}) { - throw new KasperError(code, args, token.line, token.col); + throw new KasperError(code, args, { line: token.line, col: token.col, source: this.source }); } synchronize() { do { @@ -1506,7 +1546,7 @@ class Scanner { } } error(code, args = {}) { - throw new KasperError(code, args, this.line, this.col); + throw new KasperError(code, args, { line: this.line, col: this.col, source: this.source }); } } class Scope { @@ -1580,7 +1620,7 @@ class Interpreter { }; } error(code, args = {}, line, col) { - throw new KasperError(code, args, line, col); + throw new KasperError(code, args, { line, col }); } visitVariableExpr(expr) { return this.scope.get(expr.name.lexeme); @@ -1642,7 +1682,7 @@ class Interpreter { } templateParse(source) { const tokens = this.scanner.scan(source); - const expressions = this.parser.parse(tokens); + const expressions = this.parser.parse(tokens, source); let result = ""; for (const expression of expressions) { result += this.evaluate(expression).toString(); @@ -1957,7 +1997,7 @@ class TemplateParser { return this.current > this.source.length; } error(code, args = {}) { - throw new KasperError(code, args, this.line, this.col); + throw new KasperError(code, args, { line: this.line, col: this.col, source: this.source }); } node() { this.whitespace(); @@ -2225,7 +2265,7 @@ function flush() { instance.onRender(); } } catch (e) { - console.error("[Kasper] Error during component update:", e); + handleError(e, "render", instance); } } queue.clear(); @@ -2234,7 +2274,7 @@ function flush() { try { cb(); } catch (e) { - console.error("[Kasper] Error in nextTick callback:", e); + handleError(e, "render"); } } } @@ -2252,6 +2292,9 @@ function queueUpdate(instance, task) { queueMicrotask(flush); } } +function isBatching() { + return batchingEnabled; +} function flushSync(fn) { const prev = batchingEnabled; batchingEnabled = false; @@ -2388,6 +2431,13 @@ class Transpiler { this.interpreter.scope = scope; try { fn(); + } catch (e) { + if (isBatching()) { + const instance = this.interpreter.scope.get("$instance"); + handleError(e, "render", instance); + } else { + throw e; + } } finally { this.interpreter.scope = prev; } @@ -2410,7 +2460,7 @@ class Transpiler { // evaluates expressions and returns the result of the first evaluation execute(source, overrideScope) { const tokens = this.scanner.scan(source); - const expressions = this.parser.parse(tokens); + const expressions = this.parser.parse(tokens, source); const restoreScope = this.interpreter.scope; if (overrideScope) { this.interpreter.scope = overrideScope; @@ -2997,7 +3047,7 @@ class Transpiler { } evaluateExpression(source) { const tokens = this.scanner.scan(source); - const expressions = this.parser.parse(tokens); + const expressions = this.parser.parse(tokens, source); let result = ""; for (const expression of expressions) { result += `${this.interpreter.evaluate(expression)}`; @@ -3119,7 +3169,7 @@ class Transpiler { const cleanMessage = args.includes("Runtime Error") ? args.replace("Runtime Error: ", "") : args; finalArgs = { message: cleanMessage }; } - throw new KasperError(code, finalArgs, void 0, void 0, tagName); + throw new KasperError(code, finalArgs, { tag: tagName }); } } function lazy(importer) { @@ -3172,6 +3222,9 @@ function bootstrap(config) { { tag: entryTag } ); } + if (config.onError) { + setErrorHandler(config.onError); + } const transpiler = new Transpiler({ registry: config.registry }); if (config.mode) { transpiler.mode = config.mode; @@ -3208,4 +3261,4 @@ export { transpile, watch }; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2FzcGVyLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMvZXJyb3IudHMiLCIuLi9zcmMvc2lnbmFsLnRzIiwiLi4vc3JjL2NvbXBvbmVudC50cyIsIi4uL3NyYy90eXBlcy9leHByZXNzaW9ucy50cyIsIi4uL3NyYy90eXBlcy90b2tlbi50cyIsIi4uL3NyYy9leHByZXNzaW9uLXBhcnNlci50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9zY2FubmVyLnRzIiwiLi4vc3JjL3Njb3BlLnRzIiwiLi4vc3JjL2ludGVycHJldGVyLnRzIiwiLi4vc3JjL3R5cGVzL25vZGVzLnRzIiwiLi4vc3JjL3RlbXBsYXRlLXBhcnNlci50cyIsIi4uL3NyYy9yb3V0ZXIudHMiLCIuLi9zcmMvYm91bmRhcnkudHMiLCIuLi9zcmMvc2NoZWR1bGVyLnRzIiwiLi4vc3JjL3RyYW5zcGlsZXIudHMiLCIuLi9zcmMva2FzcGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBLRXJyb3JDb2RlID0ge1xuICAvLyBCb290c3RyYXBcbiAgUk9PVF9FTEVNRU5UX05PVF9GT1VORDogXCJLMDAxLTFcIixcbiAgRU5UUllfQ09NUE9ORU5UX05PVF9GT1VORDogXCJLMDAxLTJcIixcblxuICAvLyBTY2FubmVyXG4gIFVOVEVSTUlOQVRFRF9DT01NRU5UOiBcIkswMDItMVwiLFxuICBVTlRFUk1JTkFURURfU1RSSU5HOiBcIkswMDItMlwiLFxuICBVTkVYUEVDVEVEX0NIQVJBQ1RFUjogXCJLMDAyLTNcIixcblxuICAvLyBUZW1wbGF0ZSBQYXJzZXJcbiAgVU5FWFBFQ1RFRF9FT0Y6IFwiSzAwMy0xXCIsXG4gIFVORVhQRUNURURfQ0xPU0lOR19UQUc6IFwiSzAwMy0yXCIsXG4gIEVYUEVDVEVEX1RBR19OQU1FOiBcIkswMDMtM1wiLFxuICBFWFBFQ1RFRF9DTE9TSU5HX0JSQUNLRVQ6IFwiSzAwMy00XCIsXG4gIEVYUEVDVEVEX0NMT1NJTkdfVEFHOiBcIkswMDMtNVwiLFxuICBCTEFOS19BVFRSSUJVVEVfTkFNRTogXCJLMDAzLTZcIixcbiAgTUlTUExBQ0VEX0NPTkRJVElPTkFMOiBcIkswMDMtN1wiLFxuICBEVVBMSUNBVEVfSUY6IFwiSzAwMy04XCIsXG4gIE1VTFRJUExFX1NUUlVDVFVSQUxfRElSRUNUSVZFUzogXCJLMDAzLTlcIixcblxuICAvLyBFeHByZXNzaW9uIFBhcnNlclxuICBVTkVYUEVDVEVEX1RPS0VOOiBcIkswMDQtMVwiLFxuICBJTlZBTElEX0xWQUxVRTogXCJLMDA0LTJcIixcbiAgRVhQRUNURURfRVhQUkVTU0lPTjogXCJLMDA0LTNcIixcbiAgSU5WQUxJRF9ESUNUSU9OQVJZX0tFWTogXCJLMDA0LTRcIixcblxuICAvLyBJbnRlcnByZXRlclxuICBJTlZBTElEX1BPU1RGSVhfTFZBTFVFOiBcIkswMDUtMVwiLFxuICBVTktOT1dOX0JJTkFSWV9PUEVSQVRPUjogXCJLMDA1LTJcIixcbiAgSU5WQUxJRF9QUkVGSVhfUlZBTFVFOiBcIkswMDUtM1wiLFxuICBVTktOT1dOX1VOQVJZX09QRVJBVE9SOiBcIkswMDUtNFwiLFxuICBOT1RfQV9GVU5DVElPTjogXCJLMDA1LTVcIixcbiAgTk9UX0FfQ0xBU1M6IFwiSzAwNS02XCIsXG5cbiAgLy8gU2lnbmFsc1xuICBDSVJDVUxBUl9DT01QVVRFRDogXCJLMDA2LTFcIixcblxuICAvLyBUcmFuc3BpbGVyXG4gIFJVTlRJTUVfRVJST1I6IFwiSzAwNy0xXCIsXG4gIE1JU1NJTkdfUkVRVUlSRURfQVRUUjogXCJLMDA3LTJcIixcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEtFcnJvckNvZGVUeXBlID0gKHR5cGVvZiBLRXJyb3JDb2RlKVtrZXlvZiB0eXBlb2YgS0Vycm9yQ29kZV07XG5cbmV4cG9ydCBjb25zdCBFcnJvclRlbXBsYXRlczogUmVjb3JkPHN0cmluZywgKGFyZ3M6IGFueSkgPT4gc3RyaW5nPiA9IHtcbiAgXCJLMDAxLTFcIjogKGEpID0+IGBSb290IGVsZW1lbnQgbm90IGZvdW5kOiAke2Eucm9vdH1gLFxuICBcIkswMDEtMlwiOiAoYSkgPT4gYEVudHJ5IGNvbXBvbmVudCA8JHthLnRhZ30+IG5vdCBmb3VuZCBpbiByZWdpc3RyeS5gLFxuICBcbiAgXCJLMDAyLTFcIjogKCkgPT4gJ1VudGVybWluYXRlZCBjb21tZW50LCBleHBlY3RpbmcgY2xvc2luZyBcIiovXCInLFxuICBcIkswMDItMlwiOiAoYSkgPT4gYFVudGVybWluYXRlZCBzdHJpbmcsIGV4cGVjdGluZyBjbG9zaW5nICR7YS5xdW90ZX1gLFxuICBcIkswMDItM1wiOiAoYSkgPT4gYFVuZXhwZWN0ZWQgY2hhcmFjdGVyICcke2EuY2hhcn0nYCxcblxuICBcIkswMDMtMVwiOiAoYSkgPT4gYFVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuICR7YS5lb2ZFcnJvcn1gLFxuICBcIkswMDMtMlwiOiAoKSA9PiBcIlVuZXhwZWN0ZWQgY2xvc2luZyB0YWdcIixcbiAgXCJLMDAzLTNcIjogKCkgPT4gXCJFeHBlY3RlZCBhIHRhZyBuYW1lXCIsXG4gIFwiSzAwMy00XCI6ICgpID0+IFwiRXhwZWN0ZWQgY2xvc2luZyB0YWcgPlwiLFxuICBcIkswMDMtNVwiOiAoYSkgPT4gYEV4cGVjdGVkIDwvJHthLm5hbWV9PmAsXG4gIFwiSzAwMy02XCI6ICgpID0+IFwiQmxhbmsgYXR0cmlidXRlIG5hbWVcIixcbiAgXCJLMDAzLTdcIjogKGEpID0+IGBAJHthLm5hbWV9IG11c3QgYmUgcHJlY2VkZWQgYnkgYW4gQGlmIG9yIEBlbHNlaWYgYmxvY2suYCxcbiAgXCJLMDAzLThcIjogKCkgPT4gXCJNdWx0aXBsZSBjb25kaXRpb25hbCBkaXJlY3RpdmVzIChAaWYsIEBlbHNlaWYsIEBlbHNlKSBvbiB0aGUgc2FtZSBlbGVtZW50IGFyZSBub3QgYWxsb3dlZC5cIixcbiAgXCJLMDAzLTlcIjogKCkgPT4gXCJNdWx0aXBsZSBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZXMgKEBpZiwgQGVhY2gpIG9uIHRoZSBzYW1lIGVsZW1lbnQgYXJlIG5vdCBhbGxvd2VkLiBOZXN0IHRoZW0gb3IgdXNlIDx2b2lkPiBpbnN0ZWFkLlwiLFxuXG4gIFwiSzAwNC0xXCI6IChhKSA9PiBgJHthLm1lc3NhZ2V9LCB1bmV4cGVjdGVkIHRva2VuIFwiJHthLnRva2VufVwiYCxcbiAgXCJLMDA0LTJcIjogKCkgPT4gXCJJbnZhbGlkIGwtdmFsdWUsIGlzIG5vdCBhbiBhc3NpZ25pbmcgdGFyZ2V0LlwiLFxuICBcIkswMDQtM1wiOiAoYSkgPT4gYEV4cGVjdGVkIGV4cHJlc3Npb24sIHVuZXhwZWN0ZWQgdG9rZW4gXCIke2EudG9rZW59XCJgLFxuICBcIkswMDQtNFwiOiAoYSkgPT4gYFN0cmluZywgTnVtYmVyIG9yIElkZW50aWZpZXIgZXhwZWN0ZWQgYXMgYSBLZXkgb2YgRGljdGlvbmFyeSB7LCB1bmV4cGVjdGVkIHRva2VuICR7YS50b2tlbn1gLFxuXG4gIFwiSzAwNS0xXCI6IChhKSA9PiBgSW52YWxpZCBsZWZ0LWhhbmQgc2lkZSBpbiBwb3N0Zml4IG9wZXJhdGlvbjogJHthLmVudGl0eX1gLFxuICBcIkswMDUtMlwiOiAoYSkgPT4gYFVua25vd24gYmluYXJ5IG9wZXJhdG9yICR7YS5vcGVyYXRvcn1gLFxuICBcIkswMDUtM1wiOiAoYSkgPT4gYEludmFsaWQgcmlnaHQtaGFuZCBzaWRlIGV4cHJlc3Npb24gaW4gcHJlZml4IG9wZXJhdGlvbjogJHthLnJpZ2h0fWAsXG4gIFwiSzAwNS00XCI6IChhKSA9PiBgVW5rbm93biB1bmFyeSBvcGVyYXRvciAke2Eub3BlcmF0b3J9YCxcbiAgXCJLMDA1LTVcIjogKGEpID0+IGAke2EuY2FsbGVlfSBpcyBub3QgYSBmdW5jdGlvbmAsXG4gIFwiSzAwNS02XCI6IChhKSA9PiBgJyR7YS5jbGF6en0nIGlzIG5vdCBhIGNsYXNzLiAnbmV3JyBzdGF0ZW1lbnQgbXVzdCBiZSB1c2VkIHdpdGggY2xhc3Nlcy5gLFxuXG4gIFwiSzAwNi0xXCI6ICgpID0+IFwiQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZCBpbiBjb21wdXRlZCBzaWduYWxcIixcblxuICBcIkswMDctMVwiOiAoYSkgPT4gYS5tZXNzYWdlLFxuICBcIkswMDctMlwiOiAoYSkgPT4gYS5tZXNzYWdlLFxufTtcblxuZXhwb3J0IGNsYXNzIEthc3BlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29kZTogS0Vycm9yQ29kZVR5cGUsXG4gICAgcHVibGljIGFyZ3M6IGFueSA9IHt9LFxuICAgIHB1YmxpYyBsaW5lPzogbnVtYmVyLFxuICAgIHB1YmxpYyBjb2w/OiBudW1iZXIsXG4gICAgcHVibGljIHRhZ05hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgLy8gRGV0ZWN0IGVudmlyb25tZW50XG4gICAgY29uc3QgaXNEZXYgPVxuICAgICAgdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCJcbiAgICAgICAgOiAoaW1wb3J0Lm1ldGEgYXMgYW55KS5lbnY/Lk1PREUgIT09IFwicHJvZHVjdGlvblwiO1xuXG4gICAgY29uc3QgdGVtcGxhdGUgPSBFcnJvclRlbXBsYXRlc1tjb2RlXTtcbiAgICBjb25zdCBtZXNzYWdlID0gdGVtcGxhdGUgXG4gICAgICA/IHRlbXBsYXRlKGFyZ3MpIFxuICAgICAgOiAodHlwZW9mIGFyZ3MgPT09ICdzdHJpbmcnID8gYXJncyA6IFwiVW5rbm93biBlcnJvclwiKTtcbiAgICBcbiAgICBjb25zdCBsb2NhdGlvbiA9IGxpbmUgIT09IHVuZGVmaW5lZCA/IGAgKCR7bGluZX06JHtjb2x9KWAgOiBcIlwiO1xuICAgIGNvbnN0IHRhZ0luZm8gPSB0YWdOYW1lID8gYFxcbiAgYXQgPCR7dGFnTmFtZX0+YCA6IFwiXCI7XG4gICAgY29uc3QgbGluayA9IGlzRGV2XG4gICAgICA/IGBcXG5cXG5TZWU6IGh0dHBzOi8va2FzcGVyanMudG9wL3JlZmVyZW5jZS9lcnJvcnMjJHtjb2RlLnRvTG93ZXJDYXNlKCkucmVwbGFjZShcIi5cIiwgXCJcIil9YFxuICAgICAgOiBcIlwiO1xuXG4gICAgc3VwZXIoYFske2NvZGV9XSAke21lc3NhZ2V9JHtsb2NhdGlvbn0ke3RhZ0luZm99JHtsaW5rfWApO1xuICAgIHRoaXMubmFtZSA9IFwiS2FzcGVyRXJyb3JcIjtcbiAgfVxuXG4gIHB1YmxpYyB3aXRoVGFnKHRhZ05hbWU6IHN0cmluZyk6IHRoaXMge1xuICAgIGlmICghdGhpcy50YWdOYW1lKSB7XG4gICAgICB0aGlzLnRhZ05hbWUgPSB0YWdOYW1lO1xuICAgICAgdGhpcy5tZXNzYWdlICs9IGBcXG4gIGF0IDwke3RhZ05hbWV9PmA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iLCJpbXBvcnQgeyBLYXNwZXJFcnJvciwgS0Vycm9yQ29kZSB9IGZyb20gXCIuL3R5cGVzL2Vycm9yXCI7XG5cbnR5cGUgTGlzdGVuZXIgPSAoKSA9PiB2b2lkO1xuXG5sZXQgYWN0aXZlRWZmZWN0OiB7IGZuOiBMaXN0ZW5lcjsgZGVwczogU2V0PGFueT4gfSB8IG51bGwgPSBudWxsO1xuY29uc3QgZWZmZWN0U3RhY2s6IGFueVtdID0gW107XG5cbmxldCBiYXRjaGluZyA9IGZhbHNlO1xuY29uc3QgcGVuZGluZ1N1YnNjcmliZXJzID0gbmV3IFNldDxMaXN0ZW5lcj4oKTtcbmNvbnN0IHBlbmRpbmdXYXRjaGVyczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcblxudHlwZSBXYXRjaGVyPFQ+ID0gKG5ld1ZhbHVlOiBULCBvbGRWYWx1ZTogVCkgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxPcHRpb25zIHtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbmV4cG9ydCBjbGFzcyBTaWduYWw8VD4ge1xuICBwcm90ZWN0ZWQgX3ZhbHVlOiBUO1xuICBwcml2YXRlIHN1YnNjcmliZXJzID0gbmV3IFNldDxMaXN0ZW5lcj4oKTtcbiAgcHJpdmF0ZSB3YXRjaGVycyA9IG5ldyBTZXQ8V2F0Y2hlcjxUPj4oKTtcblxuICBjb25zdHJ1Y3Rvcihpbml0aWFsVmFsdWU6IFQpIHtcbiAgICB0aGlzLl92YWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBUIHtcbiAgICBpZiAoYWN0aXZlRWZmZWN0KSB7XG4gICAgICB0aGlzLnN1YnNjcmliZXJzLmFkZChhY3RpdmVFZmZlY3QuZm4pO1xuICAgICAgYWN0aXZlRWZmZWN0LmRlcHMuYWRkKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBzZXQgdmFsdWUobmV3VmFsdWU6IFQpIHtcbiAgICBpZiAodGhpcy5fdmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICAgICAgdGhpcy5fdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIGlmIChiYXRjaGluZykge1xuICAgICAgICBmb3IgKGNvbnN0IHN1YiBvZiB0aGlzLnN1YnNjcmliZXJzKSBwZW5kaW5nU3Vic2NyaWJlcnMuYWRkKHN1Yik7XG4gICAgICAgIGZvciAoY29uc3Qgd2F0Y2hlciBvZiB0aGlzLndhdGNoZXJzKSBwZW5kaW5nV2F0Y2hlcnMucHVzaCgoKSA9PiB3YXRjaGVyKG5ld1ZhbHVlLCBvbGRWYWx1ZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3VicyA9IEFycmF5LmZyb20odGhpcy5zdWJzY3JpYmVycyk7XG4gICAgICAgIGZvciAoY29uc3Qgc3ViIG9mIHN1YnMpIHtcbiAgICAgICAgICBzdWIoKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHdhdGNoZXIgb2YgdGhpcy53YXRjaGVycykge1xuICAgICAgICAgIHRyeSB7IHdhdGNoZXIobmV3VmFsdWUsIG9sZFZhbHVlKTsgfSBjYXRjaCAoZSkgeyBjb25zb2xlLmVycm9yKFwiV2F0Y2hlciBlcnJvcjpcIiwgZSk7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQ2hhbmdlKGZuOiBXYXRjaGVyPFQ+LCBvcHRpb25zPzogU2lnbmFsT3B0aW9ucyk6ICgpID0+IHZvaWQge1xuICAgIGlmIChvcHRpb25zPy5zaWduYWw/LmFib3J0ZWQpIHJldHVybiAoKSA9PiB7fTtcbiAgICB0aGlzLndhdGNoZXJzLmFkZChmbik7XG4gICAgY29uc3Qgc3RvcCA9ICgpID0+IHRoaXMud2F0Y2hlcnMuZGVsZXRlKGZuKTtcbiAgICBpZiAob3B0aW9ucz8uc2lnbmFsKSB7XG4gICAgICBvcHRpb25zLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgc3RvcCwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc3RvcDtcbiAgfVxuXG4gIHVuc3Vic2NyaWJlKGZuOiBMaXN0ZW5lcikge1xuICAgIHRoaXMuc3Vic2NyaWJlcnMuZGVsZXRlKGZuKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCkgeyByZXR1cm4gU3RyaW5nKHRoaXMudmFsdWUpOyB9XG4gIHBlZWsoKSB7IHJldHVybiB0aGlzLl92YWx1ZTsgfVxufVxuXG5jbGFzcyBDb21wdXRlZFNpZ25hbDxUPiBleHRlbmRzIFNpZ25hbDxUPiB7XG4gIHByaXZhdGUgZm46ICgpID0+IFQ7XG4gIHByaXZhdGUgY29tcHV0aW5nID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoZm46ICgpID0+IFQsIG9wdGlvbnM/OiBTaWduYWxPcHRpb25zKSB7XG4gICAgc3VwZXIodW5kZWZpbmVkIGFzIGFueSk7XG4gICAgdGhpcy5mbiA9IGZuO1xuXG4gICAgY29uc3Qgc3RvcCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jb21wdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEthc3BlckVycm9yKEtFcnJvckNvZGUuQ0lSQ1VMQVJfQ09NUFVURUQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNvbXB1dGluZyA9IHRydWU7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBFYWdlcmx5IHVwZGF0ZSB0aGUgdmFsdWUgc28gc3Vic2NyaWJlcnMgYXJlIG5vdGlmaWVkIGltbWVkaWF0ZWx5XG4gICAgICAgIHN1cGVyLnZhbHVlID0gdGhpcy5mbigpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5jb21wdXRpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9LCBvcHRpb25zKTtcblxuICAgIGlmIChvcHRpb25zPy5zaWduYWwpIHtcbiAgICAgIG9wdGlvbnMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBzdG9wLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IFQge1xuICAgIHJldHVybiBzdXBlci52YWx1ZTtcbiAgfVxuXG4gIHNldCB2YWx1ZShfdjogVCkge1xuICAgIC8vIENvbXB1dGVkIHNpZ25hbHMgYXJlIHJlYWQtb25seSBmcm9tIG91dHNpZGVcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZWZmZWN0KGZuOiBMaXN0ZW5lciwgb3B0aW9ucz86IFNpZ25hbE9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnM/LnNpZ25hbD8uYWJvcnRlZCkgcmV0dXJuICgpID0+IHt9O1xuICBjb25zdCBlZmZlY3RPYmogPSB7XG4gICAgZm46ICgpID0+IHtcbiAgICAgIGVmZmVjdE9iai5kZXBzLmZvckVhY2goc2lnID0+IHNpZy51bnN1YnNjcmliZShlZmZlY3RPYmouZm4pKTtcbiAgICAgIGVmZmVjdE9iai5kZXBzLmNsZWFyKCk7XG5cbiAgICAgIGVmZmVjdFN0YWNrLnB1c2goZWZmZWN0T2JqKTtcbiAgICAgIGFjdGl2ZUVmZmVjdCA9IGVmZmVjdE9iajtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBlZmZlY3RTdGFjay5wb3AoKTtcbiAgICAgICAgYWN0aXZlRWZmZWN0ID0gZWZmZWN0U3RhY2tbZWZmZWN0U3RhY2subGVuZ3RoIC0gMV0gfHwgbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRlcHM6IG5ldyBTZXQ8U2lnbmFsPGFueT4+KClcbiAgfTtcblxuICBlZmZlY3RPYmouZm4oKTtcbiAgY29uc3Qgc3RvcDogYW55ID0gKCkgPT4ge1xuICAgIGVmZmVjdE9iai5kZXBzLmZvckVhY2goc2lnID0+IHNpZy51bnN1YnNjcmliZShlZmZlY3RPYmouZm4pKTtcbiAgICBlZmZlY3RPYmouZGVwcy5jbGVhcigpO1xuICB9O1xuICBzdG9wLnJ1biA9IGVmZmVjdE9iai5mbjtcblxuICBpZiAob3B0aW9ucz8uc2lnbmFsKSB7XG4gICAgb3B0aW9ucy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIHN0b3AsIHsgb25jZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHJldHVybiBzdG9wIGFzICgoKSA9PiB2b2lkKSAmIHsgcnVuOiAoKSA9PiB2b2lkIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWw8VD4oaW5pdGlhbFZhbHVlOiBUKTogU2lnbmFsPFQ+IHtcbiAgcmV0dXJuIG5ldyBTaWduYWwoaW5pdGlhbFZhbHVlKTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsIGFsaWFzIGZvciBTaWduYWwub25DaGFuZ2UoKVxuICovXG5leHBvcnQgZnVuY3Rpb24gd2F0Y2g8VD4oc2lnOiBTaWduYWw8VD4sIGZuOiBXYXRjaGVyPFQ+LCBvcHRpb25zPzogU2lnbmFsT3B0aW9ucyk6ICgpID0+IHZvaWQge1xuICByZXR1cm4gc2lnLm9uQ2hhbmdlKGZuLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gIGJhdGNoaW5nID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBmbigpO1xuICB9IGZpbmFsbHkge1xuICAgIGJhdGNoaW5nID0gZmFsc2U7XG4gICAgY29uc3Qgc3VicyA9IEFycmF5LmZyb20ocGVuZGluZ1N1YnNjcmliZXJzKTtcbiAgICBwZW5kaW5nU3Vic2NyaWJlcnMuY2xlYXIoKTtcbiAgICBjb25zdCB3YXRjaGVycyA9IHBlbmRpbmdXYXRjaGVycy5zcGxpY2UoMCk7XG4gICAgZm9yIChjb25zdCBzdWIgb2Ygc3Vicykge1xuICAgICAgc3ViKCk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgd2F0Y2hlciBvZiB3YXRjaGVycykge1xuICAgICAgdHJ5IHsgd2F0Y2hlcigpOyB9IGNhdGNoIChlKSB7IGNvbnNvbGUuZXJyb3IoXCJXYXRjaGVyIGVycm9yOlwiLCBlKTsgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZWQ8VD4oZm46ICgpID0+IFQsIG9wdGlvbnM/OiBTaWduYWxPcHRpb25zKTogU2lnbmFsPFQ+IHtcbiAgcmV0dXJuIG5ldyBDb21wdXRlZFNpZ25hbChmbiwgb3B0aW9ucyk7XG59XG4iLCJpbXBvcnQgeyBTaWduYWwsIGVmZmVjdCBhcyByYXdFZmZlY3QsIGNvbXB1dGVkIGFzIHJhd0NvbXB1dGVkIH0gZnJvbSBcIi4vc2lnbmFsXCI7XG5pbXBvcnQgeyBUcmFuc3BpbGVyIH0gZnJvbSBcIi4vdHJhbnNwaWxlclwiO1xuaW1wb3J0IHsgS05vZGUgfSBmcm9tIFwiLi90eXBlcy9ub2Rlc1wiO1xuXG50eXBlIFdhdGNoZXI8VD4gPSAobmV3VmFsdWU6IFQsIG9sZFZhbHVlOiBUKSA9PiB2b2lkO1xuXG5pbnRlcmZhY2UgQ29tcG9uZW50QXJnczxUQXJncyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gIGFyZ3M6IFRBcmdzO1xuICByZWY/OiBOb2RlO1xuICB0cmFuc3BpbGVyPzogVHJhbnNwaWxlcjtcbn1cblxuZXhwb3J0IGNsYXNzIENvbXBvbmVudDxUQXJncyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gIHN0YXRpYyB0ZW1wbGF0ZT86IHN0cmluZztcbiAgYXJnczogVEFyZ3MgPSB7fSBhcyBUQXJncztcbiAgcmVmPzogTm9kZTtcbiAgdHJhbnNwaWxlcj86IFRyYW5zcGlsZXI7XG4gICRhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICRyZW5kZXI/OiAoKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzPzogQ29tcG9uZW50QXJnczxUQXJncz4pIHtcbiAgICBpZiAoIXByb3BzKSB7XG4gICAgICB0aGlzLmFyZ3MgPSB7fSBhcyBUQXJncztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHByb3BzLmFyZ3MpIHtcbiAgICAgIHRoaXMuYXJncyA9IHByb3BzLmFyZ3M7XG4gICAgfVxuICAgIGlmIChwcm9wcy5yZWYpIHtcbiAgICAgIHRoaXMucmVmID0gcHJvcHMucmVmO1xuICAgIH1cbiAgICBpZiAocHJvcHMudHJhbnNwaWxlcikge1xuICAgICAgdGhpcy50cmFuc3BpbGVyID0gcHJvcHMudHJhbnNwaWxlcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHJlYWN0aXZlIGVmZmVjdCB0aWVkIHRvIHRoZSBjb21wb25lbnQncyBsaWZlY3ljbGUuXG4gICAqIFJ1bnMgaW1tZWRpYXRlbHkgYW5kIHJlLXJ1bnMgd2hlbiBhbnkgc2lnbmFsIGRlcGVuZGVuY3kgY2hhbmdlcy5cbiAgICovXG4gIGVmZmVjdChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHJhd0VmZmVjdChmbiwgeyBzaWduYWw6IHRoaXMuJGFib3J0Q29udHJvbGxlci5zaWduYWwgfSk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2hlcyBhIHNwZWNpZmljIHNpZ25hbCBmb3IgY2hhbmdlcy5cbiAgICogRG9lcyBOT1QgcnVuIGltbWVkaWF0ZWx5LlxuICAgKi9cbiAgd2F0Y2g8VD4oc2lnOiBTaWduYWw8VD4sIGZuOiBXYXRjaGVyPFQ+KTogdm9pZCB7XG4gICAgc2lnLm9uQ2hhbmdlKGZuLCB7IHNpZ25hbDogdGhpcy4kYWJvcnRDb250cm9sbGVyLnNpZ25hbCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY29tcHV0ZWQgc2lnbmFsIHRpZWQgdG8gdGhlIGNvbXBvbmVudCdzIGxpZmVjeWNsZS5cbiAgICogVGhlIGludGVybmFsIGVmZmVjdCBpcyBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgdXAgd2hlbiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZC5cbiAgICovXG4gIGNvbXB1dGVkPFQ+KGZuOiAoKSA9PiBUKTogU2lnbmFsPFQ+IHtcbiAgICByZXR1cm4gcmF3Q29tcHV0ZWQoZm4sIHsgc2lnbmFsOiB0aGlzLiRhYm9ydENvbnRyb2xsZXIuc2lnbmFsIH0pO1xuICB9XG5cbiAgb25Nb3VudCgpIHsgfVxuICBvblJlbmRlcigpIHsgfVxuICBvbkNoYW5nZXMoKSB7IH1cbiAgb25EZXN0cm95KCkgeyB9XG5cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuJHJlbmRlcj8uKCk7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgS2FzcGVyRW50aXR5ID0gQ29tcG9uZW50IHwgUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCB0eXBlIENvbXBvbmVudENsYXNzID0geyBuZXcoYXJncz86IENvbXBvbmVudEFyZ3M8YW55Pik6IENvbXBvbmVudCB9O1xuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRSZWdpc3RyeSB7XG4gIFt0YWdOYW1lOiBzdHJpbmddOiB7XG4gICAgY29tcG9uZW50OiBDb21wb25lbnRDbGFzcyB8ICgoKSA9PiBQcm9taXNlPENvbXBvbmVudENsYXNzPik7XG4gICAgbm9kZXM/OiBLTm9kZVtdO1xuICAgIGxhenk/OiBib29sZWFuO1xuICAgIGZhbGxiYWNrPzogQ29tcG9uZW50Q2xhc3M7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBUb2tlbiwgVG9rZW5UeXBlIH0gZnJvbSAndG9rZW4nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRXhwciB7XG4gIHB1YmxpYyByZXN1bHQ6IGFueTtcbiAgcHVibGljIGxpbmU6IG51bWJlcjtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG4gIHB1YmxpYyBhYnN0cmFjdCBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSO1xufVxuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbmV4cG9ydCBpbnRlcmZhY2UgRXhwclZpc2l0b3I8Uj4ge1xuICAgIHZpc2l0QXJyb3dGdW5jdGlvbkV4cHIoZXhwcjogQXJyb3dGdW5jdGlvbik6IFI7XG4gICAgdmlzaXRBc3NpZ25FeHByKGV4cHI6IEFzc2lnbik6IFI7XG4gICAgdmlzaXRCaW5hcnlFeHByKGV4cHI6IEJpbmFyeSk6IFI7XG4gICAgdmlzaXRDYWxsRXhwcihleHByOiBDYWxsKTogUjtcbiAgICB2aXNpdERlYnVnRXhwcihleHByOiBEZWJ1Zyk6IFI7XG4gICAgdmlzaXREaWN0aW9uYXJ5RXhwcihleHByOiBEaWN0aW9uYXJ5KTogUjtcbiAgICB2aXNpdEVhY2hFeHByKGV4cHI6IEVhY2gpOiBSO1xuICAgIHZpc2l0R2V0RXhwcihleHByOiBHZXQpOiBSO1xuICAgIHZpc2l0R3JvdXBpbmdFeHByKGV4cHI6IEdyb3VwaW5nKTogUjtcbiAgICB2aXNpdEtleUV4cHIoZXhwcjogS2V5KTogUjtcbiAgICB2aXNpdExvZ2ljYWxFeHByKGV4cHI6IExvZ2ljYWwpOiBSO1xuICAgIHZpc2l0TGlzdEV4cHIoZXhwcjogTGlzdCk6IFI7XG4gICAgdmlzaXRMaXRlcmFsRXhwcihleHByOiBMaXRlcmFsKTogUjtcbiAgICB2aXNpdE5ld0V4cHIoZXhwcjogTmV3KTogUjtcbiAgICB2aXNpdE51bGxDb2FsZXNjaW5nRXhwcihleHByOiBOdWxsQ29hbGVzY2luZyk6IFI7XG4gICAgdmlzaXRQb3N0Zml4RXhwcihleHByOiBQb3N0Zml4KTogUjtcbiAgICB2aXNpdFNldEV4cHIoZXhwcjogU2V0KTogUjtcbiAgICB2aXNpdFBpcGVsaW5lRXhwcihleHByOiBQaXBlbGluZSk6IFI7XG4gICAgdmlzaXRTcHJlYWRFeHByKGV4cHI6IFNwcmVhZCk6IFI7XG4gICAgdmlzaXRUZW1wbGF0ZUV4cHIoZXhwcjogVGVtcGxhdGUpOiBSO1xuICAgIHZpc2l0VGVybmFyeUV4cHIoZXhwcjogVGVybmFyeSk6IFI7XG4gICAgdmlzaXRUeXBlb2ZFeHByKGV4cHI6IFR5cGVvZik6IFI7XG4gICAgdmlzaXRVbmFyeUV4cHIoZXhwcjogVW5hcnkpOiBSO1xuICAgIHZpc2l0VmFyaWFibGVFeHByKGV4cHI6IFZhcmlhYmxlKTogUjtcbiAgICB2aXNpdFZvaWRFeHByKGV4cHI6IFZvaWQpOiBSO1xufVxuXG5leHBvcnQgY2xhc3MgQXJyb3dGdW5jdGlvbiBleHRlbmRzIEV4cHIge1xuICAgIHB1YmxpYyBwYXJhbXM6IFRva2VuW107XG4gICAgcHVibGljIGJvZHk6IEV4cHI7XG5cbiAgICBjb25zdHJ1Y3RvcihwYXJhbXM6IFRva2VuW10sIGJvZHk6IEV4cHIsIGxpbmU6IG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBFeHByVmlzaXRvcjxSPik6IFIge1xuICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRBcnJvd0Z1bmN0aW9uRXhwcih0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdFeHByLkFycm93RnVuY3Rpb24nO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBc3NpZ24gZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgbmFtZTogVG9rZW47XG4gICAgcHVibGljIHZhbHVlOiBFeHByO1xuXG4gICAgY29uc3RydWN0b3IobmFtZTogVG9rZW4sIHZhbHVlOiBFeHByLCBsaW5lOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmxpbmUgPSBsaW5lO1xuICAgIH1cblxuICBwdWJsaWMgYWNjZXB0PFI+KHZpc2l0b3I6IEV4cHJWaXNpdG9yPFI+KTogUiB7XG4gICAgICByZXR1cm4gdmlzaXRvci52aXNpdEFzc2lnbkV4cHIodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnRXhwci5Bc3NpZ24nO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCaW5hcnkgZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgbGVmdDogRXhwcjtcbiAgICBwdWJsaWMgb3BlcmF0b3I6IFRva2VuO1xuICAgIHB1YmxpYyByaWdodDogRXhwcjtcblxuICAgIGNvbnN0cnVjdG9yKGxlZnQ6IEV4cHIsIG9wZXJhdG9yOiBUb2tlbiwgcmlnaHQ6IEV4cHIsIGxpbmU6IG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuICAgICAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgICAgIHRoaXMucmlnaHQgPSByaWdodDtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBFeHByVmlzaXRvcjxSPik6IFIge1xuICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRCaW5hcnlFeHByKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gJ0V4cHIuQmluYXJ5JztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2FsbCBleHRlbmRzIEV4cHIge1xuICAgIHB1YmxpYyBjYWxsZWU6IEV4cHI7XG4gICAgcHVibGljIHBhcmVuOiBUb2tlbjtcbiAgICBwdWJsaWMgYXJnczogRXhwcltdO1xuICAgIHB1YmxpYyBvcHRpb25hbDogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGNhbGxlZTogRXhwciwgcGFyZW46IFRva2VuLCBhcmdzOiBFeHByW10sIGxpbmU6IG51bWJlciwgb3B0aW9uYWwgPSBmYWxzZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNhbGxlZSA9IGNhbGxlZTtcbiAgICAgICAgdGhpcy5wYXJlbiA9IHBhcmVuO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgICAgICB0aGlzLmxpbmUgPSBsaW5lO1xuICAgICAgICB0aGlzLm9wdGlvbmFsID0gb3B0aW9uYWw7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Q2FsbEV4cHIodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnRXhwci5DYWxsJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVidWcgZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgdmFsdWU6IEV4cHI7XG5cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogRXhwciwgbGluZTogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBFeHByVmlzaXRvcjxSPik6IFIge1xuICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXREZWJ1Z0V4cHIodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnRXhwci5EZWJ1Zyc7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpY3Rpb25hcnkgZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgcHJvcGVydGllczogRXhwcltdO1xuXG4gICAgY29uc3RydWN0b3IocHJvcGVydGllczogRXhwcltdLCBsaW5lOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBFeHByVmlzaXRvcjxSPik6IFIge1xuICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXREaWN0aW9uYXJ5RXhwcih0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdFeHByLkRpY3Rpb25hcnknO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFYWNoIGV4dGVuZHMgRXhwciB7XG4gICAgcHVibGljIG5hbWU6IFRva2VuO1xuICAgIHB1YmxpYyBrZXk6IFRva2VuO1xuICAgIHB1YmxpYyBpdGVyYWJsZTogRXhwcjtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IFRva2VuLCBrZXk6IFRva2VuLCBpdGVyYWJsZTogRXhwciwgbGluZTogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RWFjaEV4cHIodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnRXhwci5FYWNoJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2V0IGV4dGVuZHMgRXhwciB7XG4gICAgcHVibGljIGVudGl0eTogRXhwcjtcbiAgICBwdWJsaWMga2V5OiBFeHByO1xuICAgIHB1YmxpYyB0eXBlOiBUb2tlblR5cGU7XG5cbiAgICBjb25zdHJ1Y3RvcihlbnRpdHk6IEV4cHIsIGtleTogRXhwciwgdHlwZTogVG9rZW5UeXBlLCBsaW5lOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmxpbmUgPSBsaW5lO1xuICAgIH1cblxuICBwdWJsaWMgYWNjZXB0PFI+KHZpc2l0b3I6IEV4cHJWaXNpdG9yPFI+KTogUiB7XG4gICAgICByZXR1cm4gdmlzaXRvci52aXNpdEdldEV4cHIodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnRXhwci5HZXQnO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHcm91cGluZyBleHRlbmRzIEV4cHIge1xuICAgIHB1YmxpYyBleHByZXNzaW9uOiBFeHByO1xuXG4gICAgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogRXhwciwgbGluZTogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0R3JvdXBpbmdFeHByKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gJ0V4cHIuR3JvdXBpbmcnO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBLZXkgZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgbmFtZTogVG9rZW47XG5cbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBUb2tlbiwgbGluZTogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0S2V5RXhwcih0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdFeHByLktleSc7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExvZ2ljYWwgZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgbGVmdDogRXhwcjtcbiAgICBwdWJsaWMgb3BlcmF0b3I6IFRva2VuO1xuICAgIHB1YmxpYyByaWdodDogRXhwcjtcblxuICAgIGNvbnN0cnVjdG9yKGxlZnQ6IEV4cHIsIG9wZXJhdG9yOiBUb2tlbiwgcmlnaHQ6IEV4cHIsIGxpbmU6IG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuICAgICAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgICAgIHRoaXMucmlnaHQgPSByaWdodDtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBFeHByVmlzaXRvcjxSPik6IFIge1xuICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRMb2dpY2FsRXhwcih0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdFeHByLkxvZ2ljYWwnO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMaXN0IGV4dGVuZHMgRXhwciB7XG4gICAgcHVibGljIHZhbHVlOiBFeHByW107XG5cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogRXhwcltdLCBsaW5lOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmxpbmUgPSBsaW5lO1xuICAgIH1cblxuICBwdWJsaWMgYWNjZXB0PFI+KHZpc2l0b3I6IEV4cHJWaXNpdG9yPFI+KTogUiB7XG4gICAgICByZXR1cm4gdmlzaXRvci52aXNpdExpc3RFeHByKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gJ0V4cHIuTGlzdCc7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpdGVyYWwgZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgdmFsdWU6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBhbnksIGxpbmU6IG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TGl0ZXJhbEV4cHIodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnRXhwci5MaXRlcmFsJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTmV3IGV4dGVuZHMgRXhwciB7XG4gICAgcHVibGljIGNsYXp6OiBFeHByO1xuICAgIHB1YmxpYyBhcmdzOiBFeHByW107XG5cbiAgICBjb25zdHJ1Y3RvcihjbGF6ejogRXhwciwgYXJnczogRXhwcltdLCBsaW5lOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jbGF6eiA9IGNsYXp6O1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgICAgICB0aGlzLmxpbmUgPSBsaW5lO1xuICAgIH1cblxuICBwdWJsaWMgYWNjZXB0PFI+KHZpc2l0b3I6IEV4cHJWaXNpdG9yPFI+KTogUiB7XG4gICAgICByZXR1cm4gdmlzaXRvci52aXNpdE5ld0V4cHIodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnRXhwci5OZXcnO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOdWxsQ29hbGVzY2luZyBleHRlbmRzIEV4cHIge1xuICAgIHB1YmxpYyBsZWZ0OiBFeHByO1xuICAgIHB1YmxpYyByaWdodDogRXhwcjtcblxuICAgIGNvbnN0cnVjdG9yKGxlZnQ6IEV4cHIsIHJpZ2h0OiBFeHByLCBsaW5lOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDtcbiAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuICAgICAgICB0aGlzLmxpbmUgPSBsaW5lO1xuICAgIH1cblxuICBwdWJsaWMgYWNjZXB0PFI+KHZpc2l0b3I6IEV4cHJWaXNpdG9yPFI+KTogUiB7XG4gICAgICByZXR1cm4gdmlzaXRvci52aXNpdE51bGxDb2FsZXNjaW5nRXhwcih0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdFeHByLk51bGxDb2FsZXNjaW5nJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUG9zdGZpeCBleHRlbmRzIEV4cHIge1xuICAgIHB1YmxpYyBlbnRpdHk6IEV4cHI7XG4gICAgcHVibGljIGluY3JlbWVudDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoZW50aXR5OiBFeHByLCBpbmNyZW1lbnQ6IG51bWJlciwgbGluZTogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuICAgICAgICB0aGlzLmluY3JlbWVudCA9IGluY3JlbWVudDtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBFeHByVmlzaXRvcjxSPik6IFIge1xuICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRQb3N0Zml4RXhwcih0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdFeHByLlBvc3RmaXgnO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXQgZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgZW50aXR5OiBFeHByO1xuICAgIHB1YmxpYyBrZXk6IEV4cHI7XG4gICAgcHVibGljIHZhbHVlOiBFeHByO1xuXG4gICAgY29uc3RydWN0b3IoZW50aXR5OiBFeHByLCBrZXk6IEV4cHIsIHZhbHVlOiBFeHByLCBsaW5lOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U2V0RXhwcih0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdFeHByLlNldCc7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBpcGVsaW5lIGV4dGVuZHMgRXhwciB7XG4gICAgcHVibGljIGxlZnQ6IEV4cHI7XG4gICAgcHVibGljIHJpZ2h0OiBFeHByO1xuXG4gICAgY29uc3RydWN0b3IobGVmdDogRXhwciwgcmlnaHQ6IEV4cHIsIGxpbmU6IG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0UGlwZWxpbmVFeHByKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gJ0V4cHIuUGlwZWxpbmUnO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTcHJlYWQgZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgdmFsdWU6IEV4cHI7XG5cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogRXhwciwgbGluZTogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBFeHByVmlzaXRvcjxSPik6IFIge1xuICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTcHJlYWRFeHByKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gJ0V4cHIuU3ByZWFkJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGUgZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBzdHJpbmcsIGxpbmU6IG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VGVtcGxhdGVFeHByKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gJ0V4cHIuVGVtcGxhdGUnO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUZXJuYXJ5IGV4dGVuZHMgRXhwciB7XG4gICAgcHVibGljIGNvbmRpdGlvbjogRXhwcjtcbiAgICBwdWJsaWMgdGhlbkV4cHI6IEV4cHI7XG4gICAgcHVibGljIGVsc2VFeHByOiBFeHByO1xuXG4gICAgY29uc3RydWN0b3IoY29uZGl0aW9uOiBFeHByLCB0aGVuRXhwcjogRXhwciwgZWxzZUV4cHI6IEV4cHIsIGxpbmU6IG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjtcbiAgICAgICAgdGhpcy50aGVuRXhwciA9IHRoZW5FeHByO1xuICAgICAgICB0aGlzLmVsc2VFeHByID0gZWxzZUV4cHI7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VGVybmFyeUV4cHIodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnRXhwci5UZXJuYXJ5JztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHlwZW9mIGV4dGVuZHMgRXhwciB7XG4gICAgcHVibGljIHZhbHVlOiBFeHByO1xuXG4gICAgY29uc3RydWN0b3IodmFsdWU6IEV4cHIsIGxpbmU6IG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VHlwZW9mRXhwcih0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdFeHByLlR5cGVvZic7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuYXJ5IGV4dGVuZHMgRXhwciB7XG4gICAgcHVibGljIG9wZXJhdG9yOiBUb2tlbjtcbiAgICBwdWJsaWMgcmlnaHQ6IEV4cHI7XG5cbiAgICBjb25zdHJ1Y3RvcihvcGVyYXRvcjogVG9rZW4sIHJpZ2h0OiBFeHByLCBsaW5lOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5vcGVyYXRvciA9IG9wZXJhdG9yO1xuICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VW5hcnlFeHByKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gJ0V4cHIuVW5hcnknO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWYXJpYWJsZSBleHRlbmRzIEV4cHIge1xuICAgIHB1YmxpYyBuYW1lOiBUb2tlbjtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IFRva2VuLCBsaW5lOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBFeHByVmlzaXRvcjxSPik6IFIge1xuICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRWYXJpYWJsZUV4cHIodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnRXhwci5WYXJpYWJsZSc7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFZvaWQgZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgdmFsdWU6IEV4cHI7XG5cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogRXhwciwgbGluZTogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBFeHByVmlzaXRvcjxSPik6IFIge1xuICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRWb2lkRXhwcih0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdFeHByLlZvaWQnO1xuICB9XG59XG5cbiIsImV4cG9ydCBlbnVtIFRva2VuVHlwZSB7XHJcbiAgLy8gUGFyc2VyIFRva2Vuc1xyXG4gIEVvZixcclxuICBQYW5pYyxcclxuXHJcbiAgLy8gU2luZ2xlIENoYXJhY3RlciBUb2tlbnNcclxuICBBbXBlcnNhbmQsXHJcbiAgQXRTaWduLFxyXG4gIENhcmV0LFxyXG4gIENvbW1hLFxyXG4gIERvbGxhcixcclxuICBEb3QsXHJcbiAgSGFzaCxcclxuICBMZWZ0QnJhY2UsXHJcbiAgTGVmdEJyYWNrZXQsXHJcbiAgTGVmdFBhcmVuLFxyXG4gIFBlcmNlbnQsXHJcbiAgUGlwZSxcclxuICBSaWdodEJyYWNlLFxyXG4gIFJpZ2h0QnJhY2tldCxcclxuICBSaWdodFBhcmVuLFxyXG4gIFNlbWljb2xvbixcclxuICBTbGFzaCxcclxuICBTdGFyLFxyXG5cclxuICAvLyBPbmUgT3IgVHdvIENoYXJhY3RlciBUb2tlbnNcclxuICBBcnJvdyxcclxuICBCYW5nLFxyXG4gIEJhbmdFcXVhbCxcclxuICBCYW5nRXF1YWxFcXVhbCxcclxuICBDb2xvbixcclxuICBFcXVhbCxcclxuICBFcXVhbEVxdWFsLFxyXG4gIEVxdWFsRXF1YWxFcXVhbCxcclxuICBHcmVhdGVyLFxyXG4gIEdyZWF0ZXJFcXVhbCxcclxuICBMZXNzLFxyXG4gIExlc3NFcXVhbCxcclxuICBNaW51cyxcclxuICBNaW51c0VxdWFsLFxyXG4gIE1pbnVzTWludXMsXHJcbiAgUGVyY2VudEVxdWFsLFxyXG4gIFBsdXMsXHJcbiAgUGx1c0VxdWFsLFxyXG4gIFBsdXNQbHVzLFxyXG4gIFF1ZXN0aW9uLFxyXG4gIFF1ZXN0aW9uRG90LFxyXG4gIFF1ZXN0aW9uUXVlc3Rpb24sXHJcbiAgU2xhc2hFcXVhbCxcclxuICBTdGFyRXF1YWwsXHJcbiAgRG90RG90LFxyXG4gIERvdERvdERvdCxcclxuICBMZXNzRXF1YWxHcmVhdGVyLFxyXG5cclxuICAvLyBMaXRlcmFsc1xyXG4gIElkZW50aWZpZXIsXHJcbiAgVGVtcGxhdGUsXHJcbiAgU3RyaW5nLFxyXG4gIE51bWJlcixcclxuXHJcbiAgLy8gT25lIE9yIFR3byBDaGFyYWN0ZXIgVG9rZW5zIChiaXR3aXNlIHNoaWZ0cylcclxuICBMZWZ0U2hpZnQsXHJcbiAgUmlnaHRTaGlmdCxcclxuICBQaXBlbGluZSxcclxuICBUaWxkZSxcclxuXHJcbiAgLy8gS2V5d29yZHNcclxuICBBbmQsXHJcbiAgQ29uc3QsXHJcbiAgRGVidWcsXHJcbiAgRmFsc2UsXHJcbiAgSW4sXHJcbiAgSW5zdGFuY2VvZixcclxuICBOZXcsXHJcbiAgTnVsbCxcclxuICBVbmRlZmluZWQsXHJcbiAgT2YsXHJcbiAgT3IsXHJcbiAgVHJ1ZSxcclxuICBUeXBlb2YsXHJcbiAgVm9pZCxcclxuICBXaXRoLFxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVG9rZW4ge1xyXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcbiAgcHVibGljIGxpbmU6IG51bWJlcjtcclxuICBwdWJsaWMgY29sOiBudW1iZXI7XHJcbiAgcHVibGljIHR5cGU6IFRva2VuVHlwZTtcclxuICBwdWJsaWMgbGl0ZXJhbDogYW55O1xyXG4gIHB1YmxpYyBsZXhlbWU6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICB0eXBlOiBUb2tlblR5cGUsXHJcbiAgICBsZXhlbWU6IHN0cmluZyxcclxuICAgIGxpdGVyYWw6IGFueSxcclxuICAgIGxpbmU6IG51bWJlcixcclxuICAgIGNvbDogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICB0aGlzLm5hbWUgPSBUb2tlblR5cGVbdHlwZV07XHJcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xyXG4gICAgdGhpcy5sZXhlbWUgPSBsZXhlbWU7XHJcbiAgICB0aGlzLmxpdGVyYWwgPSBsaXRlcmFsO1xyXG4gICAgdGhpcy5saW5lID0gbGluZTtcclxuICAgIHRoaXMuY29sID0gY29sO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvU3RyaW5nKCkge1xyXG4gICAgcmV0dXJuIGBbKCR7dGhpcy5saW5lfSk6XCIke3RoaXMubGV4ZW1lfVwiXWA7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgV2hpdGVTcGFjZXMgPSBbXCIgXCIsIFwiXFxuXCIsIFwiXFx0XCIsIFwiXFxyXCJdIGFzIGNvbnN0O1xyXG5cclxuZXhwb3J0IGNvbnN0IFNlbGZDbG9zaW5nVGFncyA9IFtcclxuICBcImFyZWFcIixcclxuICBcImJhc2VcIixcclxuICBcImJyXCIsXHJcbiAgXCJjb2xcIixcclxuICBcImVtYmVkXCIsXHJcbiAgXCJoclwiLFxyXG4gIFwiaW1nXCIsXHJcbiAgXCJpbnB1dFwiLFxyXG4gIFwibGlua1wiLFxyXG4gIFwibWV0YVwiLFxyXG4gIFwicGFyYW1cIixcclxuICBcInNvdXJjZVwiLFxyXG4gIFwidHJhY2tcIixcclxuICBcIndiclwiLFxyXG5dO1xyXG4iLCJpbXBvcnQgeyBLYXNwZXJFcnJvciwgS0Vycm9yQ29kZSwgS0Vycm9yQ29kZVR5cGUgfSBmcm9tIFwiLi90eXBlcy9lcnJvclwiO1xuaW1wb3J0ICogYXMgRXhwciBmcm9tIFwiLi90eXBlcy9leHByZXNzaW9uc1wiO1xuaW1wb3J0IHsgVG9rZW4sIFRva2VuVHlwZSB9IGZyb20gXCIuL3R5cGVzL3Rva2VuXCI7XG5cbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uUGFyc2VyIHtcbiAgcHJpdmF0ZSBjdXJyZW50OiBudW1iZXI7XG4gIHByaXZhdGUgdG9rZW5zOiBUb2tlbltdO1xuXG4gIHB1YmxpYyBwYXJzZSh0b2tlbnM6IFRva2VuW10pOiBFeHByLkV4cHJbXSB7XG4gICAgdGhpcy5jdXJyZW50ID0gMDtcbiAgICB0aGlzLnRva2VucyA9IHRva2VucztcbiAgICBjb25zdCBleHByZXNzaW9uczogRXhwci5FeHByW10gPSBbXTtcbiAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcbiAgICAgIGV4cHJlc3Npb25zLnB1c2godGhpcy5leHByZXNzaW9uKCkpO1xuICAgIH1cbiAgICByZXR1cm4gZXhwcmVzc2lvbnM7XG4gIH1cblxuICBwcml2YXRlIG1hdGNoKC4uLnR5cGVzOiBUb2tlblR5cGVbXSk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgdHlwZSBvZiB0eXBlcykge1xuICAgICAgaWYgKHRoaXMuY2hlY2sodHlwZSkpIHtcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGFkdmFuY2UoKTogVG9rZW4ge1xuICAgIGlmICghdGhpcy5lb2YoKSkge1xuICAgICAgdGhpcy5jdXJyZW50Kys7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnByZXZpb3VzKCk7XG4gIH1cblxuICBwcml2YXRlIHBlZWsoKTogVG9rZW4ge1xuICAgIHJldHVybiB0aGlzLnRva2Vuc1t0aGlzLmN1cnJlbnRdO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmV2aW91cygpOiBUb2tlbiB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zW3RoaXMuY3VycmVudCAtIDFdO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVjayh0eXBlOiBUb2tlblR5cGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wZWVrKCkudHlwZSA9PT0gdHlwZTtcbiAgfVxuXG4gIHByaXZhdGUgZW9mKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrKFRva2VuVHlwZS5Fb2YpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lKHR5cGU6IFRva2VuVHlwZSwgbWVzc2FnZTogc3RyaW5nKTogVG9rZW4ge1xuICAgIGlmICh0aGlzLmNoZWNrKHR5cGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXJyb3IoXG4gICAgICBLRXJyb3JDb2RlLlVORVhQRUNURURfVE9LRU4sXG4gICAgICB0aGlzLnBlZWsoKSxcbiAgICAgIHsgbWVzc2FnZTogbWVzc2FnZSwgdG9rZW46IHRoaXMucGVlaygpLmxleGVtZSB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZXJyb3IoY29kZTogS0Vycm9yQ29kZVR5cGUsIHRva2VuOiBUb2tlbiwgYXJnczogYW55ID0ge30pOiBhbnkge1xuICAgIHRocm93IG5ldyBLYXNwZXJFcnJvcihjb2RlLCBhcmdzLCB0b2tlbi5saW5lLCB0b2tlbi5jb2wpO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jaHJvbml6ZSgpOiB2b2lkIHtcbiAgICBkbyB7XG4gICAgICBpZiAodGhpcy5jaGVjayhUb2tlblR5cGUuU2VtaWNvbG9uKSB8fCB0aGlzLmNoZWNrKFRva2VuVHlwZS5SaWdodEJyYWNlKSkge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgfSB3aGlsZSAoIXRoaXMuZW9mKCkpO1xuICB9XG5cbiAgcHVibGljIGZvcmVhY2godG9rZW5zOiBUb2tlbltdKTogRXhwci5FeHByIHtcbiAgICB0aGlzLmN1cnJlbnQgPSAwO1xuICAgIHRoaXMudG9rZW5zID0gdG9rZW5zO1xuXG4gICAgY29uc3QgbmFtZSA9IHRoaXMuY29uc3VtZShcbiAgICAgIFRva2VuVHlwZS5JZGVudGlmaWVyLFxuICAgICAgYEV4cGVjdGVkIGFuIGlkZW50aWZpZXIgaW5zaWRlIFwiZWFjaFwiIHN0YXRlbWVudGBcbiAgICApO1xuXG4gICAgbGV0IGtleTogVG9rZW4gPSBudWxsO1xuICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5XaXRoKSkge1xuICAgICAga2V5ID0gdGhpcy5jb25zdW1lKFxuICAgICAgICBUb2tlblR5cGUuSWRlbnRpZmllcixcbiAgICAgICAgYEV4cGVjdGVkIGEgXCJrZXlcIiBpZGVudGlmaWVyIGFmdGVyIFwid2l0aFwiIGtleXdvcmQgaW4gZm9yZWFjaCBzdGF0ZW1lbnRgXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuY29uc3VtZShcbiAgICAgIFRva2VuVHlwZS5PZixcbiAgICAgIGBFeHBlY3RlZCBcIm9mXCIga2V5d29yZCBpbnNpZGUgZm9yZWFjaCBzdGF0ZW1lbnRgXG4gICAgKTtcbiAgICBjb25zdCBpdGVyYWJsZSA9IHRoaXMuZXhwcmVzc2lvbigpO1xuXG4gICAgcmV0dXJuIG5ldyBFeHByLkVhY2gobmFtZSwga2V5LCBpdGVyYWJsZSwgbmFtZS5saW5lKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhwcmVzc2lvbigpOiBFeHByLkV4cHIge1xuICAgIGNvbnN0IGV4cHJlc3Npb246IEV4cHIuRXhwciA9IHRoaXMuYXNzaWdubWVudCgpO1xuICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5TZW1pY29sb24pKSB7XG4gICAgICAvLyBjb25zdW1lIGFsbCBzZW1pY29sb25zXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgIHdoaWxlICh0aGlzLm1hdGNoKFRva2VuVHlwZS5TZW1pY29sb24pKSB7IC8qIGNvbnN1bWUgc2VtaWNvbG9ucyAqLyB9XG4gICAgfVxuICAgIHJldHVybiBleHByZXNzaW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NpZ25tZW50KCk6IEV4cHIuRXhwciB7XG4gICAgY29uc3QgZXhwcjogRXhwci5FeHByID0gdGhpcy5waXBlbGluZSgpO1xuICAgIGlmIChcbiAgICAgIHRoaXMubWF0Y2goXG4gICAgICAgIFRva2VuVHlwZS5FcXVhbCxcbiAgICAgICAgVG9rZW5UeXBlLlBsdXNFcXVhbCxcbiAgICAgICAgVG9rZW5UeXBlLk1pbnVzRXF1YWwsXG4gICAgICAgIFRva2VuVHlwZS5TdGFyRXF1YWwsXG4gICAgICAgIFRva2VuVHlwZS5TbGFzaEVxdWFsXG4gICAgICApXG4gICAgKSB7XG4gICAgICBjb25zdCBvcGVyYXRvcjogVG9rZW4gPSB0aGlzLnByZXZpb3VzKCk7XG4gICAgICBsZXQgdmFsdWU6IEV4cHIuRXhwciA9IHRoaXMuYXNzaWdubWVudCgpO1xuICAgICAgaWYgKGV4cHIgaW5zdGFuY2VvZiBFeHByLlZhcmlhYmxlKSB7XG4gICAgICAgIGNvbnN0IG5hbWU6IFRva2VuID0gZXhwci5uYW1lO1xuICAgICAgICBpZiAob3BlcmF0b3IudHlwZSAhPT0gVG9rZW5UeXBlLkVxdWFsKSB7XG4gICAgICAgICAgdmFsdWUgPSBuZXcgRXhwci5CaW5hcnkoXG4gICAgICAgICAgICBuZXcgRXhwci5WYXJpYWJsZShuYW1lLCBuYW1lLmxpbmUpLFxuICAgICAgICAgICAgb3BlcmF0b3IsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIG9wZXJhdG9yLmxpbmVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRXhwci5Bc3NpZ24obmFtZSwgdmFsdWUsIG5hbWUubGluZSk7XG4gICAgICB9IGVsc2UgaWYgKGV4cHIgaW5zdGFuY2VvZiBFeHByLkdldCkge1xuICAgICAgICBpZiAob3BlcmF0b3IudHlwZSAhPT0gVG9rZW5UeXBlLkVxdWFsKSB7XG4gICAgICAgICAgdmFsdWUgPSBuZXcgRXhwci5CaW5hcnkoXG4gICAgICAgICAgICBuZXcgRXhwci5HZXQoZXhwci5lbnRpdHksIGV4cHIua2V5LCBleHByLnR5cGUsIGV4cHIubGluZSksXG4gICAgICAgICAgICBvcGVyYXRvcixcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgb3BlcmF0b3IubGluZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBFeHByLlNldChleHByLmVudGl0eSwgZXhwci5rZXksIHZhbHVlLCBleHByLmxpbmUpO1xuICAgICAgfVxuICAgICAgdGhpcy5lcnJvcihLRXJyb3JDb2RlLklOVkFMSURfTFZBTFVFLCBvcGVyYXRvcik7XG4gICAgfVxuICAgIHJldHVybiBleHByO1xuICB9XG5cbiAgcHJpdmF0ZSBwaXBlbGluZSgpOiBFeHByLkV4cHIge1xuICAgIGxldCBleHByID0gdGhpcy50ZXJuYXJ5KCk7XG4gICAgd2hpbGUgKHRoaXMubWF0Y2goVG9rZW5UeXBlLlBpcGVsaW5lKSkge1xuICAgICAgY29uc3QgcmlnaHQgPSB0aGlzLnRlcm5hcnkoKTtcbiAgICAgIGV4cHIgPSBuZXcgRXhwci5QaXBlbGluZShleHByLCByaWdodCwgZXhwci5saW5lKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4cHI7XG4gIH1cblxuICBwcml2YXRlIHRlcm5hcnkoKTogRXhwci5FeHByIHtcbiAgICBjb25zdCBleHByID0gdGhpcy5udWxsQ29hbGVzY2luZygpO1xuICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5RdWVzdGlvbikpIHtcbiAgICAgIGNvbnN0IHRoZW5FeHByOiBFeHByLkV4cHIgPSB0aGlzLnRlcm5hcnkoKTtcbiAgICAgIHRoaXMuY29uc3VtZShUb2tlblR5cGUuQ29sb24sIGBFeHBlY3RlZCBcIjpcIiBhZnRlciB0ZXJuYXJ5ID8gZXhwcmVzc2lvbmApO1xuICAgICAgY29uc3QgZWxzZUV4cHI6IEV4cHIuRXhwciA9IHRoaXMudGVybmFyeSgpO1xuICAgICAgcmV0dXJuIG5ldyBFeHByLlRlcm5hcnkoZXhwciwgdGhlbkV4cHIsIGVsc2VFeHByLCBleHByLmxpbmUpO1xuICAgIH1cbiAgICByZXR1cm4gZXhwcjtcbiAgfVxuXG4gIHByaXZhdGUgbnVsbENvYWxlc2NpbmcoKTogRXhwci5FeHByIHtcbiAgICBjb25zdCBleHByID0gdGhpcy5sb2dpY2FsT3IoKTtcbiAgICBpZiAodGhpcy5tYXRjaChUb2tlblR5cGUuUXVlc3Rpb25RdWVzdGlvbikpIHtcbiAgICAgIGNvbnN0IHJpZ2h0RXhwcjogRXhwci5FeHByID0gdGhpcy5udWxsQ29hbGVzY2luZygpO1xuICAgICAgcmV0dXJuIG5ldyBFeHByLk51bGxDb2FsZXNjaW5nKGV4cHIsIHJpZ2h0RXhwciwgZXhwci5saW5lKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4cHI7XG4gIH1cblxuICBwcml2YXRlIGxvZ2ljYWxPcigpOiBFeHByLkV4cHIge1xuICAgIGxldCBleHByID0gdGhpcy5sb2dpY2FsQW5kKCk7XG4gICAgd2hpbGUgKHRoaXMubWF0Y2goVG9rZW5UeXBlLk9yKSkge1xuICAgICAgY29uc3Qgb3BlcmF0b3I6IFRva2VuID0gdGhpcy5wcmV2aW91cygpO1xuICAgICAgY29uc3QgcmlnaHQ6IEV4cHIuRXhwciA9IHRoaXMubG9naWNhbEFuZCgpO1xuICAgICAgZXhwciA9IG5ldyBFeHByLkxvZ2ljYWwoZXhwciwgb3BlcmF0b3IsIHJpZ2h0LCBvcGVyYXRvci5saW5lKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4cHI7XG4gIH1cblxuICBwcml2YXRlIGxvZ2ljYWxBbmQoKTogRXhwci5FeHByIHtcbiAgICBsZXQgZXhwciA9IHRoaXMuZXF1YWxpdHkoKTtcbiAgICB3aGlsZSAodGhpcy5tYXRjaChUb2tlblR5cGUuQW5kKSkge1xuICAgICAgY29uc3Qgb3BlcmF0b3I6IFRva2VuID0gdGhpcy5wcmV2aW91cygpO1xuICAgICAgY29uc3QgcmlnaHQ6IEV4cHIuRXhwciA9IHRoaXMuZXF1YWxpdHkoKTtcbiAgICAgIGV4cHIgPSBuZXcgRXhwci5Mb2dpY2FsKGV4cHIsIG9wZXJhdG9yLCByaWdodCwgb3BlcmF0b3IubGluZSk7XG4gICAgfVxuICAgIHJldHVybiBleHByO1xuICB9XG5cbiAgcHJpdmF0ZSBlcXVhbGl0eSgpOiBFeHByLkV4cHIge1xuICAgIGxldCBleHByOiBFeHByLkV4cHIgPSB0aGlzLnNoaWZ0KCk7XG4gICAgd2hpbGUgKFxuICAgICAgdGhpcy5tYXRjaChcbiAgICAgICAgVG9rZW5UeXBlLkJhbmdFcXVhbCxcbiAgICAgICAgVG9rZW5UeXBlLkJhbmdFcXVhbEVxdWFsLFxuICAgICAgICBUb2tlblR5cGUuRXF1YWxFcXVhbCxcbiAgICAgICAgVG9rZW5UeXBlLkVxdWFsRXF1YWxFcXVhbCxcbiAgICAgICAgVG9rZW5UeXBlLkdyZWF0ZXIsXG4gICAgICAgIFRva2VuVHlwZS5HcmVhdGVyRXF1YWwsXG4gICAgICAgIFRva2VuVHlwZS5MZXNzLFxuICAgICAgICBUb2tlblR5cGUuTGVzc0VxdWFsLFxuICAgICAgICBUb2tlblR5cGUuSW5zdGFuY2VvZixcbiAgICAgICAgVG9rZW5UeXBlLkluLFxuICAgICAgKVxuICAgICkge1xuICAgICAgY29uc3Qgb3BlcmF0b3I6IFRva2VuID0gdGhpcy5wcmV2aW91cygpO1xuICAgICAgY29uc3QgcmlnaHQ6IEV4cHIuRXhwciA9IHRoaXMuc2hpZnQoKTtcbiAgICAgIGV4cHIgPSBuZXcgRXhwci5CaW5hcnkoZXhwciwgb3BlcmF0b3IsIHJpZ2h0LCBvcGVyYXRvci5saW5lKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4cHI7XG4gIH1cblxuICBwcml2YXRlIHNoaWZ0KCk6IEV4cHIuRXhwciB7XG4gICAgbGV0IGV4cHI6IEV4cHIuRXhwciA9IHRoaXMuYWRkaXRpb24oKTtcbiAgICB3aGlsZSAodGhpcy5tYXRjaChUb2tlblR5cGUuTGVmdFNoaWZ0LCBUb2tlblR5cGUuUmlnaHRTaGlmdCkpIHtcbiAgICAgIGNvbnN0IG9wZXJhdG9yOiBUb2tlbiA9IHRoaXMucHJldmlvdXMoKTtcbiAgICAgIGNvbnN0IHJpZ2h0OiBFeHByLkV4cHIgPSB0aGlzLmFkZGl0aW9uKCk7XG4gICAgICBleHByID0gbmV3IEV4cHIuQmluYXJ5KGV4cHIsIG9wZXJhdG9yLCByaWdodCwgb3BlcmF0b3IubGluZSk7XG4gICAgfVxuICAgIHJldHVybiBleHByO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRpdGlvbigpOiBFeHByLkV4cHIge1xuICAgIGxldCBleHByOiBFeHByLkV4cHIgPSB0aGlzLm1vZHVsdXMoKTtcbiAgICB3aGlsZSAodGhpcy5tYXRjaChUb2tlblR5cGUuTWludXMsIFRva2VuVHlwZS5QbHVzKSkge1xuICAgICAgY29uc3Qgb3BlcmF0b3I6IFRva2VuID0gdGhpcy5wcmV2aW91cygpO1xuICAgICAgY29uc3QgcmlnaHQ6IEV4cHIuRXhwciA9IHRoaXMubW9kdWx1cygpO1xuICAgICAgZXhwciA9IG5ldyBFeHByLkJpbmFyeShleHByLCBvcGVyYXRvciwgcmlnaHQsIG9wZXJhdG9yLmxpbmUpO1xuICAgIH1cbiAgICByZXR1cm4gZXhwcjtcbiAgfVxuXG4gIHByaXZhdGUgbW9kdWx1cygpOiBFeHByLkV4cHIge1xuICAgIGxldCBleHByOiBFeHByLkV4cHIgPSB0aGlzLm11bHRpcGxpY2F0aW9uKCk7XG4gICAgd2hpbGUgKHRoaXMubWF0Y2goVG9rZW5UeXBlLlBlcmNlbnQpKSB7XG4gICAgICBjb25zdCBvcGVyYXRvcjogVG9rZW4gPSB0aGlzLnByZXZpb3VzKCk7XG4gICAgICBjb25zdCByaWdodDogRXhwci5FeHByID0gdGhpcy5tdWx0aXBsaWNhdGlvbigpO1xuICAgICAgZXhwciA9IG5ldyBFeHByLkJpbmFyeShleHByLCBvcGVyYXRvciwgcmlnaHQsIG9wZXJhdG9yLmxpbmUpO1xuICAgIH1cbiAgICByZXR1cm4gZXhwcjtcbiAgfVxuXG4gIHByaXZhdGUgbXVsdGlwbGljYXRpb24oKTogRXhwci5FeHByIHtcbiAgICBsZXQgZXhwcjogRXhwci5FeHByID0gdGhpcy50eXBlb2YoKTtcbiAgICB3aGlsZSAodGhpcy5tYXRjaChUb2tlblR5cGUuU2xhc2gsIFRva2VuVHlwZS5TdGFyKSkge1xuICAgICAgY29uc3Qgb3BlcmF0b3I6IFRva2VuID0gdGhpcy5wcmV2aW91cygpO1xuICAgICAgY29uc3QgcmlnaHQ6IEV4cHIuRXhwciA9IHRoaXMudHlwZW9mKCk7XG4gICAgICBleHByID0gbmV3IEV4cHIuQmluYXJ5KGV4cHIsIG9wZXJhdG9yLCByaWdodCwgb3BlcmF0b3IubGluZSk7XG4gICAgfVxuICAgIHJldHVybiBleHByO1xuICB9XG5cbiAgcHJpdmF0ZSB0eXBlb2YoKTogRXhwci5FeHByIHtcbiAgICBpZiAodGhpcy5tYXRjaChUb2tlblR5cGUuVHlwZW9mKSkge1xuICAgICAgY29uc3Qgb3BlcmF0b3I6IFRva2VuID0gdGhpcy5wcmV2aW91cygpO1xuICAgICAgY29uc3QgdmFsdWU6IEV4cHIuRXhwciA9IHRoaXMudHlwZW9mKCk7XG4gICAgICByZXR1cm4gbmV3IEV4cHIuVHlwZW9mKHZhbHVlLCBvcGVyYXRvci5saW5lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudW5hcnkoKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5hcnkoKTogRXhwci5FeHByIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLm1hdGNoKFxuICAgICAgICBUb2tlblR5cGUuTWludXMsXG4gICAgICAgIFRva2VuVHlwZS5CYW5nLFxuICAgICAgICBUb2tlblR5cGUuVGlsZGUsXG4gICAgICAgIFRva2VuVHlwZS5Eb2xsYXIsXG4gICAgICAgIFRva2VuVHlwZS5QbHVzUGx1cyxcbiAgICAgICAgVG9rZW5UeXBlLk1pbnVzTWludXNcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGNvbnN0IG9wZXJhdG9yOiBUb2tlbiA9IHRoaXMucHJldmlvdXMoKTtcbiAgICAgIGNvbnN0IHJpZ2h0OiBFeHByLkV4cHIgPSB0aGlzLnVuYXJ5KCk7XG4gICAgICByZXR1cm4gbmV3IEV4cHIuVW5hcnkob3BlcmF0b3IsIHJpZ2h0LCBvcGVyYXRvci5saW5lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubmV3S2V5d29yZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBuZXdLZXl3b3JkKCk6IEV4cHIuRXhwciB7XG4gICAgaWYgKHRoaXMubWF0Y2goVG9rZW5UeXBlLk5ldykpIHtcbiAgICAgIGNvbnN0IGtleXdvcmQgPSB0aGlzLnByZXZpb3VzKCk7XG4gICAgICBjb25zdCBjb25zdHJ1Y3Q6IEV4cHIuRXhwciA9IHRoaXMuY2FsbCgpO1xuICAgICAgaWYgKGNvbnN0cnVjdCBpbnN0YW5jZW9mIEV4cHIuQ2FsbCkge1xuICAgICAgICByZXR1cm4gbmV3IEV4cHIuTmV3KGNvbnN0cnVjdC5jYWxsZWUsIGNvbnN0cnVjdC5hcmdzLCBrZXl3b3JkLmxpbmUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBFeHByLk5ldyhjb25zdHJ1Y3QsIFtdLCBrZXl3b3JkLmxpbmUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wb3N0Zml4KCk7XG4gIH1cblxuICBwcml2YXRlIHBvc3RmaXgoKTogRXhwci5FeHByIHtcbiAgICBjb25zdCBleHByID0gdGhpcy5jYWxsKCk7XG4gICAgaWYgKHRoaXMubWF0Y2goVG9rZW5UeXBlLlBsdXNQbHVzKSkge1xuICAgICAgcmV0dXJuIG5ldyBFeHByLlBvc3RmaXgoZXhwciwgMSwgZXhwci5saW5lKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF0Y2goVG9rZW5UeXBlLk1pbnVzTWludXMpKSB7XG4gICAgICByZXR1cm4gbmV3IEV4cHIuUG9zdGZpeChleHByLCAtMSwgZXhwci5saW5lKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4cHI7XG4gIH1cblxuICBwcml2YXRlIGNhbGwoKTogRXhwci5FeHByIHtcbiAgICBsZXQgZXhwcjogRXhwci5FeHByID0gdGhpcy5wcmltYXJ5KCk7XG4gICAgbGV0IGNvbnN1bWVkOiBib29sZWFuO1xuICAgIGRvIHtcbiAgICAgIGNvbnN1bWVkID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5tYXRjaChUb2tlblR5cGUuTGVmdFBhcmVuKSkge1xuICAgICAgICBjb25zdW1lZCA9IHRydWU7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBleHByID0gdGhpcy5maW5pc2hDYWxsKGV4cHIsIHRoaXMucHJldmlvdXMoKSwgZmFsc2UpO1xuICAgICAgICB9IHdoaWxlICh0aGlzLm1hdGNoKFRva2VuVHlwZS5MZWZ0UGFyZW4pKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5Eb3QsIFRva2VuVHlwZS5RdWVzdGlvbkRvdCkpIHtcbiAgICAgICAgY29uc3VtZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBvcGVyYXRvciA9IHRoaXMucHJldmlvdXMoKTtcbiAgICAgICAgaWYgKG9wZXJhdG9yLnR5cGUgPT09IFRva2VuVHlwZS5RdWVzdGlvbkRvdCAmJiB0aGlzLm1hdGNoKFRva2VuVHlwZS5MZWZ0QnJhY2tldCkpIHtcbiAgICAgICAgICBleHByID0gdGhpcy5icmFja2V0R2V0KGV4cHIsIG9wZXJhdG9yKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvci50eXBlID09PSBUb2tlblR5cGUuUXVlc3Rpb25Eb3QgJiYgdGhpcy5tYXRjaChUb2tlblR5cGUuTGVmdFBhcmVuKSkge1xuICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmlzaENhbGwoZXhwciwgdGhpcy5wcmV2aW91cygpLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBleHByID0gdGhpcy5kb3RHZXQoZXhwciwgb3BlcmF0b3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5tYXRjaChUb2tlblR5cGUuTGVmdEJyYWNrZXQpKSB7XG4gICAgICAgIGNvbnN1bWVkID0gdHJ1ZTtcbiAgICAgICAgZXhwciA9IHRoaXMuYnJhY2tldEdldChleHByLCB0aGlzLnByZXZpb3VzKCkpO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKGNvbnN1bWVkKTtcbiAgICByZXR1cm4gZXhwcjtcbiAgfVxuXG4gIHByaXZhdGUgdG9rZW5BdChvZmZzZXQ6IG51bWJlcik6IFRva2VuVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zW3RoaXMuY3VycmVudCArIG9mZnNldF0/LnR5cGU7XG4gIH1cblxuICBwcml2YXRlIGlzQXJyb3dQYXJhbXMoKTogYm9vbGVhbiB7XG4gICAgbGV0IGkgPSB0aGlzLmN1cnJlbnQgKyAxOyAvLyBza2lwIChcbiAgICBpZiAodGhpcy50b2tlbnNbaV0/LnR5cGUgPT09IFRva2VuVHlwZS5SaWdodFBhcmVuKSB7XG4gICAgICByZXR1cm4gdGhpcy50b2tlbnNbaSArIDFdPy50eXBlID09PSBUb2tlblR5cGUuQXJyb3c7XG4gICAgfVxuICAgIHdoaWxlIChpIDwgdGhpcy50b2tlbnMubGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy50b2tlbnNbaV0/LnR5cGUgIT09IFRva2VuVHlwZS5JZGVudGlmaWVyKSByZXR1cm4gZmFsc2U7XG4gICAgICBpKys7XG4gICAgICBpZiAodGhpcy50b2tlbnNbaV0/LnR5cGUgPT09IFRva2VuVHlwZS5SaWdodFBhcmVuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2Vuc1tpICsgMV0/LnR5cGUgPT09IFRva2VuVHlwZS5BcnJvdztcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnRva2Vuc1tpXT8udHlwZSAhPT0gVG9rZW5UeXBlLkNvbW1hKSByZXR1cm4gZmFsc2U7XG4gICAgICBpKys7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluaXNoQ2FsbChjYWxsZWU6IEV4cHIuRXhwciwgcGFyZW46IFRva2VuLCBvcHRpb25hbDogYm9vbGVhbik6IEV4cHIuRXhwciB7XG4gICAgY29uc3QgYXJnczogRXhwci5FeHByW10gPSBbXTtcbiAgICBpZiAoIXRoaXMuY2hlY2soVG9rZW5UeXBlLlJpZ2h0UGFyZW4pKSB7XG4gICAgICBkbyB7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5Eb3REb3REb3QpKSB7XG4gICAgICAgICAgYXJncy5wdXNoKG5ldyBFeHByLlNwcmVhZCh0aGlzLmV4cHJlc3Npb24oKSwgdGhpcy5wcmV2aW91cygpLmxpbmUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhcmdzLnB1c2godGhpcy5leHByZXNzaW9uKCkpO1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlICh0aGlzLm1hdGNoKFRva2VuVHlwZS5Db21tYSkpO1xuICAgIH1cbiAgICBjb25zdCBjbG9zZVBhcmVuID0gdGhpcy5jb25zdW1lKFRva2VuVHlwZS5SaWdodFBhcmVuLCBgRXhwZWN0ZWQgXCIpXCIgYWZ0ZXIgYXJndW1lbnRzYCk7XG4gICAgcmV0dXJuIG5ldyBFeHByLkNhbGwoY2FsbGVlLCBjbG9zZVBhcmVuLCBhcmdzLCBjbG9zZVBhcmVuLmxpbmUsIG9wdGlvbmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgZG90R2V0KGV4cHI6IEV4cHIuRXhwciwgb3BlcmF0b3I6IFRva2VuKTogRXhwci5FeHByIHtcbiAgICBjb25zdCBuYW1lOiBUb2tlbiA9IHRoaXMuY29uc3VtZShcbiAgICAgIFRva2VuVHlwZS5JZGVudGlmaWVyLFxuICAgICAgYEV4cGVjdCBwcm9wZXJ0eSBuYW1lIGFmdGVyICcuJ2BcbiAgICApO1xuICAgIGNvbnN0IGtleTogRXhwci5LZXkgPSBuZXcgRXhwci5LZXkobmFtZSwgbmFtZS5saW5lKTtcbiAgICByZXR1cm4gbmV3IEV4cHIuR2V0KGV4cHIsIGtleSwgb3BlcmF0b3IudHlwZSwgbmFtZS5saW5lKTtcbiAgfVxuXG4gIHByaXZhdGUgYnJhY2tldEdldChleHByOiBFeHByLkV4cHIsIG9wZXJhdG9yOiBUb2tlbik6IEV4cHIuRXhwciB7XG4gICAgbGV0IGtleTogRXhwci5FeHByID0gbnVsbDtcblxuICAgIGlmICghdGhpcy5jaGVjayhUb2tlblR5cGUuUmlnaHRCcmFja2V0KSkge1xuICAgICAga2V5ID0gdGhpcy5leHByZXNzaW9uKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb25zdW1lKFRva2VuVHlwZS5SaWdodEJyYWNrZXQsIGBFeHBlY3RlZCBcIl1cIiBhZnRlciBhbiBpbmRleGApO1xuICAgIHJldHVybiBuZXcgRXhwci5HZXQoZXhwciwga2V5LCBvcGVyYXRvci50eXBlLCBvcGVyYXRvci5saW5lKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJpbWFyeSgpOiBFeHByLkV4cHIge1xuICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5GYWxzZSkpIHtcbiAgICAgIHJldHVybiBuZXcgRXhwci5MaXRlcmFsKGZhbHNlLCB0aGlzLnByZXZpb3VzKCkubGluZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5UcnVlKSkge1xuICAgICAgcmV0dXJuIG5ldyBFeHByLkxpdGVyYWwodHJ1ZSwgdGhpcy5wcmV2aW91cygpLmxpbmUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXRjaChUb2tlblR5cGUuTnVsbCkpIHtcbiAgICAgIHJldHVybiBuZXcgRXhwci5MaXRlcmFsKG51bGwsIHRoaXMucHJldmlvdXMoKS5saW5lKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF0Y2goVG9rZW5UeXBlLlVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybiBuZXcgRXhwci5MaXRlcmFsKHVuZGVmaW5lZCwgdGhpcy5wcmV2aW91cygpLmxpbmUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXRjaChUb2tlblR5cGUuTnVtYmVyKSB8fCB0aGlzLm1hdGNoKFRva2VuVHlwZS5TdHJpbmcpKSB7XG4gICAgICByZXR1cm4gbmV3IEV4cHIuTGl0ZXJhbCh0aGlzLnByZXZpb3VzKCkubGl0ZXJhbCwgdGhpcy5wcmV2aW91cygpLmxpbmUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXRjaChUb2tlblR5cGUuVGVtcGxhdGUpKSB7XG4gICAgICByZXR1cm4gbmV3IEV4cHIuVGVtcGxhdGUodGhpcy5wcmV2aW91cygpLmxpdGVyYWwsIHRoaXMucHJldmlvdXMoKS5saW5lKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2hlY2soVG9rZW5UeXBlLklkZW50aWZpZXIpICYmIHRoaXMudG9rZW5BdCgxKSA9PT0gVG9rZW5UeXBlLkFycm93KSB7XG4gICAgICBjb25zdCBwYXJhbSA9IHRoaXMuYWR2YW5jZSgpO1xuICAgICAgdGhpcy5hZHZhbmNlKCk7IC8vIGNvbnN1bWUgPT5cbiAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLmV4cHJlc3Npb24oKTtcbiAgICAgIHJldHVybiBuZXcgRXhwci5BcnJvd0Z1bmN0aW9uKFtwYXJhbV0sIGJvZHksIHBhcmFtLmxpbmUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXRjaChUb2tlblR5cGUuSWRlbnRpZmllcikpIHtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLnByZXZpb3VzKCk7XG4gICAgICByZXR1cm4gbmV3IEV4cHIuVmFyaWFibGUoaWRlbnRpZmllciwgaWRlbnRpZmllci5saW5lKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2hlY2soVG9rZW5UeXBlLkxlZnRQYXJlbikgJiYgdGhpcy5pc0Fycm93UGFyYW1zKCkpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpOyAvLyBjb25zdW1lIChcbiAgICAgIGNvbnN0IHBhcmFtczogVG9rZW5bXSA9IFtdO1xuICAgICAgaWYgKCF0aGlzLmNoZWNrKFRva2VuVHlwZS5SaWdodFBhcmVuKSkge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgcGFyYW1zLnB1c2godGhpcy5jb25zdW1lKFRva2VuVHlwZS5JZGVudGlmaWVyLCBcIkV4cGVjdGVkIHBhcmFtZXRlciBuYW1lXCIpKTtcbiAgICAgICAgfSB3aGlsZSAodGhpcy5tYXRjaChUb2tlblR5cGUuQ29tbWEpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29uc3VtZShUb2tlblR5cGUuUmlnaHRQYXJlbiwgYEV4cGVjdGVkIFwiKVwiYCk7XG4gICAgICB0aGlzLmNvbnN1bWUoVG9rZW5UeXBlLkFycm93LCBgRXhwZWN0ZWQgXCI9PlwiYCk7XG4gICAgICBjb25zdCBib2R5ID0gdGhpcy5leHByZXNzaW9uKCk7XG4gICAgICByZXR1cm4gbmV3IEV4cHIuQXJyb3dGdW5jdGlvbihwYXJhbXMsIGJvZHksIHRoaXMucHJldmlvdXMoKS5saW5lKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF0Y2goVG9rZW5UeXBlLkxlZnRQYXJlbikpIHtcbiAgICAgIGNvbnN0IGV4cHI6IEV4cHIuRXhwciA9IHRoaXMuZXhwcmVzc2lvbigpO1xuICAgICAgdGhpcy5jb25zdW1lKFRva2VuVHlwZS5SaWdodFBhcmVuLCBgRXhwZWN0ZWQgXCIpXCIgYWZ0ZXIgZXhwcmVzc2lvbmApO1xuICAgICAgcmV0dXJuIG5ldyBFeHByLkdyb3VwaW5nKGV4cHIsIGV4cHIubGluZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5MZWZ0QnJhY2UpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaWN0aW9uYXJ5KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5MZWZ0QnJhY2tldCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpc3QoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF0Y2goVG9rZW5UeXBlLlZvaWQpKSB7XG4gICAgICBjb25zdCBleHByOiBFeHByLkV4cHIgPSB0aGlzLmV4cHJlc3Npb24oKTtcbiAgICAgIHJldHVybiBuZXcgRXhwci5Wb2lkKGV4cHIsIHRoaXMucHJldmlvdXMoKS5saW5lKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF0Y2goVG9rZW5UeXBlLkRlYnVnKSkge1xuICAgICAgY29uc3QgZXhwcjogRXhwci5FeHByID0gdGhpcy5leHByZXNzaW9uKCk7XG4gICAgICByZXR1cm4gbmV3IEV4cHIuRGVidWcoZXhwciwgdGhpcy5wcmV2aW91cygpLmxpbmUpO1xuICAgIH1cblxuICAgIHRocm93IHRoaXMuZXJyb3IoXG4gICAgICBLRXJyb3JDb2RlLkVYUEVDVEVEX0VYUFJFU1NJT04sXG4gICAgICB0aGlzLnBlZWsoKSxcbiAgICAgIHsgdG9rZW46IHRoaXMucGVlaygpLmxleGVtZSB9XG4gICAgKTtcbiAgICAvLyB1bnJlYWNoZWFibGUgY29kZVxuICAgIHJldHVybiBuZXcgRXhwci5MaXRlcmFsKG51bGwsIDApO1xuICB9XG5cbiAgcHVibGljIGRpY3Rpb25hcnkoKTogRXhwci5FeHByIHtcbiAgICBjb25zdCBsZWZ0QnJhY2UgPSB0aGlzLnByZXZpb3VzKCk7XG4gICAgaWYgKHRoaXMubWF0Y2goVG9rZW5UeXBlLlJpZ2h0QnJhY2UpKSB7XG4gICAgICByZXR1cm4gbmV3IEV4cHIuRGljdGlvbmFyeShbXSwgdGhpcy5wcmV2aW91cygpLmxpbmUpO1xuICAgIH1cbiAgICBjb25zdCBwcm9wZXJ0aWVzOiBFeHByLkV4cHJbXSA9IFtdO1xuICAgIGRvIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5Eb3REb3REb3QpKSB7XG4gICAgICAgIHByb3BlcnRpZXMucHVzaChuZXcgRXhwci5TcHJlYWQodGhpcy5leHByZXNzaW9uKCksIHRoaXMucHJldmlvdXMoKS5saW5lKSk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0aGlzLm1hdGNoKFRva2VuVHlwZS5TdHJpbmcsIFRva2VuVHlwZS5JZGVudGlmaWVyLCBUb2tlblR5cGUuTnVtYmVyKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGtleTogVG9rZW4gPSB0aGlzLnByZXZpb3VzKCk7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5Db2xvbikpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZXhwcmVzc2lvbigpO1xuICAgICAgICAgIHByb3BlcnRpZXMucHVzaChcbiAgICAgICAgICAgIG5ldyBFeHByLlNldChudWxsLCBuZXcgRXhwci5LZXkoa2V5LCBrZXkubGluZSksIHZhbHVlLCBrZXkubGluZSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gbmV3IEV4cHIuVmFyaWFibGUoa2V5LCBrZXkubGluZSk7XG4gICAgICAgICAgcHJvcGVydGllcy5wdXNoKFxuICAgICAgICAgICAgbmV3IEV4cHIuU2V0KG51bGwsIG5ldyBFeHByLktleShrZXksIGtleS5saW5lKSwgdmFsdWUsIGtleS5saW5lKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgS0Vycm9yQ29kZS5JTlZBTElEX0RJQ1RJT05BUllfS0VZLFxuICAgICAgICAgIHRoaXMucGVlaygpLFxuICAgICAgICAgIHsgdG9rZW46IHRoaXMucGVlaygpLmxleGVtZSB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSB3aGlsZSAodGhpcy5tYXRjaChUb2tlblR5cGUuQ29tbWEpKTtcbiAgICB0aGlzLmNvbnN1bWUoVG9rZW5UeXBlLlJpZ2h0QnJhY2UsIGBFeHBlY3RlZCBcIn1cIiBhZnRlciBvYmplY3QgbGl0ZXJhbGApO1xuXG4gICAgcmV0dXJuIG5ldyBFeHByLkRpY3Rpb25hcnkocHJvcGVydGllcywgbGVmdEJyYWNlLmxpbmUpO1xuICB9XG5cbiAgcHJpdmF0ZSBsaXN0KCk6IEV4cHIuRXhwciB7XG4gICAgY29uc3QgdmFsdWVzOiBFeHByLkV4cHJbXSA9IFtdO1xuICAgIGNvbnN0IGxlZnRCcmFja2V0ID0gdGhpcy5wcmV2aW91cygpO1xuXG4gICAgaWYgKHRoaXMubWF0Y2goVG9rZW5UeXBlLlJpZ2h0QnJhY2tldCkpIHtcbiAgICAgIHJldHVybiBuZXcgRXhwci5MaXN0KFtdLCB0aGlzLnByZXZpb3VzKCkubGluZSk7XG4gICAgfVxuICAgIGRvIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5Eb3REb3REb3QpKSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKG5ldyBFeHByLlNwcmVhZCh0aGlzLmV4cHJlc3Npb24oKSwgdGhpcy5wcmV2aW91cygpLmxpbmUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKHRoaXMuZXhwcmVzc2lvbigpKTtcbiAgICAgIH1cbiAgICB9IHdoaWxlICh0aGlzLm1hdGNoKFRva2VuVHlwZS5Db21tYSkpO1xuXG4gICAgdGhpcy5jb25zdW1lKFxuICAgICAgVG9rZW5UeXBlLlJpZ2h0QnJhY2tldCxcbiAgICAgIGBFeHBlY3RlZCBcIl1cIiBhZnRlciBhcnJheSBkZWNsYXJhdGlvbmBcbiAgICApO1xuICAgIHJldHVybiBuZXcgRXhwci5MaXN0KHZhbHVlcywgbGVmdEJyYWNrZXQubGluZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFRva2VuVHlwZSB9IGZyb20gXCIuL3R5cGVzL3Rva2VuXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RpZ2l0KGNoYXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2hhciA+PSBcIjBcIiAmJiBjaGFyIDw9IFwiOVwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBbHBoYShjaGFyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICAoY2hhciA+PSBcImFcIiAmJiBjaGFyIDw9IFwielwiKSB8fCAoY2hhciA+PSBcIkFcIiAmJiBjaGFyIDw9IFwiWlwiKSB8fCBjaGFyID09PSBcIiRcIiB8fCBjaGFyID09PSBcIl9cIlxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBbHBoYU51bWVyaWMoY2hhcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc0FscGhhKGNoYXIpIHx8IGlzRGlnaXQoY2hhcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYXBpdGFsaXplKHdvcmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zdWJzdHJpbmcoMSkudG9Mb3dlckNhc2UoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzS2V5d29yZCh3b3JkOiBrZXlvZiB0eXBlb2YgVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBUb2tlblR5cGVbd29yZF0gPj0gVG9rZW5UeXBlLkFuZDtcbn1cbiIsImltcG9ydCAqIGFzIFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBUb2tlbiwgVG9rZW5UeXBlIH0gZnJvbSBcIi4vdHlwZXMvdG9rZW5cIjtcbmltcG9ydCB7IEthc3BlckVycm9yLCBLRXJyb3JDb2RlLCBLRXJyb3JDb2RlVHlwZSB9IGZyb20gXCIuL3R5cGVzL2Vycm9yXCI7XG5cbmV4cG9ydCBjbGFzcyBTY2FubmVyIHtcbiAgLyoqIHNjcmlwdHMgc291cmNlIGNvZGUgKi9cbiAgcHVibGljIHNvdXJjZTogc3RyaW5nO1xuICAvKiogY29udGFpbnMgdGhlIHNvdXJjZSBjb2RlIHJlcHJlc2VudGVkIGFzIGxpc3Qgb2YgdG9rZW5zICovXG4gIHB1YmxpYyB0b2tlbnM6IFRva2VuW107XG4gIC8qKiBwb2ludHMgdG8gdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGJlaW5nIHRva2VuaXplZCAqL1xuICBwcml2YXRlIGN1cnJlbnQ6IG51bWJlcjtcbiAgLyoqIHBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlIHRva2VuICAqL1xuICBwcml2YXRlIHN0YXJ0OiBudW1iZXI7XG4gIC8qKiBjdXJyZW50IGxpbmUgb2Ygc291cmNlIGNvZGUgYmVpbmcgdG9rZW5pemVkICovXG4gIHByaXZhdGUgbGluZTogbnVtYmVyO1xuICAvKiogY3VycmVudCBjb2x1bW4gb2YgdGhlIGNoYXJhY3RlciBiZWluZyB0b2tlbml6ZWQgKi9cbiAgcHJpdmF0ZSBjb2w6IG51bWJlcjtcblxuICBwdWJsaWMgc2Nhbihzb3VyY2U6IHN0cmluZyk6IFRva2VuW10ge1xuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIHRoaXMudG9rZW5zID0gW107XG4gICAgdGhpcy5jdXJyZW50ID0gMDtcbiAgICB0aGlzLnN0YXJ0ID0gMDtcbiAgICB0aGlzLmxpbmUgPSAxO1xuICAgIHRoaXMuY29sID0gMTtcblxuICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuICAgICAgdGhpcy5zdGFydCA9IHRoaXMuY3VycmVudDtcbiAgICAgIHRoaXMuZ2V0VG9rZW4oKTtcbiAgICB9XG4gICAgdGhpcy50b2tlbnMucHVzaChuZXcgVG9rZW4oVG9rZW5UeXBlLkVvZiwgXCJcIiwgbnVsbCwgdGhpcy5saW5lLCAwKSk7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zO1xuICB9XG5cbiAgcHJpdmF0ZSBlb2YoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudCA+PSB0aGlzLnNvdXJjZS5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIGFkdmFuY2UoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5wZWVrKCkgPT09IFwiXFxuXCIpIHtcbiAgICAgIHRoaXMubGluZSsrO1xuICAgICAgdGhpcy5jb2wgPSAwO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnQrKztcbiAgICB0aGlzLmNvbCsrO1xuICAgIHJldHVybiB0aGlzLnNvdXJjZS5jaGFyQXQodGhpcy5jdXJyZW50IC0gMSk7XG4gIH1cblxuICBwcml2YXRlIGFkZFRva2VuKHRva2VuVHlwZTogVG9rZW5UeXBlLCBsaXRlcmFsOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5zb3VyY2Uuc3Vic3RyaW5nKHRoaXMuc3RhcnQsIHRoaXMuY3VycmVudCk7XG4gICAgdGhpcy50b2tlbnMucHVzaChuZXcgVG9rZW4odG9rZW5UeXBlLCB0ZXh0LCBsaXRlcmFsLCB0aGlzLmxpbmUsIHRoaXMuY29sKSk7XG4gIH1cblxuICBwcml2YXRlIG1hdGNoKGV4cGVjdGVkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5lb2YoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNvdXJjZS5jaGFyQXQodGhpcy5jdXJyZW50KSAhPT0gZXhwZWN0ZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnQrKztcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgcGVlaygpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmVvZigpKSB7XG4gICAgICByZXR1cm4gXCJcXDBcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc291cmNlLmNoYXJBdCh0aGlzLmN1cnJlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBwZWVrTmV4dCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmN1cnJlbnQgKyAxID49IHRoaXMuc291cmNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFwiXFwwXCI7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNvdXJjZS5jaGFyQXQodGhpcy5jdXJyZW50ICsgMSk7XG4gIH1cblxuICBwcml2YXRlIGNvbW1lbnQoKTogdm9pZCB7XG4gICAgd2hpbGUgKHRoaXMucGVlaygpICE9PSBcIlxcblwiICYmICF0aGlzLmVvZigpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG11bHRpbGluZUNvbW1lbnQoKTogdm9pZCB7XG4gICAgd2hpbGUgKCF0aGlzLmVvZigpICYmICEodGhpcy5wZWVrKCkgPT09IFwiKlwiICYmIHRoaXMucGVla05leHQoKSA9PT0gXCIvXCIpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZW9mKCkpIHtcbiAgICAgIHRoaXMuZXJyb3IoS0Vycm9yQ29kZS5VTlRFUk1JTkFURURfQ09NTUVOVCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZSBjbG9zaW5nIHNsYXNoICcqLydcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdHJpbmcocXVvdGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHdoaWxlICh0aGlzLnBlZWsoKSAhPT0gcXVvdGUgJiYgIXRoaXMuZW9mKCkpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cblxuICAgIC8vIFVudGVybWluYXRlZCBzdHJpbmcuXG4gICAgaWYgKHRoaXMuZW9mKCkpIHtcbiAgICAgIHRoaXMuZXJyb3IoS0Vycm9yQ29kZS5VTlRFUk1JTkFURURfU1RSSU5HLCB7IHF1b3RlOiBxdW90ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgY2xvc2luZyBcIi5cbiAgICB0aGlzLmFkdmFuY2UoKTtcblxuICAgIC8vIFRyaW0gdGhlIHN1cnJvdW5kaW5nIHF1b3Rlcy5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc291cmNlLnN1YnN0cmluZyh0aGlzLnN0YXJ0ICsgMSwgdGhpcy5jdXJyZW50IC0gMSk7XG4gICAgdGhpcy5hZGRUb2tlbihxdW90ZSAhPT0gXCJgXCIgPyBUb2tlblR5cGUuU3RyaW5nIDogVG9rZW5UeXBlLlRlbXBsYXRlLCB2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIG51bWJlcigpOiB2b2lkIHtcbiAgICAvLyBnZXRzIGludGVnZXIgcGFydFxuICAgIHdoaWxlIChVdGlscy5pc0RpZ2l0KHRoaXMucGVlaygpKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuXG4gICAgLy8gY2hlY2tzIGZvciBmcmFjdGlvblxuICAgIGlmICh0aGlzLnBlZWsoKSA9PT0gXCIuXCIgJiYgVXRpbHMuaXNEaWdpdCh0aGlzLnBlZWtOZXh0KCkpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG5cbiAgICAvLyBnZXRzIGZyYWN0aW9uIHBhcnRcbiAgICB3aGlsZSAoVXRpbHMuaXNEaWdpdCh0aGlzLnBlZWsoKSkpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrcyBmb3IgZXhwb25lbnRcbiAgICBpZiAodGhpcy5wZWVrKCkudG9Mb3dlckNhc2UoKSA9PT0gXCJlXCIpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgaWYgKHRoaXMucGVlaygpID09PSBcIi1cIiB8fCB0aGlzLnBlZWsoKSA9PT0gXCIrXCIpIHtcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2hpbGUgKFV0aWxzLmlzRGlnaXQodGhpcy5wZWVrKCkpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc291cmNlLnN1YnN0cmluZyh0aGlzLnN0YXJ0LCB0aGlzLmN1cnJlbnQpO1xuICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlLk51bWJlciwgTnVtYmVyKHZhbHVlKSk7XG4gIH1cblxuICBwcml2YXRlIGlkZW50aWZpZXIoKTogdm9pZCB7XG4gICAgd2hpbGUgKFV0aWxzLmlzQWxwaGFOdW1lcmljKHRoaXMucGVlaygpKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnNvdXJjZS5zdWJzdHJpbmcodGhpcy5zdGFydCwgdGhpcy5jdXJyZW50KTtcbiAgICBjb25zdCBjYXBpdGFsaXplZCA9IFV0aWxzLmNhcGl0YWxpemUodmFsdWUpIGFzIGtleW9mIHR5cGVvZiBUb2tlblR5cGU7XG4gICAgaWYgKFV0aWxzLmlzS2V5d29yZChjYXBpdGFsaXplZCkpIHtcbiAgICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlW2NhcGl0YWxpemVkXSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5JZGVudGlmaWVyLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRUb2tlbigpOiB2b2lkIHtcbiAgICBjb25zdCBjaGFyID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgc3dpdGNoIChjaGFyKSB7XG4gICAgICBjYXNlIFwiKFwiOlxuICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5MZWZ0UGFyZW4sIG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCIpXCI6XG4gICAgICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlLlJpZ2h0UGFyZW4sIG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJbXCI6XG4gICAgICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlLkxlZnRCcmFja2V0LCBudWxsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiXVwiOlxuICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5SaWdodEJyYWNrZXQsIG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ7XCI6XG4gICAgICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlLkxlZnRCcmFjZSwgbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIn1cIjpcbiAgICAgICAgdGhpcy5hZGRUb2tlbihUb2tlblR5cGUuUmlnaHRCcmFjZSwgbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIixcIjpcbiAgICAgICAgdGhpcy5hZGRUb2tlbihUb2tlblR5cGUuQ29tbWEsIG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCI7XCI6XG4gICAgICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlLlNlbWljb2xvbiwgbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIn5cIjpcbiAgICAgICAgdGhpcy5hZGRUb2tlbihUb2tlblR5cGUuVGlsZGUsIG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJeXCI6XG4gICAgICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlLkNhcmV0LCBudWxsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiI1wiOlxuICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5IYXNoLCBudWxsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiOlwiOlxuICAgICAgICB0aGlzLmFkZFRva2VuKFxuICAgICAgICAgIHRoaXMubWF0Y2goXCI9XCIpID8gVG9rZW5UeXBlLkFycm93IDogVG9rZW5UeXBlLkNvbG9uLFxuICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiKlwiOlxuICAgICAgICB0aGlzLmFkZFRva2VuKFxuICAgICAgICAgIHRoaXMubWF0Y2goXCI9XCIpID8gVG9rZW5UeXBlLlN0YXJFcXVhbCA6IFRva2VuVHlwZS5TdGFyLFxuICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiJVwiOlxuICAgICAgICB0aGlzLmFkZFRva2VuKFxuICAgICAgICAgIHRoaXMubWF0Y2goXCI9XCIpID8gVG9rZW5UeXBlLlBlcmNlbnRFcXVhbCA6IFRva2VuVHlwZS5QZXJjZW50LFxuICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwifFwiOlxuICAgICAgICB0aGlzLmFkZFRva2VuKFxuICAgICAgICAgIHRoaXMubWF0Y2goXCJ8XCIpID8gVG9rZW5UeXBlLk9yIDpcbiAgICAgICAgICB0aGlzLm1hdGNoKFwiPlwiKSA/IFRva2VuVHlwZS5QaXBlbGluZSA6XG4gICAgICAgICAgVG9rZW5UeXBlLlBpcGUsXG4gICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCImXCI6XG4gICAgICAgIHRoaXMuYWRkVG9rZW4oXG4gICAgICAgICAgdGhpcy5tYXRjaChcIiZcIikgPyBUb2tlblR5cGUuQW5kIDogVG9rZW5UeXBlLkFtcGVyc2FuZCxcbiAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIj5cIjpcbiAgICAgICAgdGhpcy5hZGRUb2tlbihcbiAgICAgICAgICB0aGlzLm1hdGNoKFwiPlwiKSA/IFRva2VuVHlwZS5SaWdodFNoaWZ0IDpcbiAgICAgICAgICB0aGlzLm1hdGNoKFwiPVwiKSA/IFRva2VuVHlwZS5HcmVhdGVyRXF1YWwgOiBUb2tlblR5cGUuR3JlYXRlcixcbiAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIiFcIjpcbiAgICAgICAgdGhpcy5hZGRUb2tlbihcbiAgICAgICAgICB0aGlzLm1hdGNoKFwiPVwiKVxuICAgICAgICAgICAgPyB0aGlzLm1hdGNoKFwiPVwiKSA/IFRva2VuVHlwZS5CYW5nRXF1YWxFcXVhbCA6IFRva2VuVHlwZS5CYW5nRXF1YWxcbiAgICAgICAgICAgIDogVG9rZW5UeXBlLkJhbmcsXG4gICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCI/XCI6XG4gICAgICAgIHRoaXMuYWRkVG9rZW4oXG4gICAgICAgICAgdGhpcy5tYXRjaChcIj9cIilcbiAgICAgICAgICAgID8gVG9rZW5UeXBlLlF1ZXN0aW9uUXVlc3Rpb25cbiAgICAgICAgICAgIDogdGhpcy5tYXRjaChcIi5cIilcbiAgICAgICAgICAgID8gVG9rZW5UeXBlLlF1ZXN0aW9uRG90XG4gICAgICAgICAgICA6IFRva2VuVHlwZS5RdWVzdGlvbixcbiAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIj1cIjpcbiAgICAgICAgaWYgKHRoaXMubWF0Y2goXCI9XCIpKSB7XG4gICAgICAgICAgdGhpcy5hZGRUb2tlbihcbiAgICAgICAgICAgIHRoaXMubWF0Y2goXCI9XCIpID8gVG9rZW5UeXBlLkVxdWFsRXF1YWxFcXVhbCA6IFRva2VuVHlwZS5FcXVhbEVxdWFsLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRUb2tlbihcbiAgICAgICAgICB0aGlzLm1hdGNoKFwiPlwiKSA/IFRva2VuVHlwZS5BcnJvdyA6IFRva2VuVHlwZS5FcXVhbCxcbiAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIitcIjpcbiAgICAgICAgdGhpcy5hZGRUb2tlbihcbiAgICAgICAgICB0aGlzLm1hdGNoKFwiK1wiKVxuICAgICAgICAgICAgPyBUb2tlblR5cGUuUGx1c1BsdXNcbiAgICAgICAgICAgIDogdGhpcy5tYXRjaChcIj1cIilcbiAgICAgICAgICAgID8gVG9rZW5UeXBlLlBsdXNFcXVhbFxuICAgICAgICAgICAgOiBUb2tlblR5cGUuUGx1cyxcbiAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIi1cIjpcbiAgICAgICAgdGhpcy5hZGRUb2tlbihcbiAgICAgICAgICB0aGlzLm1hdGNoKFwiLVwiKVxuICAgICAgICAgICAgPyBUb2tlblR5cGUuTWludXNNaW51c1xuICAgICAgICAgICAgOiB0aGlzLm1hdGNoKFwiPVwiKVxuICAgICAgICAgICAgPyBUb2tlblR5cGUuTWludXNFcXVhbFxuICAgICAgICAgICAgOiBUb2tlblR5cGUuTWludXMsXG4gICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCI8XCI6XG4gICAgICAgIHRoaXMuYWRkVG9rZW4oXG4gICAgICAgICAgdGhpcy5tYXRjaChcIjxcIikgPyBUb2tlblR5cGUuTGVmdFNoaWZ0IDpcbiAgICAgICAgICB0aGlzLm1hdGNoKFwiPVwiKVxuICAgICAgICAgICAgPyB0aGlzLm1hdGNoKFwiPlwiKVxuICAgICAgICAgICAgICA/IFRva2VuVHlwZS5MZXNzRXF1YWxHcmVhdGVyXG4gICAgICAgICAgICAgIDogVG9rZW5UeXBlLkxlc3NFcXVhbFxuICAgICAgICAgICAgOiBUb2tlblR5cGUuTGVzcyxcbiAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIi5cIjpcbiAgICAgICAgaWYgKHRoaXMubWF0Y2goXCIuXCIpKSB7XG4gICAgICAgICAgaWYgKHRoaXMubWF0Y2goXCIuXCIpKSB7XG4gICAgICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5Eb3REb3REb3QsIG51bGwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5Eb3REb3QsIG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5Eb3QsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIi9cIjpcbiAgICAgICAgaWYgKHRoaXMubWF0Y2goXCIvXCIpKSB7XG4gICAgICAgICAgdGhpcy5jb21tZW50KCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXRjaChcIipcIikpIHtcbiAgICAgICAgICB0aGlzLm11bHRpbGluZUNvbW1lbnQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFkZFRva2VuKFxuICAgICAgICAgICAgdGhpcy5tYXRjaChcIj1cIikgPyBUb2tlblR5cGUuU2xhc2hFcXVhbCA6IFRva2VuVHlwZS5TbGFzaCxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBgJ2A6XG4gICAgICBjYXNlIGBcImA6XG4gICAgICBjYXNlIFwiYFwiOlxuICAgICAgICB0aGlzLnN0cmluZyhjaGFyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBpZ25vcmUgY2FzZXNcbiAgICAgIGNhc2UgXCJcXG5cIjpcbiAgICAgIGNhc2UgXCIgXCI6XG4gICAgICBjYXNlIFwiXFxyXCI6XG4gICAgICBjYXNlIFwiXFx0XCI6XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gY29tcGxleCBjYXNlc1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKFV0aWxzLmlzRGlnaXQoY2hhcikpIHtcbiAgICAgICAgICB0aGlzLm51bWJlcigpO1xuICAgICAgICB9IGVsc2UgaWYgKFV0aWxzLmlzQWxwaGEoY2hhcikpIHtcbiAgICAgICAgICB0aGlzLmlkZW50aWZpZXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVycm9yKEtFcnJvckNvZGUuVU5FWFBFQ1RFRF9DSEFSQUNURVIsIHsgY2hhcjogY2hhciB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVycm9yKGNvZGU6IEtFcnJvckNvZGVUeXBlLCBhcmdzOiBhbnkgPSB7fSk6IHZvaWQge1xuICAgIHRocm93IG5ldyBLYXNwZXJFcnJvcihjb2RlLCBhcmdzLCB0aGlzLmxpbmUsIHRoaXMuY29sKTtcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIFNjb3BlIHtcbiAgcHVibGljIHZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgcHVibGljIHBhcmVudDogU2NvcGU7XG5cbiAgY29uc3RydWN0b3IocGFyZW50PzogU2NvcGUsIGVudGl0eT86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0aGlzLnBhcmVudCA9IHBhcmVudCA/IHBhcmVudCA6IG51bGw7XG4gICAgdGhpcy52YWx1ZXMgPSBlbnRpdHkgPyBlbnRpdHkgOiB7fTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0KGVudGl0eT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlcyA9IGVudGl0eSA/IGVudGl0eSA6IHt9O1xuICB9XG5cbiAgcHVibGljIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlc1tuYW1lXSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnZhbHVlc1trZXldICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZXNba2V5XTtcbiAgICB9XG5cbiAgICBjb25zdCAkaW1wb3J0cyA9ICh0aGlzLnZhbHVlcz8uY29uc3RydWN0b3IgYXMgYW55KT8uJGltcG9ydHM7XG4gICAgaWYgKCRpbXBvcnRzICYmIHR5cGVvZiAkaW1wb3J0c1trZXldICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gJGltcG9ydHNba2V5XTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wYXJlbnQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmVudC5nZXQoa2V5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2luZG93W2tleSBhcyBrZXlvZiB0eXBlb2Ygd2luZG93XTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgRXhwciBmcm9tIFwiLi90eXBlcy9leHByZXNzaW9uc1wiO1xuaW1wb3J0IHsgU2Nhbm5lciB9IGZyb20gXCIuL3NjYW5uZXJcIjtcbmltcG9ydCB7IEV4cHJlc3Npb25QYXJzZXIgYXMgUGFyc2VyIH0gZnJvbSBcIi4vZXhwcmVzc2lvbi1wYXJzZXJcIjtcbmltcG9ydCB7IFNjb3BlIH0gZnJvbSBcIi4vc2NvcGVcIjtcbmltcG9ydCB7IFRva2VuVHlwZSB9IGZyb20gXCIuL3R5cGVzL3Rva2VuXCI7XG5pbXBvcnQgeyBLYXNwZXJFcnJvciwgS0Vycm9yQ29kZSwgS0Vycm9yQ29kZVR5cGUgfSBmcm9tIFwiLi90eXBlcy9lcnJvclwiO1xuXG5leHBvcnQgY2xhc3MgSW50ZXJwcmV0ZXIgaW1wbGVtZW50cyBFeHByLkV4cHJWaXNpdG9yPGFueT4ge1xuICBwdWJsaWMgc2NvcGUgPSBuZXcgU2NvcGUoKTtcbiAgcHJpdmF0ZSBzY2FubmVyID0gbmV3IFNjYW5uZXIoKTtcbiAgcHJpdmF0ZSBwYXJzZXIgPSBuZXcgUGFyc2VyKCk7XG5cbiAgcHVibGljIGV2YWx1YXRlKGV4cHI6IEV4cHIuRXhwcik6IGFueSB7XG4gICAgcmV0dXJuIChleHByLnJlc3VsdCA9IGV4cHIuYWNjZXB0KHRoaXMpKTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdFBpcGVsaW5lRXhwcihleHByOiBFeHByLlBpcGVsaW5lKTogYW55IHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZXZhbHVhdGUoZXhwci5sZWZ0KTtcblxuICAgIGlmIChleHByLnJpZ2h0IGluc3RhbmNlb2YgRXhwci5DYWxsKSB7XG4gICAgICBjb25zdCBjYWxsZWUgPSB0aGlzLmV2YWx1YXRlKGV4cHIucmlnaHQuY2FsbGVlKTtcbiAgICAgIGNvbnN0IGFyZ3MgPSBbdmFsdWVdO1xuICAgICAgZm9yIChjb25zdCBhcmcgb2YgZXhwci5yaWdodC5hcmdzKSB7XG4gICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBFeHByLlNwcmVhZCkge1xuICAgICAgICAgIGFyZ3MucHVzaCguLi50aGlzLmV2YWx1YXRlKChhcmcgYXMgRXhwci5TcHJlYWQpLnZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXJncy5wdXNoKHRoaXMuZXZhbHVhdGUoYXJnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChleHByLnJpZ2h0LmNhbGxlZSBpbnN0YW5jZW9mIEV4cHIuR2V0KSB7XG4gICAgICAgIHJldHVybiBjYWxsZWUuYXBwbHkoZXhwci5yaWdodC5jYWxsZWUuZW50aXR5LnJlc3VsdCwgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FsbGVlKC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIGNvbnN0IGZuID0gdGhpcy5ldmFsdWF0ZShleHByLnJpZ2h0KTtcbiAgICByZXR1cm4gZm4odmFsdWUpO1xuICB9XG5cbiAgcHVibGljIHZpc2l0QXJyb3dGdW5jdGlvbkV4cHIoZXhwcjogRXhwci5BcnJvd0Z1bmN0aW9uKTogYW55IHtcbiAgICBjb25zdCBjYXB0dXJlZFNjb3BlID0gdGhpcy5zY29wZTtcbiAgICByZXR1cm4gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBjb25zdCBwcmV2ID0gdGhpcy5zY29wZTtcbiAgICAgIHRoaXMuc2NvcGUgPSBuZXcgU2NvcGUoY2FwdHVyZWRTY29wZSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cHIucGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuc2NvcGUuc2V0KGV4cHIucGFyYW1zW2ldLmxleGVtZSwgYXJnc1tpXSk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShleHByLmJvZHkpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5zY29wZSA9IHByZXY7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBlcnJvcihjb2RlOiBLRXJyb3JDb2RlVHlwZSwgYXJnczogYW55ID0ge30sIGxpbmU/OiBudW1iZXIsIGNvbD86IG51bWJlcik6IHZvaWQge1xuICAgIHRocm93IG5ldyBLYXNwZXJFcnJvcihjb2RlLCBhcmdzLCBsaW5lLCBjb2wpO1xuICB9XG5cbiAgcHVibGljIHZpc2l0VmFyaWFibGVFeHByKGV4cHI6IEV4cHIuVmFyaWFibGUpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnNjb3BlLmdldChleHByLm5hbWUubGV4ZW1lKTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdEFzc2lnbkV4cHIoZXhwcjogRXhwci5Bc3NpZ24pOiBhbnkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5ldmFsdWF0ZShleHByLnZhbHVlKTtcbiAgICB0aGlzLnNjb3BlLnNldChleHByLm5hbWUubGV4ZW1lLCB2YWx1ZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcHVibGljIHZpc2l0S2V5RXhwcihleHByOiBFeHByLktleSk6IGFueSB7XG4gICAgcmV0dXJuIGV4cHIubmFtZS5saXRlcmFsO1xuICB9XG5cbiAgcHVibGljIHZpc2l0R2V0RXhwcihleHByOiBFeHByLkdldCk6IGFueSB7XG4gICAgY29uc3QgZW50aXR5ID0gdGhpcy5ldmFsdWF0ZShleHByLmVudGl0eSk7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5ldmFsdWF0ZShleHByLmtleSk7XG4gICAgaWYgKCFlbnRpdHkgJiYgZXhwci50eXBlID09PSBUb2tlblR5cGUuUXVlc3Rpb25Eb3QpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBlbnRpdHlba2V5XTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdFNldEV4cHIoZXhwcjogRXhwci5TZXQpOiBhbnkge1xuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZXZhbHVhdGUoZXhwci5lbnRpdHkpO1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZXZhbHVhdGUoZXhwci5rZXkpO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5ldmFsdWF0ZShleHByLnZhbHVlKTtcbiAgICBlbnRpdHlba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdFBvc3RmaXhFeHByKGV4cHI6IEV4cHIuUG9zdGZpeCk6IGFueSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmV2YWx1YXRlKGV4cHIuZW50aXR5KTtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IHZhbHVlICsgZXhwci5pbmNyZW1lbnQ7XG5cbiAgICBpZiAoZXhwci5lbnRpdHkgaW5zdGFuY2VvZiBFeHByLlZhcmlhYmxlKSB7XG4gICAgICB0aGlzLnNjb3BlLnNldChleHByLmVudGl0eS5uYW1lLmxleGVtZSwgbmV3VmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoZXhwci5lbnRpdHkgaW5zdGFuY2VvZiBFeHByLkdldCkge1xuICAgICAgY29uc3QgYXNzaWduID0gbmV3IEV4cHIuU2V0KFxuICAgICAgICBleHByLmVudGl0eS5lbnRpdHksXG4gICAgICAgIGV4cHIuZW50aXR5LmtleSxcbiAgICAgICAgbmV3IEV4cHIuTGl0ZXJhbChuZXdWYWx1ZSwgZXhwci5saW5lKSxcbiAgICAgICAgZXhwci5saW5lXG4gICAgICApO1xuICAgICAgdGhpcy5ldmFsdWF0ZShhc3NpZ24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVycm9yKEtFcnJvckNvZGUuSU5WQUxJRF9QT1NURklYX0xWQUxVRSwgeyBlbnRpdHk6IGV4cHIuZW50aXR5IH0sIGV4cHIubGluZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcHVibGljIHZpc2l0TGlzdEV4cHIoZXhwcjogRXhwci5MaXN0KTogYW55IHtcbiAgICBjb25zdCB2YWx1ZXM6IGFueVtdID0gW107XG4gICAgZm9yIChjb25zdCBleHByZXNzaW9uIG9mIGV4cHIudmFsdWUpIHtcbiAgICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgRXhwci5TcHJlYWQpIHtcbiAgICAgICAgdmFsdWVzLnB1c2goLi4udGhpcy5ldmFsdWF0ZSgoZXhwcmVzc2lvbiBhcyBFeHByLlNwcmVhZCkudmFsdWUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKHRoaXMuZXZhbHVhdGUoZXhwcmVzc2lvbikpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgcHVibGljIHZpc2l0U3ByZWFkRXhwcihleHByOiBFeHByLlNwcmVhZCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZXZhbHVhdGUoZXhwci52YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIHRlbXBsYXRlUGFyc2Uoc291cmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRva2VucyA9IHRoaXMuc2Nhbm5lci5zY2FuKHNvdXJjZSk7XG4gICAgY29uc3QgZXhwcmVzc2lvbnMgPSB0aGlzLnBhcnNlci5wYXJzZSh0b2tlbnMpO1xuICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgIGZvciAoY29uc3QgZXhwcmVzc2lvbiBvZiBleHByZXNzaW9ucykge1xuICAgICAgcmVzdWx0ICs9IHRoaXMuZXZhbHVhdGUoZXhwcmVzc2lvbikudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdFRlbXBsYXRlRXhwcihleHByOiBFeHByLlRlbXBsYXRlKTogYW55IHtcbiAgICBjb25zdCByZXN1bHQgPSBleHByLnZhbHVlLnJlcGxhY2UoXG4gICAgICAvXFx7XFx7KFtcXHNcXFNdKz8pXFx9XFx9L2csXG4gICAgICAobSwgcGxhY2Vob2xkZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVQYXJzZShwbGFjZWhvbGRlcik7XG4gICAgICB9XG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHZpc2l0QmluYXJ5RXhwcihleHByOiBFeHByLkJpbmFyeSk6IGFueSB7XG4gICAgY29uc3QgbGVmdCA9IHRoaXMuZXZhbHVhdGUoZXhwci5sZWZ0KTtcbiAgICBjb25zdCByaWdodCA9IHRoaXMuZXZhbHVhdGUoZXhwci5yaWdodCk7XG5cbiAgICBzd2l0Y2ggKGV4cHIub3BlcmF0b3IudHlwZSkge1xuICAgICAgY2FzZSBUb2tlblR5cGUuTWludXM6XG4gICAgICBjYXNlIFRva2VuVHlwZS5NaW51c0VxdWFsOlxuICAgICAgICByZXR1cm4gbGVmdCAtIHJpZ2h0O1xuICAgICAgY2FzZSBUb2tlblR5cGUuU2xhc2g6XG4gICAgICBjYXNlIFRva2VuVHlwZS5TbGFzaEVxdWFsOlxuICAgICAgICByZXR1cm4gbGVmdCAvIHJpZ2h0O1xuICAgICAgY2FzZSBUb2tlblR5cGUuU3RhcjpcbiAgICAgIGNhc2UgVG9rZW5UeXBlLlN0YXJFcXVhbDpcbiAgICAgICAgcmV0dXJuIGxlZnQgKiByaWdodDtcbiAgICAgIGNhc2UgVG9rZW5UeXBlLlBlcmNlbnQ6XG4gICAgICBjYXNlIFRva2VuVHlwZS5QZXJjZW50RXF1YWw6XG4gICAgICAgIHJldHVybiBsZWZ0ICUgcmlnaHQ7XG4gICAgICBjYXNlIFRva2VuVHlwZS5QbHVzOlxuICAgICAgY2FzZSBUb2tlblR5cGUuUGx1c0VxdWFsOlxuICAgICAgICByZXR1cm4gbGVmdCArIHJpZ2h0O1xuICAgICAgY2FzZSBUb2tlblR5cGUuUGlwZTpcbiAgICAgICAgcmV0dXJuIGxlZnQgfCByaWdodDtcbiAgICAgIGNhc2UgVG9rZW5UeXBlLkNhcmV0OlxuICAgICAgICByZXR1cm4gbGVmdCBeIHJpZ2h0O1xuICAgICAgY2FzZSBUb2tlblR5cGUuR3JlYXRlcjpcbiAgICAgICAgcmV0dXJuIGxlZnQgPiByaWdodDtcbiAgICAgIGNhc2UgVG9rZW5UeXBlLkdyZWF0ZXJFcXVhbDpcbiAgICAgICAgcmV0dXJuIGxlZnQgPj0gcmlnaHQ7XG4gICAgICBjYXNlIFRva2VuVHlwZS5MZXNzOlxuICAgICAgICByZXR1cm4gbGVmdCA8IHJpZ2h0O1xuICAgICAgY2FzZSBUb2tlblR5cGUuTGVzc0VxdWFsOlxuICAgICAgICByZXR1cm4gbGVmdCA8PSByaWdodDtcbiAgICAgIGNhc2UgVG9rZW5UeXBlLkVxdWFsRXF1YWw6XG4gICAgICBjYXNlIFRva2VuVHlwZS5FcXVhbEVxdWFsRXF1YWw6XG4gICAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodDtcbiAgICAgIGNhc2UgVG9rZW5UeXBlLkJhbmdFcXVhbDpcbiAgICAgIGNhc2UgVG9rZW5UeXBlLkJhbmdFcXVhbEVxdWFsOlxuICAgICAgICByZXR1cm4gbGVmdCAhPT0gcmlnaHQ7XG4gICAgICBjYXNlIFRva2VuVHlwZS5JbnN0YW5jZW9mOlxuICAgICAgICByZXR1cm4gbGVmdCBpbnN0YW5jZW9mIHJpZ2h0O1xuICAgICAgY2FzZSBUb2tlblR5cGUuSW46XG4gICAgICAgIHJldHVybiBsZWZ0IGluIHJpZ2h0O1xuICAgICAgY2FzZSBUb2tlblR5cGUuTGVmdFNoaWZ0OlxuICAgICAgICByZXR1cm4gbGVmdCA8PCByaWdodDtcbiAgICAgIGNhc2UgVG9rZW5UeXBlLlJpZ2h0U2hpZnQ6XG4gICAgICAgIHJldHVybiBsZWZ0ID4+IHJpZ2h0O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5lcnJvcihLRXJyb3JDb2RlLlVOS05PV05fQklOQVJZX09QRVJBVE9SLCB7IG9wZXJhdG9yOiBleHByLm9wZXJhdG9yIH0sIGV4cHIubGluZSk7XG4gICAgICAgIHJldHVybiBudWxsOyAvLyB1bnJlYWNoYWJsZVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB2aXNpdExvZ2ljYWxFeHByKGV4cHI6IEV4cHIuTG9naWNhbCk6IGFueSB7XG4gICAgY29uc3QgbGVmdCA9IHRoaXMuZXZhbHVhdGUoZXhwci5sZWZ0KTtcblxuICAgIGlmIChleHByLm9wZXJhdG9yLnR5cGUgPT09IFRva2VuVHlwZS5Pcikge1xuICAgICAgaWYgKGxlZnQpIHtcbiAgICAgICAgcmV0dXJuIGxlZnQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghbGVmdCkge1xuICAgICAgICByZXR1cm4gbGVmdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShleHByLnJpZ2h0KTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdFRlcm5hcnlFeHByKGV4cHI6IEV4cHIuVGVybmFyeSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZXZhbHVhdGUoZXhwci5jb25kaXRpb24pXG4gICAgICA/IHRoaXMuZXZhbHVhdGUoZXhwci50aGVuRXhwcilcbiAgICAgIDogdGhpcy5ldmFsdWF0ZShleHByLmVsc2VFeHByKTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdE51bGxDb2FsZXNjaW5nRXhwcihleHByOiBFeHByLk51bGxDb2FsZXNjaW5nKTogYW55IHtcbiAgICBjb25zdCBsZWZ0ID0gdGhpcy5ldmFsdWF0ZShleHByLmxlZnQpO1xuICAgIGlmIChsZWZ0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKGV4cHIucmlnaHQpO1xuICAgIH1cbiAgICByZXR1cm4gbGVmdDtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdEdyb3VwaW5nRXhwcihleHByOiBFeHByLkdyb3VwaW5nKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShleHByLmV4cHJlc3Npb24pO1xuICB9XG5cbiAgcHVibGljIHZpc2l0TGl0ZXJhbEV4cHIoZXhwcjogRXhwci5MaXRlcmFsKTogYW55IHtcbiAgICByZXR1cm4gZXhwci52YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdFVuYXJ5RXhwcihleHByOiBFeHByLlVuYXJ5KTogYW55IHtcbiAgICBjb25zdCByaWdodCA9IHRoaXMuZXZhbHVhdGUoZXhwci5yaWdodCk7XG4gICAgc3dpdGNoIChleHByLm9wZXJhdG9yLnR5cGUpIHtcbiAgICAgIGNhc2UgVG9rZW5UeXBlLk1pbnVzOlxuICAgICAgICByZXR1cm4gLXJpZ2h0O1xuICAgICAgY2FzZSBUb2tlblR5cGUuQmFuZzpcbiAgICAgICAgcmV0dXJuICFyaWdodDtcbiAgICAgIGNhc2UgVG9rZW5UeXBlLlRpbGRlOlxuICAgICAgICByZXR1cm4gfnJpZ2h0O1xuICAgICAgY2FzZSBUb2tlblR5cGUuUGx1c1BsdXM6XG4gICAgICBjYXNlIFRva2VuVHlwZS5NaW51c01pbnVzOiB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID1cbiAgICAgICAgICBOdW1iZXIocmlnaHQpICsgKGV4cHIub3BlcmF0b3IudHlwZSA9PT0gVG9rZW5UeXBlLlBsdXNQbHVzID8gMSA6IC0xKTtcbiAgICAgICAgaWYgKGV4cHIucmlnaHQgaW5zdGFuY2VvZiBFeHByLlZhcmlhYmxlKSB7XG4gICAgICAgICAgdGhpcy5zY29wZS5zZXQoZXhwci5yaWdodC5uYW1lLmxleGVtZSwgbmV3VmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGV4cHIucmlnaHQgaW5zdGFuY2VvZiBFeHByLkdldCkge1xuICAgICAgICAgIGNvbnN0IGFzc2lnbiA9IG5ldyBFeHByLlNldChcbiAgICAgICAgICAgIGV4cHIucmlnaHQuZW50aXR5LFxuICAgICAgICAgICAgZXhwci5yaWdodC5rZXksXG4gICAgICAgICAgICBuZXcgRXhwci5MaXRlcmFsKG5ld1ZhbHVlLCBleHByLmxpbmUpLFxuICAgICAgICAgICAgZXhwci5saW5lXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmV2YWx1YXRlKGFzc2lnbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgIEtFcnJvckNvZGUuSU5WQUxJRF9QUkVGSVhfUlZBTFVFLFxuICAgICAgICAgICAgeyByaWdodDogZXhwci5yaWdodCB9LFxuICAgICAgICAgICAgZXhwci5saW5lXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmVycm9yKEtFcnJvckNvZGUuVU5LTk9XTl9VTkFSWV9PUEVSQVRPUiwgeyBvcGVyYXRvcjogZXhwci5vcGVyYXRvciB9LCBleHByLmxpbmUpO1xuICAgICAgICByZXR1cm4gbnVsbDsgLy8gc2hvdWxkIGJlIHVucmVhY2hhYmxlXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHZpc2l0Q2FsbEV4cHIoZXhwcjogRXhwci5DYWxsKTogYW55IHtcbiAgICAvLyB2ZXJpZnkgY2FsbGVlIGlzIGEgZnVuY3Rpb25cbiAgICBjb25zdCBjYWxsZWUgPSB0aGlzLmV2YWx1YXRlKGV4cHIuY2FsbGVlKTtcbiAgICBpZiAoY2FsbGVlID09IG51bGwgJiYgZXhwci5vcHRpb25hbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIGNhbGxlZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLmVycm9yKEtFcnJvckNvZGUuTk9UX0FfRlVOQ1RJT04sIHsgY2FsbGVlOiBjYWxsZWUgfSwgZXhwci5saW5lKTtcbiAgICB9XG4gICAgLy8gZXZhbHVhdGUgZnVuY3Rpb24gYXJndW1lbnRzXG4gICAgY29uc3QgYXJncyA9IFtdO1xuICAgIGZvciAoY29uc3QgYXJndW1lbnQgb2YgZXhwci5hcmdzKSB7XG4gICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBFeHByLlNwcmVhZCkge1xuICAgICAgICBhcmdzLnB1c2goLi4udGhpcy5ldmFsdWF0ZSgoYXJndW1lbnQgYXMgRXhwci5TcHJlYWQpLnZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcmdzLnB1c2godGhpcy5ldmFsdWF0ZShhcmd1bWVudCkpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBleGVjdXRlIGZ1bmN0aW9uIOKAlCBwcmVzZXJ2ZSBgdGhpc2AgZm9yIG1ldGhvZCBjYWxsc1xuICAgIGlmIChleHByLmNhbGxlZSBpbnN0YW5jZW9mIEV4cHIuR2V0KSB7XG4gICAgICByZXR1cm4gY2FsbGVlLmFwcGx5KGV4cHIuY2FsbGVlLmVudGl0eS5yZXN1bHQsIGFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY2FsbGVlKC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB2aXNpdE5ld0V4cHIoZXhwcjogRXhwci5OZXcpOiBhbnkge1xuICAgIGNvbnN0IGNsYXp6ID0gdGhpcy5ldmFsdWF0ZShleHByLmNsYXp6KTtcblxuICAgIGlmICh0eXBlb2YgY2xhenogIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgS0Vycm9yQ29kZS5OT1RfQV9DTEFTUyxcbiAgICAgICAgeyBjbGF6ejogY2xhenogfSxcbiAgICAgICAgZXhwci5saW5lXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGFyZ3M6IGFueVtdID0gW107XG4gICAgZm9yIChjb25zdCBhcmcgb2YgZXhwci5hcmdzKSB7XG4gICAgICBhcmdzLnB1c2godGhpcy5ldmFsdWF0ZShhcmcpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBjbGF6eiguLi5hcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdERpY3Rpb25hcnlFeHByKGV4cHI6IEV4cHIuRGljdGlvbmFyeSk6IGFueSB7XG4gICAgY29uc3QgZGljdDogYW55ID0ge307XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBleHByLnByb3BlcnRpZXMpIHtcbiAgICAgIGlmIChwcm9wZXJ0eSBpbnN0YW5jZW9mIEV4cHIuU3ByZWFkKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZGljdCwgdGhpcy5ldmFsdWF0ZSgocHJvcGVydHkgYXMgRXhwci5TcHJlYWQpLnZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmV2YWx1YXRlKChwcm9wZXJ0eSBhcyBFeHByLlNldCkua2V5KTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmV2YWx1YXRlKChwcm9wZXJ0eSBhcyBFeHByLlNldCkudmFsdWUpO1xuICAgICAgICBkaWN0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRpY3Q7XG4gIH1cblxuICBwdWJsaWMgdmlzaXRUeXBlb2ZFeHByKGV4cHI6IEV4cHIuVHlwZW9mKTogYW55IHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMuZXZhbHVhdGUoZXhwci52YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgdmlzaXRFYWNoRXhwcihleHByOiBFeHByLkVhY2gpOiBhbnkge1xuICAgIHJldHVybiBbXG4gICAgICBleHByLm5hbWUubGV4ZW1lLFxuICAgICAgZXhwci5rZXkgPyBleHByLmtleS5sZXhlbWUgOiBudWxsLFxuICAgICAgdGhpcy5ldmFsdWF0ZShleHByLml0ZXJhYmxlKSxcbiAgICBdO1xuICB9XG5cbiAgdmlzaXRWb2lkRXhwcihleHByOiBFeHByLlZvaWQpOiBhbnkge1xuICAgIHRoaXMuZXZhbHVhdGUoZXhwci52YWx1ZSk7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICB2aXNpdERlYnVnRXhwcihleHByOiBFeHByLlZvaWQpOiBhbnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZXZhbHVhdGUoZXhwci52YWx1ZSk7XG4gICAgY29uc29sZS5sb2cocmVzdWx0KTtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxufVxuIiwiZXhwb3J0IGFic3RyYWN0IGNsYXNzIEtOb2RlIHtcbiAgICBwdWJsaWMgbGluZTogbnVtYmVyO1xuICAgIHB1YmxpYyB0eXBlOiBzdHJpbmc7XG4gICAgcHVibGljIGFic3RyYWN0IGFjY2VwdDxSPih2aXNpdG9yOiBLTm9kZVZpc2l0b3I8Uj4sIHBhcmVudD86IE5vZGUpOiBSO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEtOb2RlVmlzaXRvcjxSPiB7XG4gICAgdmlzaXRFbGVtZW50S05vZGUoa25vZGU6IEVsZW1lbnQsIHBhcmVudD86IE5vZGUpOiBSO1xuICAgIHZpc2l0QXR0cmlidXRlS05vZGUoa25vZGU6IEF0dHJpYnV0ZSwgcGFyZW50PzogTm9kZSk6IFI7XG4gICAgdmlzaXRUZXh0S05vZGUoa25vZGU6IFRleHQsIHBhcmVudD86IE5vZGUpOiBSO1xuICAgIHZpc2l0Q29tbWVudEtOb2RlKGtub2RlOiBDb21tZW50LCBwYXJlbnQ/OiBOb2RlKTogUjtcbiAgICB2aXNpdERvY3R5cGVLTm9kZShrbm9kZTogRG9jdHlwZSwgcGFyZW50PzogTm9kZSk6IFI7XG59XG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50IGV4dGVuZHMgS05vZGUge1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG4gICAgcHVibGljIGF0dHJpYnV0ZXM6IEtOb2RlW107XG4gICAgcHVibGljIGNoaWxkcmVuOiBLTm9kZVtdO1xuICAgIHB1YmxpYyBzZWxmOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBhdHRyaWJ1dGVzOiBLTm9kZVtdLCBjaGlsZHJlbjogS05vZGVbXSwgc2VsZjogYm9vbGVhbiwgbGluZTogbnVtYmVyID0gMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnZWxlbWVudCc7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgdGhpcy5zZWxmID0gc2VsZjtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWNjZXB0PFI+KHZpc2l0b3I6IEtOb2RlVmlzaXRvcjxSPiwgcGFyZW50PzogTm9kZSk6IFIge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdEVsZW1lbnRLTm9kZSh0aGlzLCBwYXJlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ0tOb2RlLkVsZW1lbnQnO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEF0dHJpYnV0ZSBleHRlbmRzIEtOb2RlIHtcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICAgIHB1YmxpYyB2YWx1ZTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBsaW5lOiBudW1iZXIgPSAwKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdhdHRyaWJ1dGUnO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gICAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBLTm9kZVZpc2l0b3I8Uj4sIHBhcmVudD86IE5vZGUpOiBSIHtcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRBdHRyaWJ1dGVLTm9kZSh0aGlzLCBwYXJlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ0tOb2RlLkF0dHJpYnV0ZSc7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGV4dCBleHRlbmRzIEtOb2RlIHtcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBzdHJpbmcsIGxpbmU6IG51bWJlciA9IDApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ3RleHQnO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gICAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBLTm9kZVZpc2l0b3I8Uj4sIHBhcmVudD86IE5vZGUpOiBSIHtcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRUZXh0S05vZGUodGhpcywgcGFyZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICdLTm9kZS5UZXh0JztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21tZW50IGV4dGVuZHMgS05vZGUge1xuICAgIHB1YmxpYyB2YWx1ZTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IodmFsdWU6IHN0cmluZywgbGluZTogbnVtYmVyID0gMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnY29tbWVudCc7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWNjZXB0PFI+KHZpc2l0b3I6IEtOb2RlVmlzaXRvcjxSPiwgcGFyZW50PzogTm9kZSk6IFIge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdENvbW1lbnRLTm9kZSh0aGlzLCBwYXJlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ0tOb2RlLkNvbW1lbnQnO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERvY3R5cGUgZXh0ZW5kcyBLTm9kZSB7XG4gICAgcHVibGljIHZhbHVlOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogc3RyaW5nLCBsaW5lOiBudW1iZXIgPSAwKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdkb2N0eXBlJztcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmxpbmUgPSBsaW5lO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogS05vZGVWaXNpdG9yPFI+LCBwYXJlbnQ/OiBOb2RlKTogUiB7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RG9jdHlwZUtOb2RlKHRoaXMsIHBhcmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnS05vZGUuRG9jdHlwZSc7XG4gICAgfVxufVxuXG4iLCJpbXBvcnQgeyBLYXNwZXJFcnJvciwgS0Vycm9yQ29kZSwgS0Vycm9yQ29kZVR5cGUgfSBmcm9tIFwiLi90eXBlcy9lcnJvclwiO1xuaW1wb3J0ICogYXMgTm9kZSBmcm9tIFwiLi90eXBlcy9ub2Rlc1wiO1xuaW1wb3J0IHsgU2VsZkNsb3NpbmdUYWdzLCBXaGl0ZVNwYWNlcyB9IGZyb20gXCIuL3R5cGVzL3Rva2VuXCI7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZVBhcnNlciB7XG4gIHB1YmxpYyBjdXJyZW50OiBudW1iZXI7XG4gIHB1YmxpYyBsaW5lOiBudW1iZXI7XG4gIHB1YmxpYyBjb2w6IG51bWJlcjtcbiAgcHVibGljIHNvdXJjZTogc3RyaW5nO1xuICBwdWJsaWMgbm9kZXM6IE5vZGUuS05vZGVbXTtcblxuICBwdWJsaWMgcGFyc2Uoc291cmNlOiBzdHJpbmcpOiBOb2RlLktOb2RlW10ge1xuICAgIHRoaXMuY3VycmVudCA9IDA7XG4gICAgdGhpcy5saW5lID0gMTtcbiAgICB0aGlzLmNvbCA9IDE7XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgdGhpcy5ub2RlcyA9IFtdO1xuXG4gICAgd2hpbGUgKCF0aGlzLmVvZigpKSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5ub2RlKCk7XG4gICAgICBpZiAobm9kZSA9PT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMubm9kZXMucHVzaChub2RlKTtcbiAgICB9XG4gICAgdGhpcy5zb3VyY2UgPSBcIlwiO1xuICAgIHJldHVybiB0aGlzLm5vZGVzO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXRjaCguLi5jaGFyczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgY2hhcnMpIHtcbiAgICAgIGlmICh0aGlzLmNoZWNrKGNoYXIpKSB7XG4gICAgICAgIHRoaXMuY3VycmVudCArPSBjaGFyLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYWR2YW5jZShlb2ZFcnJvcjogc3RyaW5nID0gXCJcIik6IHZvaWQge1xuICAgIGlmICghdGhpcy5lb2YoKSkge1xuICAgICAgaWYgKHRoaXMuY2hlY2soXCJcXG5cIikpIHtcbiAgICAgICAgdGhpcy5saW5lICs9IDE7XG4gICAgICAgIHRoaXMuY29sID0gMDtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5lb2YoKSkge1xuICAgICAgICB0aGlzLmN1cnJlbnQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXJyb3IoS0Vycm9yQ29kZS5VTkVYUEVDVEVEX0VPRiwgeyBlb2ZFcnJvcjogZW9mRXJyb3IgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwZWVrKC4uLmNoYXJzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgY2hhciBvZiBjaGFycykge1xuICAgICAgaWYgKHRoaXMuY2hlY2soY2hhcikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2soY2hhcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlLnNsaWNlKHRoaXMuY3VycmVudCwgdGhpcy5jdXJyZW50ICsgY2hhci5sZW5ndGgpID09PSBjaGFyO1xuICB9XG5cbiAgcHJpdmF0ZSBlb2YoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudCA+IHRoaXMuc291cmNlLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgZXJyb3IoY29kZTogS0Vycm9yQ29kZVR5cGUsIGFyZ3M6IGFueSA9IHt9KTogYW55IHtcbiAgICB0aHJvdyBuZXcgS2FzcGVyRXJyb3IoY29kZSwgYXJncywgdGhpcy5saW5lLCB0aGlzLmNvbCk7XG4gIH1cblxuICBwcml2YXRlIG5vZGUoKTogTm9kZS5LTm9kZSB7XG4gICAgdGhpcy53aGl0ZXNwYWNlKCk7XG4gICAgbGV0IG5vZGU6IE5vZGUuS05vZGU7XG5cbiAgICBpZiAodGhpcy5tYXRjaChcIjwvXCIpKSB7XG4gICAgICB0aGlzLmVycm9yKEtFcnJvckNvZGUuVU5FWFBFQ1RFRF9DTE9TSU5HX1RBRyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWF0Y2goXCI8IS0tXCIpKSB7XG4gICAgICBub2RlID0gdGhpcy5jb21tZW50KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1hdGNoKFwiPCFkb2N0eXBlXCIpIHx8IHRoaXMubWF0Y2goXCI8IURPQ1RZUEVcIikpIHtcbiAgICAgIG5vZGUgPSB0aGlzLmRvY3R5cGUoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWF0Y2goXCI8XCIpKSB7XG4gICAgICBub2RlID0gdGhpcy5lbGVtZW50KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUgPSB0aGlzLnRleHQoKTtcbiAgICB9XG5cbiAgICB0aGlzLndoaXRlc3BhY2UoKTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHByaXZhdGUgY29tbWVudCgpOiBudWxsIHtcbiAgICBkbyB7XG4gICAgICB0aGlzLmFkdmFuY2UoXCJFeHBlY3RlZCBjb21tZW50IGNsb3NpbmcgJy0tPidcIik7XG4gICAgfSB3aGlsZSAoIXRoaXMubWF0Y2goYC0tPmApKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZG9jdHlwZSgpOiBOb2RlLktOb2RlIHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuY3VycmVudDtcbiAgICBkbyB7XG4gICAgICB0aGlzLmFkdmFuY2UoXCJFeHBlY3RlZCBjbG9zaW5nIGRvY3R5cGVcIik7XG4gICAgfSB3aGlsZSAoIXRoaXMubWF0Y2goYD5gKSk7XG4gICAgY29uc3QgZG9jdHlwZSA9IHRoaXMuc291cmNlLnNsaWNlKHN0YXJ0LCB0aGlzLmN1cnJlbnQgLSAxKS50cmltKCk7XG4gICAgcmV0dXJuIG5ldyBOb2RlLkRvY3R5cGUoZG9jdHlwZSwgdGhpcy5saW5lKTtcbiAgfVxuXG4gIHByaXZhdGUgZWxlbWVudCgpOiBOb2RlLktOb2RlIHtcbiAgICBjb25zdCBsaW5lID0gdGhpcy5saW5lO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmlkZW50aWZpZXIoXCIvXCIsIFwiPlwiKTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRoaXMuZXJyb3IoS0Vycm9yQ29kZS5FWFBFQ1RFRF9UQUdfTkFNRSk7XG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcygpO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5tYXRjaChcIi8+XCIpIHx8XG4gICAgICAoU2VsZkNsb3NpbmdUYWdzLmluY2x1ZGVzKG5hbWUpICYmIHRoaXMubWF0Y2goXCI+XCIpKVxuICAgICkge1xuICAgICAgcmV0dXJuIG5ldyBOb2RlLkVsZW1lbnQobmFtZSwgYXR0cmlidXRlcywgW10sIHRydWUsIHRoaXMubGluZSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm1hdGNoKFwiPlwiKSkge1xuICAgICAgdGhpcy5lcnJvcihLRXJyb3JDb2RlLkVYUEVDVEVEX0NMT1NJTkdfQlJBQ0tFVCk7XG4gICAgfVxuXG4gICAgbGV0IGNoaWxkcmVuOiBOb2RlLktOb2RlW10gPSBbXTtcbiAgICB0aGlzLndoaXRlc3BhY2UoKTtcbiAgICBpZiAoIXRoaXMucGVlayhcIjwvXCIpKSB7XG4gICAgICBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4obmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZShuYW1lKTtcbiAgICByZXR1cm4gbmV3IE5vZGUuRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzLCBjaGlsZHJlbiwgZmFsc2UsIGxpbmUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWF0Y2goXCI8L1wiKSkge1xuICAgICAgdGhpcy5lcnJvcihLRXJyb3JDb2RlLkVYUEVDVEVEX0NMT1NJTkdfVEFHLCB7IG5hbWU6IG5hbWUgfSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5tYXRjaChgJHtuYW1lfWApKSB7XG4gICAgICB0aGlzLmVycm9yKEtFcnJvckNvZGUuRVhQRUNURURfQ0xPU0lOR19UQUcsIHsgbmFtZTogbmFtZSB9KTtcbiAgICB9XG4gICAgdGhpcy53aGl0ZXNwYWNlKCk7XG4gICAgaWYgKCF0aGlzLm1hdGNoKFwiPlwiKSkge1xuICAgICAgdGhpcy5lcnJvcihLRXJyb3JDb2RlLkVYUEVDVEVEX0NMT1NJTkdfVEFHLCB7IG5hbWU6IG5hbWUgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGlsZHJlbihwYXJlbnQ6IHN0cmluZyk6IE5vZGUuS05vZGVbXSB7XG4gICAgY29uc3QgY2hpbGRyZW46IE5vZGUuS05vZGVbXSA9IFtdO1xuICAgIGRvIHtcbiAgICAgIGlmICh0aGlzLmVvZigpKSB7XG4gICAgICAgIHRoaXMuZXJyb3IoS0Vycm9yQ29kZS5FWFBFQ1RFRF9DTE9TSU5HX1RBRywgeyBuYW1lOiBwYXJlbnQgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5ub2RlKCk7XG4gICAgICBpZiAobm9kZSA9PT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgfSB3aGlsZSAoIXRoaXMucGVlayhgPC9gKSk7XG5cbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICBwcml2YXRlIGF0dHJpYnV0ZXMoKTogTm9kZS5BdHRyaWJ1dGVbXSB7XG4gICAgY29uc3QgYXR0cmlidXRlczogTm9kZS5BdHRyaWJ1dGVbXSA9IFtdO1xuICAgIHdoaWxlICghdGhpcy5wZWVrKFwiPlwiLCBcIi8+XCIpICYmICF0aGlzLmVvZigpKSB7XG4gICAgICB0aGlzLndoaXRlc3BhY2UoKTtcbiAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLmxpbmU7XG4gICAgICBjb25zdCBuYW1lID0gdGhpcy5pZGVudGlmaWVyKFwiPVwiLCBcIj5cIiwgXCIvPlwiKTtcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aGlzLmVycm9yKEtFcnJvckNvZGUuQkxBTktfQVRUUklCVVRFX05BTUUpO1xuICAgICAgfVxuICAgICAgdGhpcy53aGl0ZXNwYWNlKCk7XG4gICAgICBsZXQgdmFsdWUgPSBcIlwiO1xuICAgICAgaWYgKHRoaXMubWF0Y2goXCI9XCIpKSB7XG4gICAgICAgIHRoaXMud2hpdGVzcGFjZSgpO1xuICAgICAgICBpZiAodGhpcy5tYXRjaChcIidcIikpIHtcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuZGVjb2RlRW50aXRpZXModGhpcy5zdHJpbmcoXCInXCIpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1hdGNoKCdcIicpKSB7XG4gICAgICAgICAgdmFsdWUgPSB0aGlzLmRlY29kZUVudGl0aWVzKHRoaXMuc3RyaW5nKCdcIicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuZGVjb2RlRW50aXRpZXModGhpcy5pZGVudGlmaWVyKFwiPlwiLCBcIi8+XCIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy53aGl0ZXNwYWNlKCk7XG4gICAgICBhdHRyaWJ1dGVzLnB1c2gobmV3IE5vZGUuQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBsaW5lKSk7XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGVzO1xuICB9XG5cbiAgcHJpdmF0ZSB0ZXh0KCk6IE5vZGUuS05vZGUge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5jdXJyZW50O1xuICAgIGNvbnN0IGxpbmUgPSB0aGlzLmxpbmU7XG4gICAgbGV0IGRlcHRoID0gMDtcbiAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKFwie3tcIikpIHsgZGVwdGgrKzsgY29udGludWU7IH1cbiAgICAgIGlmIChkZXB0aCA+IDAgJiYgdGhpcy5tYXRjaChcIn19XCIpKSB7IGRlcHRoLS07IGNvbnRpbnVlOyB9XG4gICAgICBpZiAoZGVwdGggPT09IDAgJiYgdGhpcy5wZWVrKFwiPFwiKSkgeyBicmVhazsgfVxuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuICAgIGNvbnN0IHJhdyA9IHRoaXMuc291cmNlLnNsaWNlKHN0YXJ0LCB0aGlzLmN1cnJlbnQpLnRyaW0oKTtcbiAgICBpZiAoIXJhdykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTm9kZS5UZXh0KHRoaXMuZGVjb2RlRW50aXRpZXMocmF3KSwgbGluZSk7XG4gIH1cblxuICBwcml2YXRlIGRlY29kZUVudGl0aWVzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRleHRcbiAgICAgIC5yZXBsYWNlKC8mbmJzcDsvZywgXCJcXHUwMGEwXCIpXG4gICAgICAucmVwbGFjZSgvJmx0Oy9nLCBcIjxcIilcbiAgICAgIC5yZXBsYWNlKC8mZ3Q7L2csIFwiPlwiKVxuICAgICAgLnJlcGxhY2UoLyZxdW90Oy9nLCAnXCInKVxuICAgICAgLnJlcGxhY2UoLyZhcG9zOy9nLCBcIidcIilcbiAgICAgIC5yZXBsYWNlKC8mYW1wOy9nLCBcIiZcIik7IC8vIG11c3QgYmUgbGFzdCB0byBhdm9pZCBkb3VibGUtZGVjb2RpbmdcbiAgfVxuXG4gIHByaXZhdGUgd2hpdGVzcGFjZSgpOiBudW1iZXIge1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgd2hpbGUgKHRoaXMucGVlayguLi5XaGl0ZVNwYWNlcykgJiYgIXRoaXMuZW9mKCkpIHtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgcHJpdmF0ZSBpZGVudGlmaWVyKC4uLmNsb3Npbmc6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICB0aGlzLndoaXRlc3BhY2UoKTtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuY3VycmVudDtcbiAgICB3aGlsZSAoIXRoaXMucGVlayguLi5XaGl0ZVNwYWNlcywgLi4uY2xvc2luZykpIHtcbiAgICAgIHRoaXMuYWR2YW5jZShgRXhwZWN0ZWQgY2xvc2luZyAke2Nsb3Npbmd9YCk7XG4gICAgfVxuICAgIGNvbnN0IGVuZCA9IHRoaXMuY3VycmVudDtcbiAgICB0aGlzLndoaXRlc3BhY2UoKTtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc2xpY2Uoc3RhcnQsIGVuZCkudHJpbSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdHJpbmcoY2xvc2luZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuY3VycmVudDtcbiAgICB3aGlsZSAoIXRoaXMubWF0Y2goY2xvc2luZykpIHtcbiAgICAgIHRoaXMuYWR2YW5jZShgRXhwZWN0ZWQgY2xvc2luZyAke2Nsb3Npbmd9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNvdXJjZS5zbGljZShzdGFydCwgdGhpcy5jdXJyZW50IC0gMSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbXBvbmVudCwgQ29tcG9uZW50Q2xhc3MgfSBmcm9tIFwiLi9jb21wb25lbnRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZUNvbmZpZyB7XG4gIHBhdGg6IHN0cmluZztcbiAgY29tcG9uZW50OiBDb21wb25lbnRDbGFzcztcbiAgZ3VhcmQ/OiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmF2aWdhdGUocGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGhpc3RvcnkucHVzaFN0YXRlKG51bGwsIFwiXCIsIHBhdGgpO1xuICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgUG9wU3RhdGVFdmVudChcInBvcHN0YXRlXCIpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoUGF0aChwYXR0ZXJuOiBzdHJpbmcsIHBhdGhuYW1lOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgbnVsbCB7XG4gIGlmIChwYXR0ZXJuID09PSBcIipcIikgcmV0dXJuIHt9O1xuICBjb25zdCBwYXR0ZXJuUGFydHMgPSBwYXR0ZXJuLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IHBhdGhQYXJ0cyA9IHBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gIGlmIChwYXR0ZXJuUGFydHMubGVuZ3RoICE9PSBwYXRoUGFydHMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHBhdHRlcm5QYXJ0c1tpXS5zdGFydHNXaXRoKFwiOlwiKSkge1xuICAgICAgcGFyYW1zW3BhdHRlcm5QYXJ0c1tpXS5zbGljZSgxKV0gPSBwYXRoUGFydHNbaV07XG4gICAgfSBlbHNlIGlmIChwYXR0ZXJuUGFydHNbaV0gIT09IHBhdGhQYXJ0c1tpXSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYXJhbXM7XG59XG5cbmV4cG9ydCBjbGFzcyBSb3V0ZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICBwcml2YXRlIHJvdXRlczogUm91dGVDb25maWdbXSA9IFtdO1xuXG4gIHNldFJvdXRlcyhyb3V0ZXM6IFJvdXRlQ29uZmlnW10pOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlcyA9IHJvdXRlcztcbiAgfVxuXG4gIG9uTW91bnQoKTogdm9pZCB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCAoKSA9PiB0aGlzLl9uYXZpZ2F0ZSgpLCB7XG4gICAgICBzaWduYWw6IHRoaXMuJGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgdGhpcy5fbmF2aWdhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX25hdmlnYXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhdGhuYW1lID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGZvciAoY29uc3Qgcm91dGUgb2YgdGhpcy5yb3V0ZXMpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG1hdGNoUGF0aChyb3V0ZS5wYXRoLCBwYXRobmFtZSk7XG4gICAgICBpZiAocGFyYW1zID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgIGlmIChyb3V0ZS5ndWFyZCkge1xuICAgICAgICBjb25zdCBhbGxvd2VkID0gYXdhaXQgcm91dGUuZ3VhcmQoKTtcbiAgICAgICAgaWYgKCFhbGxvd2VkKSByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9tb3VudChyb3V0ZS5jb21wb25lbnQsIHBhcmFtcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbW91bnQoQ29tcG9uZW50Q2xhc3M6IENvbXBvbmVudENsYXNzLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiB2b2lkIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5yZWYgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCFlbGVtZW50IHx8ICF0aGlzLnRyYW5zcGlsZXIpIHJldHVybjtcbiAgICB0aGlzLnRyYW5zcGlsZXIubW91bnRDb21wb25lbnQoQ29tcG9uZW50Q2xhc3MsIGVsZW1lbnQsIHBhcmFtcyk7XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBCb3VuZGFyeSB7XG4gIHByaXZhdGUgc3RhcnQ6IENvbW1lbnQ7XG4gIHByaXZhdGUgZW5kOiBDb21tZW50O1xuXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogTm9kZSwgbGFiZWw6IHN0cmluZyA9IFwiYm91bmRhcnlcIikge1xuICAgIHRoaXMuc3RhcnQgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KGAke2xhYmVsfS1zdGFydGApO1xuICAgIHRoaXMuZW5kID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChgJHtsYWJlbH0tZW5kYCk7XG4gICAgaWYgKChwYXJlbnQgYXMgYW55KS5pbnNlcnQgJiYgdHlwZW9mIChwYXJlbnQgYXMgYW55KS5pbnNlcnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgKHBhcmVudCBhcyBhbnkpLmluc2VydCh0aGlzLnN0YXJ0KTtcbiAgICAgIChwYXJlbnQgYXMgYW55KS5pbnNlcnQodGhpcy5lbmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5zdGFydCk7XG4gICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5lbmQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICBsZXQgY3VycmVudCA9IHRoaXMuc3RhcnQubmV4dFNpYmxpbmc7XG4gICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gdGhpcy5lbmQpIHtcbiAgICAgIGNvbnN0IHRvUmVtb3ZlID0gY3VycmVudDtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHRTaWJsaW5nO1xuICAgICAgdG9SZW1vdmUucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodG9SZW1vdmUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpbnNlcnQobm9kZTogTm9kZSk6IHZvaWQge1xuICAgIHRoaXMuZW5kLnBhcmVudE5vZGU/Lmluc2VydEJlZm9yZShub2RlLCB0aGlzLmVuZCk7XG4gIH1cblxuICBwdWJsaWMgbm9kZXMoKTogTm9kZVtdIHtcbiAgICBjb25zdCByZXN1bHQ6IE5vZGVbXSA9IFtdO1xuICAgIGxldCBjdXJyZW50ID0gdGhpcy5zdGFydC5uZXh0U2libGluZztcbiAgICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSB0aGlzLmVuZCkge1xuICAgICAgcmVzdWx0LnB1c2goY3VycmVudCk7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0U2libGluZztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50KCk6IE5vZGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydC5wYXJlbnROb2RlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRcIjtcblxudHlwZSBUYXNrID0gKCkgPT4gdm9pZDtcblxuY29uc3QgcXVldWUgPSBuZXcgTWFwPENvbXBvbmVudCwgVGFza1tdPigpO1xuY29uc3QgbmV4dFRpY2tDYWxsYmFja3M6IFRhc2tbXSA9IFtdO1xubGV0IGlzU2NoZWR1bGVkID0gZmFsc2U7XG5sZXQgYmF0Y2hpbmdFbmFibGVkID0gdHJ1ZTtcblxuZnVuY3Rpb24gZmx1c2goKSB7XG4gIGlzU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgLy8gMS4gUHJvY2VzcyBjb21wb25lbnQgdXBkYXRlc1xuICBmb3IgKGNvbnN0IFtpbnN0YW5jZSwgdGFza3NdIG9mIHF1ZXVlLmVudHJpZXMoKSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBDYWxsIHByZS11cGRhdGUgaG9vayAob25seSBmb3IgcmVhY3RpdmUgdXBkYXRlcywgbm90IGZpcnN0IG1vdW50KVxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5vbkNoYW5nZXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBpbnN0YW5jZS5vbkNoYW5nZXMoKTtcbiAgICAgIH1cblxuICAgICAgLy8gUnVuIGFsbCBzdXJnaWNhbCBET00gdXBkYXRlcyBmb3IgdGhpcyBjb21wb25lbnRcbiAgICAgIGZvciAoY29uc3QgdGFzayBvZiB0YXNrcykge1xuICAgICAgICB0YXNrKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGwgcG9zdC11cGRhdGUgaG9va1xuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5vblJlbmRlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGluc3RhbmNlLm9uUmVuZGVyKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIltLYXNwZXJdIEVycm9yIGR1cmluZyBjb21wb25lbnQgdXBkYXRlOlwiLCBlKTtcbiAgICB9XG4gIH1cbiAgcXVldWUuY2xlYXIoKTtcblxuICAvLyAyLiBQcm9jZXNzIG5leHRUaWNrIGNhbGxiYWNrc1xuICBjb25zdCBjYWxsYmFja3MgPSBuZXh0VGlja0NhbGxiYWNrcy5zcGxpY2UoMCk7XG4gIGZvciAoY29uc3QgY2Igb2YgY2FsbGJhY2tzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNiKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIltLYXNwZXJdIEVycm9yIGluIG5leHRUaWNrIGNhbGxiYWNrOlwiLCBlKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXVlVXBkYXRlKGluc3RhbmNlOiBDb21wb25lbnQsIHRhc2s6IFRhc2spIHtcbiAgaWYgKCFiYXRjaGluZ0VuYWJsZWQpIHtcbiAgICB0YXNrKCk7XG4gICAgLy8gRHVyaW5nIHN5bmMgbW91bnQsIHdlIGRvbid0IGNhbGwgb25DaGFuZ2VzIG9yIG9uUmVuZGVyIGhlcmUuXG4gICAgLy8gb25SZW5kZXIgaXMgY2FsbGVkIG1hbnVhbGx5IGF0IHRoZSBlbmQgb2YgdHJhbnNwaWxlL2Jvb3RzdHJhcC5cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXF1ZXVlLmhhcyhpbnN0YW5jZSkpIHtcbiAgICBxdWV1ZS5zZXQoaW5zdGFuY2UsIFtdKTtcbiAgfVxuICBxdWV1ZS5nZXQoaW5zdGFuY2UpIS5wdXNoKHRhc2spO1xuXG4gIGlmICghaXNTY2hlZHVsZWQpIHtcbiAgICBpc1NjaGVkdWxlZCA9IHRydWU7XG4gICAgcXVldWVNaWNyb3Rhc2soZmx1c2gpO1xuICB9XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBmdW5jdGlvbiB3aXRoIGJhdGNoaW5nIGRpc2FibGVkLiBcbiAqIFVzZWQgZm9yIGluaXRpYWwgbW91bnQgYW5kIG1hbnVhbCByZW5kZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmx1c2hTeW5jKGZuOiAoKSA9PiB2b2lkKSB7XG4gIGNvbnN0IHByZXYgPSBiYXRjaGluZ0VuYWJsZWQ7XG4gIGJhdGNoaW5nRW5hYmxlZCA9IGZhbHNlO1xuICB0cnkge1xuICAgIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgYmF0Y2hpbmdFbmFibGVkID0gcHJldjtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIG5leHQgZnJhbWV3b3JrIHVwZGF0ZSBjeWNsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5leHRUaWNrKCk6IFByb21pc2U8dm9pZD47XG5leHBvcnQgZnVuY3Rpb24gbmV4dFRpY2soY2I6IFRhc2spOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIG5leHRUaWNrKGNiPzogVGFzayk6IFByb21pc2U8dm9pZD4gfCB2b2lkIHtcbiAgaWYgKGNiKSB7XG4gICAgbmV4dFRpY2tDYWxsYmFja3MucHVzaChjYik7XG4gICAgaWYgKCFpc1NjaGVkdWxlZCkge1xuICAgICAgaXNTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgcXVldWVNaWNyb3Rhc2soZmx1c2gpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBuZXh0VGlja0NhbGxiYWNrcy5wdXNoKHJlc29sdmUpO1xuICAgIGlmICghaXNTY2hlZHVsZWQpIHtcbiAgICAgIGlzU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIHF1ZXVlTWljcm90YXNrKGZsdXNoKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50Q2xhc3MsIENvbXBvbmVudFJlZ2lzdHJ5IH0gZnJvbSBcIi4vY29tcG9uZW50XCI7XG5pbXBvcnQgeyBFeHByZXNzaW9uUGFyc2VyIH0gZnJvbSBcIi4vZXhwcmVzc2lvbi1wYXJzZXJcIjtcbmltcG9ydCB7IEludGVycHJldGVyIH0gZnJvbSBcIi4vaW50ZXJwcmV0ZXJcIjtcbmltcG9ydCB7IFJvdXRlciwgUm91dGVDb25maWcgfSBmcm9tIFwiLi9yb3V0ZXJcIjtcbmltcG9ydCB7IFNjYW5uZXIgfSBmcm9tIFwiLi9zY2FubmVyXCI7XG5pbXBvcnQgeyBTY29wZSB9IGZyb20gXCIuL3Njb3BlXCI7XG5pbXBvcnQgeyBlZmZlY3QgfSBmcm9tIFwiLi9zaWduYWxcIjtcbmltcG9ydCB7IEJvdW5kYXJ5IH0gZnJvbSBcIi4vYm91bmRhcnlcIjtcbmltcG9ydCB7IFRlbXBsYXRlUGFyc2VyIH0gZnJvbSBcIi4vdGVtcGxhdGUtcGFyc2VyXCI7XG5pbXBvcnQgeyBxdWV1ZVVwZGF0ZSwgZmx1c2hTeW5jIH0gZnJvbSBcIi4vc2NoZWR1bGVyXCI7XG5pbXBvcnQgeyBLYXNwZXJFcnJvciwgS0Vycm9yQ29kZSwgS0Vycm9yQ29kZVR5cGUgfSBmcm9tIFwiLi90eXBlcy9lcnJvclwiO1xuaW1wb3J0ICogYXMgS05vZGUgZnJvbSBcIi4vdHlwZXMvbm9kZXNcIjtcblxuY29uc3QgS0VZX01BUDogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge1xuICBlc2M6IFtcIkVzY2FwZVwiLCBcIkVzY1wiXSxcbiAgZXNjYXBlOiBbXCJFc2NhcGVcIiwgXCJFc2NcIl0sXG4gIHNwYWNlOiBbXCIgXCIsIFwiU3BhY2ViYXJcIl0sXG4gIHVwOiBbXCJBcnJvd1VwXCIsIFwiVXBcIl0sXG4gIGRvd246IFtcIkFycm93RG93blwiLCBcIkRvd25cIl0sXG4gIGxlZnQ6IFtcIkFycm93TGVmdFwiLCBcIkxlZnRcIl0sXG4gIHJpZ2h0OiBbXCJBcnJvd1JpZ2h0XCIsIFwiUmlnaHRcIl0sXG4gIGRlbDogW1wiRGVsZXRlXCIsIFwiRGVsXCJdLFxuICBkZWxldGU6IFtcIkRlbGV0ZVwiLCBcIkRlbFwiXSxcbiAgaW5zOiBbXCJJbnNlcnRcIl0sXG4gIGRvdDogW1wiLlwiXSxcbiAgY29tbWE6IFtcIixcIl0sXG4gIHNsYXNoOiBbXCIvXCJdLFxuICBiYWNrc2xhc2g6IFtcIlxcXFxcIl0sXG4gIHBsdXM6IFtcIitcIl0sXG4gIG1pbnVzOiBbXCItXCJdLFxuICBlcXVhbDogW1wiPVwiXSxcbn07XG5cbnR5cGUgSWZFbHNlTm9kZSA9IFtLTm9kZS5FbGVtZW50LCBLTm9kZS5BdHRyaWJ1dGVdO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNwaWxlciBpbXBsZW1lbnRzIEtOb2RlLktOb2RlVmlzaXRvcjx2b2lkPiB7XG4gIHByaXZhdGUgc2Nhbm5lciA9IG5ldyBTY2FubmVyKCk7XG4gIHByaXZhdGUgcGFyc2VyID0gbmV3IEV4cHJlc3Npb25QYXJzZXIoKTtcbiAgcHJpdmF0ZSB0ZW1wbGF0ZVBhcnNlciA9IG5ldyBUZW1wbGF0ZVBhcnNlcigpO1xuICBwcml2YXRlIGludGVycHJldGVyID0gbmV3IEludGVycHJldGVyKCk7XG4gIHB1YmxpYyByZWdpc3RyeTogQ29tcG9uZW50UmVnaXN0cnkgPSB7fTtcbiAgcHVibGljIG1vZGU6IFwiZGV2ZWxvcG1lbnRcIiB8IFwicHJvZHVjdGlvblwiID0gXCJkZXZlbG9wbWVudFwiO1xuICBwcml2YXRlIGlzUmVuZGVyaW5nID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IHsgcmVnaXN0cnk6IENvbXBvbmVudFJlZ2lzdHJ5IH0pIHtcbiAgICB0aGlzLnJlZ2lzdHJ5W1wicm91dGVyXCJdID0geyBjb21wb25lbnQ6IFJvdXRlciB9O1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuO1xuICAgIGlmIChvcHRpb25zLnJlZ2lzdHJ5KSB7XG4gICAgICB0aGlzLnJlZ2lzdHJ5ID0geyAuLi50aGlzLnJlZ2lzdHJ5LCAuLi5vcHRpb25zLnJlZ2lzdHJ5IH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJDb21wb25lbnRJbnN0YW5jZShcbiAgICBpbnN0YW5jZTogYW55LFxuICAgIG5vZGVzOiBLTm9kZS5LTm9kZVtdLFxuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHJlc3RvcmVTY29wZTogU2NvcGUsXG4gICAgc2xvdHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IHZvaWQge1xuICAgIGlmIChzbG90cykgaW5zdGFuY2UuJHNsb3RzID0gc2xvdHM7XG5cbiAgICBpbnN0YW5jZS4kcmVuZGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5pc1JlbmRlcmluZyA9IHRydWU7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmRlc3Ryb3koZWxlbWVudCk7XG4gICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBuZXcgU2NvcGUocmVzdG9yZVNjb3BlLCBpbnN0YW5jZSk7XG4gICAgICAgIHNjb3BlLnNldChcIiRpbnN0YW5jZVwiLCBpbnN0YW5jZSk7XG4gICAgICAgIGlmIChzbG90cykgaW5zdGFuY2UuJHNsb3RzID0gc2xvdHM7XG4gICAgICAgIGNvbnN0IHByZXZTY29wZSA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGU7XG4gICAgICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSBzY29wZTtcbiAgICAgICAgZmx1c2hTeW5jKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNyZWF0ZVNpYmxpbmdzKG5vZGVzLCBlbGVtZW50KTtcbiAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLm9uUmVuZGVyID09PSBcImZ1bmN0aW9uXCIpIGluc3RhbmNlLm9uUmVuZGVyKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmludGVycHJldGVyLnNjb3BlID0gcHJldlNjb3BlO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5pc1JlbmRlcmluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLm9uTW91bnQgPT09IFwiZnVuY3Rpb25cIikgaW5zdGFuY2Uub25Nb3VudCgpO1xuXG4gICAgY29uc3Qgc2NvcGUgPSBuZXcgU2NvcGUocmVzdG9yZVNjb3BlLCBpbnN0YW5jZSk7XG4gICAgc2NvcGUuc2V0KFwiJGluc3RhbmNlXCIsIGluc3RhbmNlKTtcbiAgICB0aGlzLmludGVycHJldGVyLnNjb3BlID0gc2NvcGU7XG4gICAgZmx1c2hTeW5jKCgpID0+IHtcbiAgICAgIHRoaXMuY3JlYXRlU2libGluZ3Mobm9kZXMsIGVsZW1lbnQpO1xuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5vblJlbmRlciA9PT0gXCJmdW5jdGlvblwiKSBpbnN0YW5jZS5vblJlbmRlcigpO1xuICAgIH0pO1xuICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSByZXN0b3JlU2NvcGU7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZU5vZGVzKHRhZzogc3RyaW5nKTogS05vZGUuS05vZGVbXSB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLnJlZ2lzdHJ5W3RhZ107XG4gICAgaWYgKGVudHJ5Lm5vZGVzICE9PSB1bmRlZmluZWQpIHJldHVybiBlbnRyeS5ub2RlcztcbiAgICBjb25zdCBzb3VyY2UgPSAoZW50cnkuY29tcG9uZW50IGFzIGFueSkudGVtcGxhdGU7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIGVudHJ5Lm5vZGVzID0gW107XG4gICAgICByZXR1cm4gZW50cnkubm9kZXM7XG4gICAgfVxuICAgIGVudHJ5Lm5vZGVzID0gdGhpcy50ZW1wbGF0ZVBhcnNlci5wYXJzZShzb3VyY2UpO1xuICAgIHJldHVybiBlbnRyeS5ub2RlcztcbiAgfVxuXG4gIHByaXZhdGUgZXZhbHVhdGUobm9kZTogS05vZGUuS05vZGUsIHBhcmVudD86IE5vZGUpOiB2b2lkIHtcbiAgICBpZiAobm9kZS50eXBlID09PSBcImVsZW1lbnRcIikge1xuICAgICAgY29uc3QgZWwgPSBub2RlIGFzIEtOb2RlLkVsZW1lbnQ7XG4gICAgICBjb25zdCBtaXNwbGFjZWQgPSB0aGlzLmZpbmRBdHRyKGVsLCBbXCJAZWxzZWlmXCIsIFwiQGVsc2VcIl0pO1xuICAgICAgaWYgKG1pc3BsYWNlZCkge1xuICAgICAgICAvLyBUaGVzZSBhcmUgaGFuZGxlZCBieSBkb0lmLCBpZiB3ZSByZWFjaCB0aGVtIGhlcmUgaXQncyBhbiBlcnJvclxuICAgICAgICBjb25zdCBuYW1lID0gbWlzcGxhY2VkLm5hbWUuc3RhcnRzV2l0aChcIkBcIikgPyBtaXNwbGFjZWQubmFtZS5zbGljZSgxKSA6IG1pc3BsYWNlZC5uYW1lO1xuICAgICAgICB0aGlzLmVycm9yKEtFcnJvckNvZGUuTUlTUExBQ0VEX0NPTkRJVElPTkFMLCB7IG5hbWU6IG5hbWUgfSwgZWwubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIG5vZGUuYWNjZXB0KHRoaXMsIHBhcmVudCk7XG4gIH1cblxuICBwcml2YXRlIGJpbmRNZXRob2RzKGVudGl0eTogYW55KTogdm9pZCB7XG4gICAgaWYgKCFlbnRpdHkgfHwgdHlwZW9mIGVudGl0eSAhPT0gXCJvYmplY3RcIikgcmV0dXJuO1xuXG4gICAgbGV0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGVudGl0eSk7XG4gICAgd2hpbGUgKHByb3RvICYmIHByb3RvICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90bykpIHtcbiAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIGtleSk/LmdldCkgY29udGludWU7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgZW50aXR5W2tleV0gPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgIGtleSAhPT0gXCJjb25zdHJ1Y3RvclwiICYmXG4gICAgICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlbnRpdHksIGtleSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZW50aXR5W2tleV0gPSBlbnRpdHlba2V5XS5iaW5kKGVudGl0eSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICB9XG4gIH1cblxuICAvLyBDcmVhdGVzIGFuIGVmZmVjdCB0aGF0IHJlc3RvcmVzIHRoZSBjdXJyZW50IHNjb3BlIG9uIGV2ZXJ5IHJlLXJ1bixcbiAgLy8gc28gZWZmZWN0cyBzZXQgdXAgaW5zaWRlIEBlYWNoIGFsd2F5cyBldmFsdWF0ZSBpbiB0aGVpciBpdGVtIHNjb3BlLlxuICBwcml2YXRlIHNjb3BlZEVmZmVjdChmbjogKCkgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5pbnRlcnByZXRlci5zY29wZTtcbiAgICByZXR1cm4gZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHByZXYgPSB0aGlzLmludGVycHJldGVyLnNjb3BlO1xuICAgICAgdGhpcy5pbnRlcnByZXRlci5zY29wZSA9IHNjb3BlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSBwcmV2O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gV3JhcHMgYSByZWZyZXNoIGZ1bmN0aW9uIHNvIGl0IHJlc3RvcmVzIHRoZSBjb3JyZWN0IHNjb3BlIHdoZW4gY2FsbGVkXG4gIC8vIGRpcmVjdGx5IGJ5IHRyaWdnZXJSZWZyZXNoIChvdXRzaWRlIG9mIHRoZSBzaWduYWwgZWZmZWN0IG1hY2hpbmVyeSkuXG4gIHByaXZhdGUgc2NvcGVkUmVmcmVzaChmbjogKCkgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5pbnRlcnByZXRlci5zY29wZTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgcHJldiA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGU7XG4gICAgICB0aGlzLmludGVycHJldGVyLnNjb3BlID0gc2NvcGU7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5pbnRlcnByZXRlci5zY29wZSA9IHByZXY7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIGV2YWx1YXRlcyBleHByZXNzaW9ucyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBmaXJzdCBldmFsdWF0aW9uXG4gIHByaXZhdGUgZXhlY3V0ZShzb3VyY2U6IHN0cmluZywgb3ZlcnJpZGVTY29wZT86IFNjb3BlKTogYW55IHtcbiAgICBjb25zdCB0b2tlbnMgPSB0aGlzLnNjYW5uZXIuc2Nhbihzb3VyY2UpO1xuICAgIGNvbnN0IGV4cHJlc3Npb25zID0gdGhpcy5wYXJzZXIucGFyc2UodG9rZW5zKTtcblxuICAgIGNvbnN0IHJlc3RvcmVTY29wZSA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGU7XG4gICAgaWYgKG92ZXJyaWRlU2NvcGUpIHtcbiAgICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSBvdmVycmlkZVNjb3BlO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBleHByZXNzaW9ucy5tYXAoKGV4cHJlc3Npb24pID0+XG4gICAgICB0aGlzLmludGVycHJldGVyLmV2YWx1YXRlKGV4cHJlc3Npb24pXG4gICAgKTtcbiAgICB0aGlzLmludGVycHJldGVyLnNjb3BlID0gcmVzdG9yZVNjb3BlO1xuICAgIHJldHVybiByZXN1bHQgJiYgcmVzdWx0Lmxlbmd0aCA/IHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgdHJhbnNwaWxlKFxuICAgIG5vZGVzOiBLTm9kZS5LTm9kZVtdLFxuICAgIGVudGl0eTogYW55LFxuICAgIGNvbnRhaW5lcjogRWxlbWVudFxuICApOiBOb2RlIHtcbiAgICB0aGlzLmlzUmVuZGVyaW5nID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5kZXN0cm95KGNvbnRhaW5lcik7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgIHRoaXMuYmluZE1ldGhvZHMoZW50aXR5KTtcbiAgICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUuaW5pdChlbnRpdHkpO1xuICAgICAgdGhpcy5pbnRlcnByZXRlci5zY29wZS5zZXQoXCIkaW5zdGFuY2VcIiwgZW50aXR5KTtcblxuICAgICAgZmx1c2hTeW5jKCgpID0+IHtcbiAgICAgICAgdGhpcy5jcmVhdGVTaWJsaW5ncyhub2RlcywgY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy50cmlnZ2VyUmVuZGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc1JlbmRlcmluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB2aXNpdEVsZW1lbnRLTm9kZShub2RlOiBLTm9kZS5FbGVtZW50LCBwYXJlbnQ/OiBOb2RlKTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVFbGVtZW50KG5vZGUsIHBhcmVudCk7XG4gIH1cblxuICBwdWJsaWMgdmlzaXRUZXh0S05vZGUobm9kZTogS05vZGUuVGV4dCwgcGFyZW50PzogTm9kZSk6IHZvaWQge1xuICAgIGNvbnN0IHRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBpZiAoKHBhcmVudCBhcyBhbnkpLmluc2VydCAmJiB0eXBlb2YgKHBhcmVudCBhcyBhbnkpLmluc2VydCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIChwYXJlbnQgYXMgYW55KS5pbnNlcnQodGV4dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcCA9IHRoaXMuc2NvcGVkRWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5ldmFsdWF0ZVRlbXBsYXRlU3RyaW5nKG5vZGUudmFsdWUpO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmludGVycHJldGVyLnNjb3BlLmdldChcIiRpbnN0YW5jZVwiKTtcbiAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICBxdWV1ZVVwZGF0ZShpbnN0YW5jZSwgKCkgPT4ge1xuICAgICAgICAgIHRleHQudGV4dENvbnRlbnQgPSBuZXdWYWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0LnRleHRDb250ZW50ID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy50cmFja0VmZmVjdCh0ZXh0LCBzdG9wKTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdEF0dHJpYnV0ZUtOb2RlKG5vZGU6IEtOb2RlLkF0dHJpYnV0ZSwgcGFyZW50PzogTm9kZSk6IHZvaWQge1xuICAgIGNvbnN0IGF0dHIgPSBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUobm9kZS5uYW1lKTtcblxuICAgIGNvbnN0IHN0b3AgPSB0aGlzLnNjb3BlZEVmZmVjdCgoKSA9PiB7XG4gICAgICBhdHRyLnZhbHVlID0gdGhpcy5ldmFsdWF0ZVRlbXBsYXRlU3RyaW5nKG5vZGUudmFsdWUpO1xuICAgIH0pO1xuICAgIHRoaXMudHJhY2tFZmZlY3QoYXR0ciwgc3RvcCk7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICAocGFyZW50IGFzIEhUTUxFbGVtZW50KS5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB2aXNpdENvbW1lbnRLTm9kZShfbm9kZTogS05vZGUuQ29tbWVudCwgX3BhcmVudD86IE5vZGUpOiB2b2lkIHtcbiAgICAvLyB0ZW1wbGF0ZSBjb21tZW50cyBhcmUgc3RyaXBwZWQgZnJvbSBET00gb3V0cHV0XG4gIH1cblxuICBwcml2YXRlIHRyYWNrRWZmZWN0KHRhcmdldDogYW55LCBzdG9wOiBhbnkpIHtcbiAgICBpZiAoIXRhcmdldC4ka2FzcGVyRWZmZWN0cykgdGFyZ2V0LiRrYXNwZXJFZmZlY3RzID0gW107XG4gICAgdGFyZ2V0LiRrYXNwZXJFZmZlY3RzLnB1c2goc3RvcCk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRBdHRyKFxuICAgIG5vZGU6IEtOb2RlLkVsZW1lbnQsXG4gICAgbmFtZTogc3RyaW5nW11cbiAgKTogS05vZGUuQXR0cmlidXRlIHwgbnVsbCB7XG4gICAgaWYgKCFub2RlIHx8ICFub2RlLmF0dHJpYnV0ZXMgfHwgIW5vZGUuYXR0cmlidXRlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYiA9IG5vZGUuYXR0cmlidXRlcy5maW5kKChhdHRyKSA9PlxuICAgICAgbmFtZS5pbmNsdWRlcygoYXR0ciBhcyBLTm9kZS5BdHRyaWJ1dGUpLm5hbWUpXG4gICAgKTtcbiAgICBpZiAoYXR0cmliKSB7XG4gICAgICByZXR1cm4gYXR0cmliIGFzIEtOb2RlLkF0dHJpYnV0ZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGRvSWYoZXhwcmVzc2lvbnM6IElmRWxzZU5vZGVbXSwgcGFyZW50OiBOb2RlKTogdm9pZCB7XG4gICAgY29uc3QgYm91bmRhcnkgPSBuZXcgQm91bmRhcnkocGFyZW50LCBcImlmXCIpO1xuXG4gICAgY29uc3QgcnVuID0gKCkgPT4ge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmludGVycHJldGVyLnNjb3BlLmdldChcIiRpbnN0YW5jZVwiKTtcblxuICAgICAgY29uc3QgdHJhY2tpbmdTY29wZSA9IGluc3RhbmNlID8gbmV3IFNjb3BlKHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUpIDogdGhpcy5pbnRlcnByZXRlci5zY29wZTtcbiAgICAgIGNvbnN0IHByZXZTY29wZSA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGU7XG4gICAgICB0aGlzLmludGVycHJldGVyLnNjb3BlID0gdHJhY2tpbmdTY29wZTtcblxuICAgICAgLy8gRXZhbHVhdGUgY29uZGl0aW9ucyBzeW5jaHJvbm91c2x5IHRvIGVuc3VyZSBzaWduYWwgdHJhY2tpbmdcbiAgICAgIGNvbnN0IHJlc3VsdHM6IGJvb2xlYW5bXSA9IFtdO1xuICAgICAgcmVzdWx0cy5wdXNoKCEhdGhpcy5leGVjdXRlKChleHByZXNzaW9uc1swXVsxXSBhcyBLTm9kZS5BdHRyaWJ1dGUpLnZhbHVlKSk7XG5cbiAgICAgIGlmICghcmVzdWx0c1swXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGV4cHJlc3Npb24gb2YgZXhwcmVzc2lvbnMuc2xpY2UoMSkpIHtcbiAgICAgICAgICBpZiAodGhpcy5maW5kQXR0cihleHByZXNzaW9uWzBdIGFzIEtOb2RlLkVsZW1lbnQsIFtcIkBlbHNlaWZcIl0pKSB7XG4gICAgICAgICAgICBjb25zdCB2YWwgPSAhIXRoaXMuZXhlY3V0ZSgoZXhwcmVzc2lvblsxXSBhcyBLTm9kZS5BdHRyaWJ1dGUpLnZhbHVlKTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh2YWwpO1xuICAgICAgICAgICAgaWYgKHZhbCkgYnJlYWs7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZpbmRBdHRyKGV4cHJlc3Npb25bMF0gYXMgS05vZGUuRWxlbWVudCwgW1wiQGVsc2VcIl0pKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2godHJ1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSBwcmV2U2NvcGU7XG5cbiAgICAgIGNvbnN0IHRhc2sgPSAoKSA9PiB7XG4gICAgICAgIGJvdW5kYXJ5Lm5vZGVzKCkuZm9yRWFjaCgobikgPT4gdGhpcy5kZXN0cm95Tm9kZShuKSk7XG4gICAgICAgIGJvdW5kYXJ5LmNsZWFyKCk7XG5cbiAgICAgICAgY29uc3QgcmVzdG9yZVNjb3BlID0gdGhpcy5pbnRlcnByZXRlci5zY29wZTtcbiAgICAgICAgdGhpcy5pbnRlcnByZXRlci5zY29wZSA9IHRyYWNraW5nU2NvcGU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHJlc3VsdHNbMF0pIHtcbiAgICAgICAgICAgIGV4cHJlc3Npb25zWzBdWzBdLmFjY2VwdCh0aGlzLCBib3VuZGFyeSBhcyBhbnkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHJlc3VsdHNbaV0pIHtcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbnNbaV1bMF0uYWNjZXB0KHRoaXMsIGJvdW5kYXJ5IGFzIGFueSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5pbnRlcnByZXRlci5zY29wZSA9IHJlc3RvcmVTY29wZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgIHF1ZXVlVXBkYXRlKGluc3RhbmNlLCB0YXNrKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhc2soKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgKGJvdW5kYXJ5IGFzIGFueSkuc3RhcnQuJGthc3BlclJlZnJlc2ggPSB0aGlzLnNjb3BlZFJlZnJlc2gocnVuKTtcblxuICAgIGNvbnN0IHN0b3AgPSB0aGlzLnNjb3BlZEVmZmVjdChydW4pO1xuICAgIHRoaXMudHJhY2tFZmZlY3QoYm91bmRhcnksIHN0b3ApO1xuICB9XG5cbiAgcHJpdmF0ZSBkb0VhY2goZWFjaDogS05vZGUuQXR0cmlidXRlLCBub2RlOiBLTm9kZS5FbGVtZW50LCBwYXJlbnQ6IE5vZGUpIHtcbiAgICBjb25zdCBrZXlBdHRyID0gdGhpcy5maW5kQXR0cihub2RlLCBbXCJAa2V5XCJdKTtcbiAgICBpZiAoa2V5QXR0cikge1xuICAgICAgdGhpcy5kb0VhY2hLZXllZChlYWNoLCBub2RlLCBwYXJlbnQsIGtleUF0dHIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRvRWFjaFVua2V5ZWQoZWFjaCwgbm9kZSwgcGFyZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRvRWFjaFVua2V5ZWQoZWFjaDogS05vZGUuQXR0cmlidXRlLCBub2RlOiBLTm9kZS5FbGVtZW50LCBwYXJlbnQ6IE5vZGUpIHtcbiAgICBjb25zdCBib3VuZGFyeSA9IG5ldyBCb3VuZGFyeShwYXJlbnQsIFwiZWFjaFwiKTtcbiAgICBjb25zdCBvcmlnaW5hbFNjb3BlID0gdGhpcy5pbnRlcnByZXRlci5zY29wZTtcblxuICAgIGNvbnN0IHJ1biA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHRva2VucyA9IHRoaXMuc2Nhbm5lci5zY2FuKGVhY2gudmFsdWUpO1xuICAgICAgY29uc3QgW25hbWUsIGtleSwgaXRlcmFibGVdID0gdGhpcy5pbnRlcnByZXRlci5ldmFsdWF0ZShcbiAgICAgICAgdGhpcy5wYXJzZXIuZm9yZWFjaCh0b2tlbnMpXG4gICAgICApO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmludGVycHJldGVyLnNjb3BlLmdldChcIiRpbnN0YW5jZVwiKTtcblxuICAgICAgY29uc3QgdGFzayA9ICgpID0+IHtcbiAgICAgICAgYm91bmRhcnkubm9kZXMoKS5mb3JFYWNoKChuKSA9PiB0aGlzLmRlc3Ryb3lOb2RlKG4pKTtcbiAgICAgICAgYm91bmRhcnkuY2xlYXIoKTtcblxuICAgICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICBjb25zdCBzY29wZVZhbHVlczogYW55ID0geyBbbmFtZV06IGl0ZW0gfTtcbiAgICAgICAgICBpZiAoa2V5KSBzY29wZVZhbHVlc1trZXldID0gaW5kZXg7XG5cbiAgICAgICAgICB0aGlzLmludGVycHJldGVyLnNjb3BlID0gbmV3IFNjb3BlKG9yaWdpbmFsU2NvcGUsIHNjb3BlVmFsdWVzKTtcbiAgICAgICAgICB0aGlzLmNyZWF0ZUVsZW1lbnQobm9kZSwgYm91bmRhcnkgYXMgYW55KTtcbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSBvcmlnaW5hbFNjb3BlO1xuICAgICAgfTtcblxuICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgIHF1ZXVlVXBkYXRlKGluc3RhbmNlLCB0YXNrKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhc2soKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgKGJvdW5kYXJ5IGFzIGFueSkuc3RhcnQuJGthc3BlclJlZnJlc2ggPSB0aGlzLnNjb3BlZFJlZnJlc2gocnVuKTtcblxuICAgIGNvbnN0IHN0b3AgPSB0aGlzLnNjb3BlZEVmZmVjdChydW4pO1xuICAgIHRoaXMudHJhY2tFZmZlY3QoYm91bmRhcnksIHN0b3ApO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmlnZ2VyUmVmcmVzaChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgLy8gMS4gUmUtcnVuIHN0cnVjdHVyYWwgbG9naWMgKGlmL2VhY2gvd2hpbGUpXG4gICAgaWYgKChub2RlIGFzIGFueSkuJGthc3BlclJlZnJlc2gpIHtcbiAgICAgIChub2RlIGFzIGFueSkuJGthc3BlclJlZnJlc2goKTtcbiAgICB9XG5cbiAgICAvLyAyLiBSZS1ydW4gYWxsIHN1cmdpY2FsIGVmZmVjdHMgKHRleHQgaW50ZXJwb2xhdGlvbiwgYXR0cmlidXRlcywgZXRjLilcbiAgICBpZiAoKG5vZGUgYXMgYW55KS4ka2FzcGVyRWZmZWN0cykge1xuICAgICAgKG5vZGUgYXMgYW55KS4ka2FzcGVyRWZmZWN0cy5mb3JFYWNoKChzdG9wOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdG9wLnJ1biA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgc3RvcC5ydW4oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gMy4gUmVjdXJzZVxuICAgIG5vZGUuY2hpbGROb2Rlcz8uZm9yRWFjaCgoY2hpbGQpID0+IHRoaXMudHJpZ2dlclJlZnJlc2goY2hpbGQpKTtcbiAgfVxuXG4gIHByaXZhdGUgZG9FYWNoS2V5ZWQoZWFjaDogS05vZGUuQXR0cmlidXRlLCBub2RlOiBLTm9kZS5FbGVtZW50LCBwYXJlbnQ6IE5vZGUsIGtleUF0dHI6IEtOb2RlLkF0dHJpYnV0ZSkge1xuICAgIGNvbnN0IGJvdW5kYXJ5ID0gbmV3IEJvdW5kYXJ5KHBhcmVudCwgXCJlYWNoXCIpO1xuICAgIGNvbnN0IG9yaWdpbmFsU2NvcGUgPSB0aGlzLmludGVycHJldGVyLnNjb3BlO1xuICAgIGNvbnN0IGtleWVkTm9kZXMgPSBuZXcgTWFwPGFueSwgTm9kZT4oKTtcblxuICAgIGNvbnN0IHJ1biA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHRva2VucyA9IHRoaXMuc2Nhbm5lci5zY2FuKGVhY2gudmFsdWUpO1xuICAgICAgY29uc3QgW25hbWUsIGluZGV4S2V5LCBpdGVyYWJsZV0gPSB0aGlzLmludGVycHJldGVyLmV2YWx1YXRlKFxuICAgICAgICB0aGlzLnBhcnNlci5mb3JlYWNoKHRva2VucylcbiAgICAgICk7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUuZ2V0KFwiJGluc3RhbmNlXCIpO1xuXG4gICAgICAvLyBDb21wdXRlIG5ldyBpdGVtcyBhbmQgdGhlaXIga2V5cyBpbW1lZGlhdGVseVxuICAgICAgY29uc3QgbmV3SXRlbXM6IEFycmF5PHsgaXRlbTogYW55OyBpZHg6IG51bWJlcjsga2V5OiBhbnkgfT4gPSBbXTtcbiAgICAgIGNvbnN0IHNlZW5LZXlzID0gbmV3IFNldCgpO1xuICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVyYWJsZSkge1xuICAgICAgICBjb25zdCBzY29wZVZhbHVlczogYW55ID0geyBbbmFtZV06IGl0ZW0gfTtcbiAgICAgICAgaWYgKGluZGV4S2V5KSBzY29wZVZhbHVlc1tpbmRleEtleV0gPSBpbmRleDtcbiAgICAgICAgdGhpcy5pbnRlcnByZXRlci5zY29wZSA9IG5ldyBTY29wZShvcmlnaW5hbFNjb3BlLCBzY29wZVZhbHVlcyk7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZXhlY3V0ZShrZXlBdHRyLnZhbHVlKTtcblxuICAgICAgICBpZiAodGhpcy5tb2RlID09PSBcImRldmVsb3BtZW50XCIgJiYgc2VlbktleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtLYXNwZXJdIER1cGxpY2F0ZSBrZXkgZGV0ZWN0ZWQgaW4gQGVhY2g6IFwiJHtrZXl9XCIuIEtleXMgbXVzdCBiZSB1bmlxdWUgdG8gZW5zdXJlIGNvcnJlY3QgcmVjb25jaWxpYXRpb24uYCk7XG4gICAgICAgIH1cbiAgICAgICAgc2VlbktleXMuYWRkKGtleSk7XG5cbiAgICAgICAgbmV3SXRlbXMucHVzaCh7IGl0ZW06IGl0ZW0sIGlkeDogaW5kZXgsIGtleToga2V5IH0pO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXNrID0gKCkgPT4ge1xuICAgICAgICAvLyBEZXN0cm95IG5vZGVzIHdob3NlIGtleXMgYXJlIG5vIGxvbmdlciBwcmVzZW50XG4gICAgICAgIGNvbnN0IG5ld0tleVNldCA9IG5ldyBTZXQobmV3SXRlbXMubWFwKChpKSA9PiBpLmtleSkpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGRvbU5vZGVdIG9mIGtleWVkTm9kZXMpIHtcbiAgICAgICAgICBpZiAoIW5ld0tleVNldC5oYXMoa2V5KSkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95Tm9kZShkb21Ob2RlKTtcbiAgICAgICAgICAgIGRvbU5vZGUucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQoZG9tTm9kZSk7XG4gICAgICAgICAgICBrZXllZE5vZGVzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluc2VydC9yZXVzZSBub2RlcyBpbiBuZXcgb3JkZXIgdXNpbmcgYSBjdXJzb3IgdG8gYXZvaWQgdW5uZWNlc3NhcnkgbW92ZXNcbiAgICAgICAgY29uc3QgcGFyZW50ID0gKGJvdW5kYXJ5IGFzIGFueSkuZW5kLnBhcmVudE5vZGUgYXMgTm9kZTtcbiAgICAgICAgbGV0IGxhc3RJbnNlcnRlZDogTm9kZSA9IChib3VuZGFyeSBhcyBhbnkpLnN0YXJ0O1xuXG4gICAgICAgIGZvciAoY29uc3QgeyBpdGVtLCBpZHgsIGtleSB9IG9mIG5ld0l0ZW1zKSB7XG4gICAgICAgICAgY29uc3Qgc2NvcGVWYWx1ZXM6IGFueSA9IHsgW25hbWVdOiBpdGVtIH07XG4gICAgICAgICAgaWYgKGluZGV4S2V5KSBzY29wZVZhbHVlc1tpbmRleEtleV0gPSBpZHg7XG4gICAgICAgICAgdGhpcy5pbnRlcnByZXRlci5zY29wZSA9IG5ldyBTY29wZShvcmlnaW5hbFNjb3BlLCBzY29wZVZhbHVlcyk7XG5cbiAgICAgICAgICBpZiAoa2V5ZWROb2Rlcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgY29uc3QgZG9tTm9kZSA9IGtleWVkTm9kZXMuZ2V0KGtleSkhO1xuXG4gICAgICAgICAgICAvLyBPbmx5IG1vdmUgdGhlIG5vZGUgaWYgaXQncyBub3QgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvblxuICAgICAgICAgICAgaWYgKGxhc3RJbnNlcnRlZC5uZXh0U2libGluZyAhPT0gZG9tTm9kZSkge1xuICAgICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGRvbU5vZGUsIGxhc3RJbnNlcnRlZC5uZXh0U2libGluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0SW5zZXJ0ZWQgPSBkb21Ob2RlO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgc2NvcGUgYW5kIHRyaWdnZXIgcmUtcmVuZGVyIG9mIG5lc3RlZCBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZXNcbiAgICAgICAgICAgIGNvbnN0IG5vZGVTY29wZSA9IChkb21Ob2RlIGFzIGFueSkuJGthc3BlclNjb3BlO1xuICAgICAgICAgICAgaWYgKG5vZGVTY29wZSkge1xuICAgICAgICAgICAgICBub2RlU2NvcGUuc2V0KG5hbWUsIGl0ZW0pO1xuICAgICAgICAgICAgICBpZiAoaW5kZXhLZXkpIG5vZGVTY29wZS5zZXQoaW5kZXhLZXksIGlkeCk7XG5cbiAgICAgICAgICAgICAgLy8gSWYgaXQgaGFzIGl0cyBvd24gcmVuZGVyIGxvZ2ljIChuZXN0ZWQgZWFjaC9pZiksIHRyaWdnZXIgaXQgcmVjdXJzaXZlbHlcbiAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyUmVmcmVzaChkb21Ob2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY3JlYXRlZCA9IHRoaXMuY3JlYXRlRWxlbWVudChub2RlLCBib3VuZGFyeSBhcyBhbnkpO1xuICAgICAgICAgICAgaWYgKGNyZWF0ZWQpIHtcbiAgICAgICAgICAgICAgLy8gY3JlYXRlRWxlbWVudCBpbnNlcnRzIGJlZm9yZSBlbmQ7IG1vdmUgdG8gY29ycmVjdCBwb3NpdGlvbiBpZiBuZWVkZWRcbiAgICAgICAgICAgICAgaWYgKGxhc3RJbnNlcnRlZC5uZXh0U2libGluZyAhPT0gY3JlYXRlZCkge1xuICAgICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoY3JlYXRlZCwgbGFzdEluc2VydGVkLm5leHRTaWJsaW5nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsYXN0SW5zZXJ0ZWQgPSBjcmVhdGVkO1xuICAgICAgICAgICAgICBrZXllZE5vZGVzLnNldChrZXksIGNyZWF0ZWQpO1xuICAgICAgICAgICAgICAvLyBTdG9yZSB0aGUgc2NvcGUgb24gdGhlIERPTSBub2RlIHNvIHdlIGNhbiB1cGRhdGUgaXQgbGF0ZXJcbiAgICAgICAgICAgICAgKGNyZWF0ZWQgYXMgYW55KS4ka2FzcGVyU2NvcGUgPSB0aGlzLmludGVycHJldGVyLnNjb3BlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmludGVycHJldGVyLnNjb3BlID0gb3JpZ2luYWxTY29wZTtcbiAgICAgIH07XG5cbiAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICBxdWV1ZVVwZGF0ZShpbnN0YW5jZSwgdGFzayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXNrKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIChib3VuZGFyeSBhcyBhbnkpLnN0YXJ0LiRrYXNwZXJSZWZyZXNoID0gdGhpcy5zY29wZWRSZWZyZXNoKHJ1bik7XG5cbiAgICBjb25zdCBzdG9wID0gdGhpcy5zY29wZWRFZmZlY3QocnVuKTtcbiAgICB0aGlzLnRyYWNrRWZmZWN0KGJvdW5kYXJ5LCBzdG9wKTtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBjcmVhdGVTaWJsaW5ncyhub2RlczogS05vZGUuS05vZGVbXSwgcGFyZW50PzogTm9kZSk6IHZvaWQge1xuICAgIGxldCBjdXJyZW50ID0gMDtcbiAgICBjb25zdCBpbml0aWFsU2NvcGUgPSB0aGlzLmludGVycHJldGVyLnNjb3BlO1xuICAgIGxldCBncm91cFNjb3BlOiBTY29wZSB8IG51bGwgPSBudWxsO1xuXG4gICAgd2hpbGUgKGN1cnJlbnQgPCBub2Rlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tjdXJyZW50KytdO1xuICAgICAgaWYgKG5vZGUudHlwZSA9PT0gXCJlbGVtZW50XCIpIHtcbiAgICAgICAgY29uc3QgZWwgPSBub2RlIGFzIEtOb2RlLkVsZW1lbnQ7XG5cbiAgICAgICAgLy8gMS4gUHJvY2VzcyBAbGV0IChsZWFrcyB0byBzaWJsaW5ncyBhbmQgYXZhaWxhYmxlIHRvIG90aGVyIGRpcmVjdGl2ZXMgb24gdGhpcyBub2RlKVxuICAgICAgICBjb25zdCAkbGV0ID0gdGhpcy5maW5kQXR0cihlbCwgW1wiQGxldFwiXSk7XG4gICAgICAgIGlmICgkbGV0KSB7XG4gICAgICAgICAgaWYgKCFncm91cFNjb3BlKSB7XG4gICAgICAgICAgICBncm91cFNjb3BlID0gbmV3IFNjb3BlKGluaXRpYWxTY29wZSk7XG4gICAgICAgICAgICB0aGlzLmludGVycHJldGVyLnNjb3BlID0gZ3JvdXBTY29wZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5leGVjdXRlKCRsZXQudmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gVmFsaWRhdGlvbjogU3RydWN0dXJhbCBkaXJlY3RpdmVzIGFyZSBtdXR1YWxseSBleGNsdXNpdmVcbiAgICAgICAgY29uc3QgaWZBdHRyID0gdGhpcy5maW5kQXR0cihlbCwgW1wiQGlmXCJdKTtcbiAgICAgICAgY29uc3QgZWxzZWlmQXR0ciA9IHRoaXMuZmluZEF0dHIoZWwsIFtcIkBlbHNlaWZcIl0pO1xuICAgICAgICBjb25zdCBlbHNlQXR0ciA9IHRoaXMuZmluZEF0dHIoZWwsIFtcIkBlbHNlXCJdKTtcbiAgICAgICAgY29uc3QgJGVhY2ggPSB0aGlzLmZpbmRBdHRyKGVsLCBbXCJAZWFjaFwiXSk7XG5cbiAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gXCJkZXZlbG9wbWVudFwiKSB7XG4gICAgICAgICAgY29uc3Qgc3RydWN0dXJhbENvdW50ID0gW2lmQXR0ciwgZWxzZWlmQXR0ciwgZWxzZUF0dHIsICRlYWNoXS5maWx0ZXIoYSA9PiBhKS5sZW5ndGg7XG4gICAgICAgICAgaWYgKHN0cnVjdHVyYWxDb3VudCA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IoS0Vycm9yQ29kZS5NVUxUSVBMRV9TVFJVQ1RVUkFMX0RJUkVDVElWRVMsIHt9LCBlbC5uYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiBQcm9jZXNzIHN0cnVjdHVyYWwgZGlyZWN0aXZlcyAob25lIHdpbGwgbWF0Y2ggYW5kIGNvbnRpbnVlKVxuICAgICAgICBpZiAoJGVhY2gpIHtcbiAgICAgICAgICB0aGlzLmRvRWFjaCgkZWFjaCwgZWwsIHBhcmVudCEpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlmQXR0cikge1xuICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25zOiBJZkVsc2VOb2RlW10gPSBbW2VsLCBpZkF0dHJdXTtcblxuICAgICAgICAgIHdoaWxlIChjdXJyZW50IDwgbm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gbm9kZXNbY3VycmVudF07XG4gICAgICAgICAgICBpZiAobmV4dC50eXBlICE9PSBcImVsZW1lbnRcIikgYnJlYWs7XG4gICAgICAgICAgICBjb25zdCBhdHRyID0gdGhpcy5maW5kQXR0cihuZXh0IGFzIEtOb2RlLkVsZW1lbnQsIFtcbiAgICAgICAgICAgICAgXCJAZWxzZVwiLFxuICAgICAgICAgICAgICBcIkBlbHNlaWZcIixcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgaWYgKGF0dHIpIHtcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbnMucHVzaChbbmV4dCBhcyBLTm9kZS5FbGVtZW50LCBhdHRyXSk7XG4gICAgICAgICAgICAgIGN1cnJlbnQgKz0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuZG9JZihleHByZXNzaW9ucywgcGFyZW50ISk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5ldmFsdWF0ZShub2RlLCBwYXJlbnQpO1xuICAgIH1cblxuICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSBpbml0aWFsU2NvcGU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVsZW1lbnQobm9kZTogS05vZGUuRWxlbWVudCwgcGFyZW50PzogTm9kZSk6IE5vZGUgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAobm9kZS5uYW1lID09PSBcInNsb3RcIikge1xuICAgICAgICBjb25zdCBuYW1lQXR0ciA9IHRoaXMuZmluZEF0dHIobm9kZSwgW1wiQG5hbWVcIl0pO1xuICAgICAgICBjb25zdCBuYW1lID0gbmFtZUF0dHIgPyBuYW1lQXR0ci52YWx1ZSA6IFwiZGVmYXVsdFwiO1xuICAgICAgICBjb25zdCBzbG90cyA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUuZ2V0KFwiJHNsb3RzXCIpO1xuICAgICAgICBpZiAoc2xvdHMgJiYgc2xvdHNbbmFtZV0pIHtcbiAgICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5pbnRlcnByZXRlci5zY29wZTtcbiAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBzY29wZSB3aGVyZSB0aGUgc2xvdCBjb250ZW50IHdhcyBkZWZpbmVkIChMZXhpY2FsIFNjb3BpbmcpLlxuICAgICAgICAgIC8vIFdlIHN0b3JlIHRoZSBzY29wZSByZWZlcmVuY2UgZGlyZWN0bHkgb24gdGhlIEFycmF5IGluc3RhbmNlIHRvIGF2b2lkIGNoYW5naW5nIHNpZ25hdHVyZXMuXG4gICAgICAgICAgaWYgKHNsb3RzW25hbWVdLnNjb3BlKSB0aGlzLmludGVycHJldGVyLnNjb3BlID0gc2xvdHNbbmFtZV0uc2NvcGU7XG4gICAgICAgICAgdGhpcy5jcmVhdGVTaWJsaW5ncyhzbG90c1tuYW1lXSwgcGFyZW50KTtcbiAgICAgICAgICB0aGlzLmludGVycHJldGVyLnNjb3BlID0gcHJldjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc1ZvaWQgPSBub2RlLm5hbWUgPT09IFwidm9pZFwiO1xuICAgICAgY29uc3QgaXNDb21wb25lbnQgPSAhIXRoaXMucmVnaXN0cnlbbm9kZS5uYW1lXTtcblxuICAgICAgY29uc3QgZWxlbWVudCA9IGlzVm9pZCA/IHBhcmVudCA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobm9kZS5uYW1lKTtcbiAgICAgIGNvbnN0IHJlc3RvcmVTY29wZSA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGU7XG5cbiAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQgIT09IHBhcmVudCkge1xuICAgICAgICB0aGlzLmludGVycHJldGVyLnNjb3BlLnNldChcIiRyZWZcIiwgZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0NvbXBvbmVudCkge1xuICAgICAgICAvLyBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNvbXBvbmVudCBhbmQgc2V0IGl0IGFzIHRoZSBjdXJyZW50IHNjb3BlXG4gICAgICAgIGxldCBjb21wb25lbnQ6IGFueSA9IHt9O1xuICAgICAgICBjb25zdCBhcmdzQXR0ciA9IG5vZGUuYXR0cmlidXRlcy5maWx0ZXIoKGF0dHIpID0+XG4gICAgICAgICAgKGF0dHIgYXMgS05vZGUuQXR0cmlidXRlKS5uYW1lLnN0YXJ0c1dpdGgoXCJAOlwiKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBhcmdzID0gdGhpcy5jcmVhdGVDb21wb25lbnRBcmdzKGFyZ3NBdHRyIGFzIEtOb2RlLkF0dHJpYnV0ZVtdKTtcblxuICAgICAgICAvLyBDYXB0dXJlIGNoaWxkcmVuIGZvciBzbG90cy4gXG4gICAgICAgIC8vIFdlIHVzZSBhIHBsYWluIG9iamVjdCBrZXllZCBieSBzbG90IG5hbWUuIEVhY2ggdmFsdWUgaXMgYW4gQXJyYXkgb2YgS05vZGVzLlxuICAgICAgICAvLyBUbyBzdXBwb3J0IGxleGljYWwgc2NvcGluZywgd2UgYXR0YWNoIHRoZSBjdXJyZW50IHNjb3BlIHRvIHRoZSBBcnJheSBpbnN0YW5jZS5cbiAgICAgICAgY29uc3Qgc2xvdHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7IGRlZmF1bHQ6IFtdIH07XG4gICAgICAgIHNsb3RzLmRlZmF1bHQuc2NvcGUgPSB0aGlzLmludGVycHJldGVyLnNjb3BlO1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gXCJlbGVtZW50XCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHNsb3RBdHRyID0gdGhpcy5maW5kQXR0cihjaGlsZCBhcyBLTm9kZS5FbGVtZW50LCBbXCJAc2xvdFwiXSk7XG4gICAgICAgICAgICBpZiAoc2xvdEF0dHIpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHNsb3RBdHRyLnZhbHVlO1xuICAgICAgICAgICAgICBpZiAoIXNsb3RzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgc2xvdHNbbmFtZV0gPSBbXTtcbiAgICAgICAgICAgICAgICBzbG90c1tuYW1lXS5zY29wZSA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc2xvdHNbbmFtZV0ucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzbG90cy5kZWZhdWx0LnB1c2goY2hpbGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucmVnaXN0cnlbbm9kZS5uYW1lXT8ubGF6eSkge1xuICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5yZWdpc3RyeVtub2RlLm5hbWVdO1xuXG4gICAgICAgICAgaWYgKGVudHJ5LmZhbGxiYWNrKSB7XG4gICAgICAgICAgICBjb25zdCBmYWxsYmFja05vZGVzID0gdGhpcy50ZW1wbGF0ZVBhcnNlci5wYXJzZSgoZW50cnkuZmFsbGJhY2sgYXMgYW55KS50ZW1wbGF0ZSA/PyBcIlwiKTtcbiAgICAgICAgICAgIGNvbnN0IGZhbGxiYWNrSW5zdGFuY2U6IGFueSA9IG5ldyBlbnRyeS5mYWxsYmFjayh7IGFyZ3M6IHt9LCByZWY6IGVsZW1lbnQsIHRyYW5zcGlsZXI6IHRoaXMgfSk7XG4gICAgICAgICAgICB0aGlzLmJpbmRNZXRob2RzKGZhbGxiYWNrSW5zdGFuY2UpO1xuICAgICAgICAgICAgKGVsZW1lbnQgYXMgYW55KS4ka2FzcGVySW5zdGFuY2UgPSBmYWxsYmFja0luc3RhbmNlO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJDb21wb25lbnRJbnN0YW5jZShmYWxsYmFja0luc3RhbmNlLCBmYWxsYmFja05vZGVzLCBlbGVtZW50IGFzIEhUTUxFbGVtZW50LCByZXN0b3JlU2NvcGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghKGVudHJ5IGFzIGFueSkuX3Byb21pc2UpIHtcbiAgICAgICAgICAgIChlbnRyeSBhcyBhbnkpLl9wcm9taXNlID0gKGVudHJ5LmNvbXBvbmVudCBhcyAoKSA9PiBQcm9taXNlPENvbXBvbmVudENsYXNzPikoKS50aGVuKChjbHMpID0+IHtcbiAgICAgICAgICAgICAgZW50cnkubm9kZXMgPSB0aGlzLnRlbXBsYXRlUGFyc2VyLnBhcnNlKChjbHMgYXMgYW55KS50ZW1wbGF0ZSA/PyBcIlwiKTtcbiAgICAgICAgICAgICAgZW50cnkuY29tcG9uZW50ID0gY2xzO1xuICAgICAgICAgICAgICBkZWxldGUgZW50cnkubGF6eTtcbiAgICAgICAgICAgICAgZGVsZXRlIChlbnRyeSBhcyBhbnkpLl9wcm9taXNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgKGVudHJ5IGFzIGFueSkuX3Byb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3koZWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgICAgIGNvbnN0IGNscyA9IGVudHJ5LmNvbXBvbmVudCBhcyBDb21wb25lbnRDbGFzcztcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlOiBhbnkgPSBuZXcgY2xzKHsgYXJnczogYXJncywgcmVmOiBlbGVtZW50LCB0cmFuc3BpbGVyOiB0aGlzIH0pO1xuICAgICAgICAgICAgdGhpcy5iaW5kTWV0aG9kcyhpbnN0YW5jZSk7XG4gICAgICAgICAgICAoZWxlbWVudCBhcyBhbnkpLiRrYXNwZXJJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJDb21wb25lbnRJbnN0YW5jZShpbnN0YW5jZSwgZW50cnkubm9kZXMhLCBlbGVtZW50IGFzIEhUTUxFbGVtZW50LCByZXN0b3JlU2NvcGUsIHNsb3RzKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIGlmICgocGFyZW50IGFzIGFueSkuaW5zZXJ0ICYmIHR5cGVvZiAocGFyZW50IGFzIGFueSkuaW5zZXJ0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgKHBhcmVudCBhcyBhbnkpLmluc2VydChlbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZWdpc3RyeVtub2RlLm5hbWVdPy5jb21wb25lbnQpIHtcbiAgICAgICAgICBjb21wb25lbnQgPSBuZXcgKHRoaXMucmVnaXN0cnlbbm9kZS5uYW1lXS5jb21wb25lbnQgYXMgQ29tcG9uZW50Q2xhc3MpKHtcbiAgICAgICAgICAgIGFyZ3M6IGFyZ3MsXG4gICAgICAgICAgICByZWY6IGVsZW1lbnQsXG4gICAgICAgICAgICB0cmFuc3BpbGVyOiB0aGlzLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5iaW5kTWV0aG9kcyhjb21wb25lbnQpO1xuICAgICAgICAgIChlbGVtZW50IGFzIGFueSkuJGthc3Blckluc3RhbmNlID0gY29tcG9uZW50O1xuXG4gICAgICAgICAgaWYgKG5vZGUubmFtZSA9PT0gXCJyb3V0ZXJcIiAmJiBjb21wb25lbnQgaW5zdGFuY2VvZiBSb3V0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlU2NvcGUgPSBuZXcgU2NvcGUocmVzdG9yZVNjb3BlLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgY29tcG9uZW50LnNldFJvdXRlcyh0aGlzLmV4dHJhY3RSb3V0ZXMobm9kZS5jaGlsZHJlbiwgdW5kZWZpbmVkLCByb3V0ZVNjb3BlKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5yZW5kZXJDb21wb25lbnRJbnN0YW5jZShjb21wb25lbnQsIHRoaXMucmVzb2x2ZU5vZGVzKG5vZGUubmFtZSksIGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQsIHJlc3RvcmVTY29wZSwgc2xvdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICBpZiAoKHBhcmVudCBhcyBhbnkpLmluc2VydCAmJiB0eXBlb2YgKHBhcmVudCBhcyBhbnkpLmluc2VydCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAocGFyZW50IGFzIGFueSkuaW5zZXJ0KGVsZW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzVm9pZCkge1xuICAgICAgICAvLyBldmVudCBiaW5kaW5nXG4gICAgICAgIGNvbnN0IGV2ZW50cyA9IG5vZGUuYXR0cmlidXRlcy5maWx0ZXIoKGF0dHIpID0+XG4gICAgICAgICAgKGF0dHIgYXMgS05vZGUuQXR0cmlidXRlKS5uYW1lLnN0YXJ0c1dpdGgoXCJAb246XCIpXG4gICAgICAgICk7XG5cbiAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZXZlbnQgYXMgS05vZGUuQXR0cmlidXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlZ3VsYXIgYXR0cmlidXRlcyAocHJvY2Vzc2VkIGZpcnN0KVxuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gbm9kZS5hdHRyaWJ1dGVzLmZpbHRlcihcbiAgICAgICAgICAoYXR0cikgPT4gIShhdHRyIGFzIEtOb2RlLkF0dHJpYnV0ZSkubmFtZS5zdGFydHNXaXRoKFwiQFwiKVxuICAgICAgICApO1xuXG4gICAgICAgIGZvciAoY29uc3QgYXR0ciBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgdGhpcy5ldmFsdWF0ZShhdHRyLCBlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNob3J0aGFuZCBhdHRyaWJ1dGVzIChwcm9jZXNzZWQgc2Vjb25kLCBhbGxvd3MgbWVyZ2luZylcbiAgICAgICAgY29uc3Qgc2hvcnRoYW5kQXR0cmlidXRlcyA9IG5vZGUuYXR0cmlidXRlcy5maWx0ZXIoKGF0dHIpID0+IHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gKGF0dHIgYXMgS05vZGUuQXR0cmlidXRlKS5uYW1lO1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBuYW1lLnN0YXJ0c1dpdGgoXCJAXCIpICYmXG4gICAgICAgICAgICAhW1wiQGlmXCIsIFwiQGVsc2VpZlwiLCBcIkBlbHNlXCIsIFwiQGVhY2hcIiwgXCJAbGV0XCIsIFwiQGtleVwiLCBcIkByZWZcIl0uaW5jbHVkZXMoXG4gICAgICAgICAgICAgIG5hbWVcbiAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICFuYW1lLnN0YXJ0c1dpdGgoXCJAb246XCIpICYmXG4gICAgICAgICAgICAhbmFtZS5zdGFydHNXaXRoKFwiQDpcIilcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGF0dHIgb2Ygc2hvcnRoYW5kQXR0cmlidXRlcykge1xuICAgICAgICAgIGNvbnN0IHJlYWxOYW1lID0gKGF0dHIgYXMgS05vZGUuQXR0cmlidXRlKS5uYW1lLnNsaWNlKDEpO1xuXG4gICAgICAgICAgaWYgKHJlYWxOYW1lID09PSBcImNsYXNzXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0b3AgPSB0aGlzLnNjb3BlZEVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5leGVjdXRlKChhdHRyIGFzIEtOb2RlLkF0dHJpYnV0ZSkudmFsdWUpO1xuICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUuZ2V0KFwiJGluc3RhbmNlXCIpO1xuICAgICAgICAgICAgICBjb25zdCB0YXNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIChlbGVtZW50IGFzIEhUTUxFbGVtZW50KS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB2YWx1ZSk7XG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgcXVldWVVcGRhdGUoaW5zdGFuY2UsIHRhc2spO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhc2soKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnRyYWNrRWZmZWN0KGVsZW1lbnQsIHN0b3ApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzdG9wID0gdGhpcy5zY29wZWRFZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZXhlY3V0ZSgoYXR0ciBhcyBLTm9kZS5BdHRyaWJ1dGUpLnZhbHVlKTtcbiAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmludGVycHJldGVyLnNjb3BlLmdldChcIiRpbnN0YW5jZVwiKTtcbiAgICAgICAgICAgICAgY29uc3QgdGFzayA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IGZhbHNlIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChyZWFsTmFtZSAhPT0gXCJzdHlsZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIChlbGVtZW50IGFzIEhUTUxFbGVtZW50KS5yZW1vdmVBdHRyaWJ1dGUocmVhbE5hbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpZiAocmVhbE5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZyA9IChlbGVtZW50IGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBleGlzdGluZyAmJiAhZXhpc3RpbmcuaW5jbHVkZXModmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgPyBgJHtleGlzdGluZy5lbmRzV2l0aChcIjtcIikgPyBleGlzdGluZyA6IGV4aXN0aW5nICsgXCI7XCJ9ICR7dmFsdWV9YFxuICAgICAgICAgICAgICAgICAgICAgIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIChlbGVtZW50IGFzIEhUTUxFbGVtZW50KS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuc2V0QXR0cmlidXRlKHJlYWxOYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHF1ZXVlVXBkYXRlKGluc3RhbmNlLCB0YXNrKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXNrKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy50cmFja0VmZmVjdChlbGVtZW50LCBzdG9wKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudCAmJiAhaXNWb2lkKSB7XG4gICAgICAgIGlmICgocGFyZW50IGFzIGFueSkuaW5zZXJ0ICYmIHR5cGVvZiAocGFyZW50IGFzIGFueSkuaW5zZXJ0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAocGFyZW50IGFzIGFueSkuaW5zZXJ0KGVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWZBdHRyID0gdGhpcy5maW5kQXR0cihub2RlLCBbXCJAcmVmXCJdKTtcbiAgICAgIGlmIChyZWZBdHRyICYmICFpc1ZvaWQpIHtcbiAgICAgICAgY29uc3QgcHJvcE5hbWUgPSByZWZBdHRyLnZhbHVlLnRyaW0oKTtcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmludGVycHJldGVyLnNjb3BlLmdldChcIiRpbnN0YW5jZVwiKTtcbiAgICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgICAgaW5zdGFuY2VbcHJvcE5hbWVdID0gZWxlbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmludGVycHJldGVyLnNjb3BlLnNldChwcm9wTmFtZSwgZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUuc2VsZikge1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jcmVhdGVTaWJsaW5ncyhub2RlLmNoaWxkcmVuLCBlbGVtZW50KTtcbiAgICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSByZXN0b3JlU2NvcGU7XG5cbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBLYXNwZXJFcnJvcikgdGhyb3cgZS53aXRoVGFnKG5vZGUubmFtZSk7XG4gICAgICB0aGlzLmVycm9yKEtFcnJvckNvZGUuUlVOVElNRV9FUlJPUiwgeyBtZXNzYWdlOiBlLm1lc3NhZ2UgfHwgYCR7ZX1gIH0sIG5vZGUubmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb21wb25lbnRBcmdzKGFyZ3M6IEtOb2RlLkF0dHJpYnV0ZVtdKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgaWYgKCFhcmdzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICBjb25zdCBrZXkgPSBhcmcubmFtZS5zcGxpdChcIjpcIilbMV07XG4gICAgICBpZiAodGhpcy5tb2RlID09PSBcImRldmVsb3BtZW50XCIgJiYga2V5LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChcIm9uXCIpKSB7XG4gICAgICAgIGNvbnN0IHRyaW1tZWQgPSBhcmcudmFsdWUudHJpbSgpO1xuICAgICAgICBjb25zdCBpc0NhbGxFeHByID0gL15bXFx3JC5dW1xcdyQuXSpcXHMqXFwoLipcXClcXHMqJC8udGVzdCh0cmltbWVkKSAmJiAhdHJpbW1lZC5pbmNsdWRlcyhcIj0+XCIpO1xuICAgICAgICBpZiAoaXNDYWxsRXhwcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBbS2FzcGVyXSBAOiR7a2V5fT1cIiR7YXJnLnZhbHVlfVwiIOKAlCB0aGUgZXhwcmVzc2lvbiBpcyBjYWxsZWQgZHVyaW5nIHJlbmRlciBhbmQgaXRzIHJldHVybiB2YWx1ZSBpcyBwYXNzZWQgYXMgdGhlIHByb3AuIGAgK1xuICAgICAgICAgICAgYElmIGl0IHJldHVybnMgYSBmdW5jdGlvbiwgdGhhdCBmdW5jdGlvbiBiZWNvbWVzIHRoZSBoYW5kbGVyIChmYWN0b3J5IHBhdHRlcm4pLiBgICtcbiAgICAgICAgICAgIGBJZiBpdCByZXR1cm5zIHVuZGVmaW5lZCwgdGhlIHByb3AgcmVjZWl2ZXMgdW5kZWZpbmVkLiBgICtcbiAgICAgICAgICAgIGBJZiB0aGUgZnVuY3Rpb24gaGFzIHJlYWN0aXZlIHNpZGUgZWZmZWN0cywgZW5zdXJlIGl0IGRvZXMgbm90IGJvdGggcmVhZCBhbmQgd3JpdGUgdGhlIHNhbWUgc2lnbmFsLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXN1bHRba2V5XSA9IHRoaXMuZXhlY3V0ZShhcmcudmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVFdmVudExpc3RlbmVyKGVsZW1lbnQ6IE5vZGUsIGF0dHI6IEtOb2RlLkF0dHJpYnV0ZSk6IHZvaWQge1xuICAgIGNvbnN0IFtldmVudE5hbWUsIC4uLm1vZGlmaWVyc10gPSBhdHRyLm5hbWUuc3BsaXQoXCI6XCIpWzFdLnNwbGl0KFwiLlwiKTtcbiAgICBjb25zdCBsaXN0ZW5lclNjb3BlID0gbmV3IFNjb3BlKHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUpO1xuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5pbnRlcnByZXRlci5zY29wZS5nZXQoXCIkaW5zdGFuY2VcIik7XG5cbiAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7fTtcbiAgICBpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UuJGFib3J0Q29udHJvbGxlcikge1xuICAgICAgb3B0aW9ucy5zaWduYWwgPSBpbnN0YW5jZS4kYWJvcnRDb250cm9sbGVyLnNpZ25hbDtcbiAgICB9XG4gICAgaWYgKG1vZGlmaWVycy5pbmNsdWRlcyhcIm9uY2VcIikpIG9wdGlvbnMub25jZSA9IHRydWU7XG4gICAgaWYgKG1vZGlmaWVycy5pbmNsdWRlcyhcInBhc3NpdmVcIikpIG9wdGlvbnMucGFzc2l2ZSA9IHRydWU7XG4gICAgaWYgKG1vZGlmaWVycy5pbmNsdWRlcyhcImNhcHR1cmVcIikpIG9wdGlvbnMuY2FwdHVyZSA9IHRydWU7XG5cbiAgICAvLyBBbnl0aGluZyBub3QgaW4gdGhpcyBsaXN0IGlzIHRyZWF0ZWQgYXMgYSBwb3RlbnRpYWwga2V5IG1vZGlmaWVyXG4gICAgY29uc3QgY29udHJvbE1vZGlmaWVycyA9IFtcInByZXZlbnRcIiwgXCJzdG9wXCIsIFwib25jZVwiLCBcInBhc3NpdmVcIiwgXCJjYXB0dXJlXCIsIFwiY3RybFwiLCBcInNoaWZ0XCIsIFwiYWx0XCIsIFwibWV0YVwiXTtcbiAgICBjb25zdCBwb3RlbnRpYWxLZXlNb2RpZmllcnMgPSBtb2RpZmllcnMuZmlsdGVyKChtKSA9PiAhY29udHJvbE1vZGlmaWVycy5pbmNsdWRlcyhtLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIGV2ZW50TmFtZSxcbiAgICAgIChldmVudDogYW55KSA9PiB7XG4gICAgICAgIGlmIChwb3RlbnRpYWxLZXlNb2RpZmllcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSBwb3RlbnRpYWxLZXlNb2RpZmllcnMuc29tZSgobSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbG93ZXJNID0gbS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKEtFWV9NQVBbbG93ZXJNXSAmJiBLRVlfTUFQW2xvd2VyTV0uaW5jbHVkZXMoZXZlbnQua2V5KSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAobG93ZXJNID09PSBldmVudC5rZXk/LnRvTG93ZXJDYXNlKCkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICghbWF0Y2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb2RpZmllcnMuaW5jbHVkZXMoXCJjdHJsXCIpICYmICFldmVudC5jdHJsS2V5KSByZXR1cm47XG4gICAgICAgIGlmIChtb2RpZmllcnMuaW5jbHVkZXMoXCJzaGlmdFwiKSAmJiAhZXZlbnQuc2hpZnRLZXkpIHJldHVybjtcbiAgICAgICAgaWYgKG1vZGlmaWVycy5pbmNsdWRlcyhcImFsdFwiKSAmJiAhZXZlbnQuYWx0S2V5KSByZXR1cm47XG4gICAgICAgIGlmIChtb2RpZmllcnMuaW5jbHVkZXMoXCJtZXRhXCIpICYmICFldmVudC5tZXRhS2V5KSByZXR1cm47XG5cbiAgICAgICAgaWYgKG1vZGlmaWVycy5pbmNsdWRlcyhcInByZXZlbnRcIikpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChtb2RpZmllcnMuaW5jbHVkZXMoXCJzdG9wXCIpKSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgbGlzdGVuZXJTY29wZS5zZXQoXCIkZXZlbnRcIiwgZXZlbnQpO1xuICAgICAgICB0aGlzLmV4ZWN1dGUoYXR0ci52YWx1ZSwgbGlzdGVuZXJTY29wZSk7XG4gICAgICB9LFxuICAgICAgb3B0aW9uc1xuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGV2YWx1YXRlVGVtcGxhdGVTdHJpbmcodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRleHQpIHtcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBjb25zdCByZWdleCA9IC9cXHtcXHsuK1xcfVxcfS9tcztcbiAgICBpZiAocmVnZXgudGVzdCh0ZXh0KSkge1xuICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSgvXFx7XFx7KFtcXHNcXFNdKz8pXFx9XFx9L2csIChtLCBwbGFjZWhvbGRlcikgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZUV4cHJlc3Npb24ocGxhY2Vob2xkZXIpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBldmFsdWF0ZUV4cHJlc3Npb24oc291cmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRva2VucyA9IHRoaXMuc2Nhbm5lci5zY2FuKHNvdXJjZSk7XG4gICAgY29uc3QgZXhwcmVzc2lvbnMgPSB0aGlzLnBhcnNlci5wYXJzZSh0b2tlbnMpO1xuXG4gICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgZm9yIChjb25zdCBleHByZXNzaW9uIG9mIGV4cHJlc3Npb25zKSB7XG4gICAgICByZXN1bHQgKz0gYCR7dGhpcy5pbnRlcnByZXRlci5ldmFsdWF0ZShleHByZXNzaW9uKX1gO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBkZXN0cm95Tm9kZShub2RlOiBhbnkpOiB2b2lkIHtcbiAgICAvLyAxLiBDbGVhbnVwIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgIGlmIChub2RlLiRrYXNwZXJJbnN0YW5jZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBub2RlLiRrYXNwZXJJbnN0YW5jZTtcbiAgICAgIGlmIChpbnN0YW5jZS5vbkRlc3Ryb3kpIHtcbiAgICAgICAgaW5zdGFuY2Uub25EZXN0cm95KCk7XG4gICAgICB9XG4gICAgICBpZiAoaW5zdGFuY2UuJGFib3J0Q29udHJvbGxlcikgaW5zdGFuY2UuJGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgIH1cblxuICAgIC8vIDIuIENsZWFudXAgZWZmZWN0cyBhdHRhY2hlZCB0byB0aGUgbm9kZVxuICAgIGlmIChub2RlLiRrYXNwZXJFZmZlY3RzKSB7XG4gICAgICBub2RlLiRrYXNwZXJFZmZlY3RzLmZvckVhY2goKHN0b3A6ICgpID0+IHZvaWQpID0+IHN0b3AoKSk7XG4gICAgICBub2RlLiRrYXNwZXJFZmZlY3RzID0gW107XG4gICAgfVxuXG4gICAgLy8gMy4gQ2xlYW51cCBlZmZlY3RzIG9uIGF0dHJpYnV0ZXNcbiAgICBpZiAobm9kZS5hdHRyaWJ1dGVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBhdHRyID0gbm9kZS5hdHRyaWJ1dGVzW2ldO1xuICAgICAgICBpZiAoYXR0ci4ka2FzcGVyRWZmZWN0cykge1xuICAgICAgICAgIGF0dHIuJGthc3BlckVmZmVjdHMuZm9yRWFjaCgoc3RvcDogKCkgPT4gdm9pZCkgPT4gc3RvcCgpKTtcbiAgICAgICAgICBhdHRyLiRrYXNwZXJFZmZlY3RzID0gW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA0LiBSZWN1cnNlXG4gICAgbm9kZS5jaGlsZE5vZGVzPy5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB0aGlzLmRlc3Ryb3lOb2RlKGNoaWxkKSk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveShjb250YWluZXI6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb250YWluZXIuY2hpbGROb2Rlcy5mb3JFYWNoKChjaGlsZCkgPT4gdGhpcy5kZXN0cm95Tm9kZShjaGlsZCkpO1xuICB9XG5cbiAgcHVibGljIG1vdW50Q29tcG9uZW50KENvbXBvbmVudENsYXNzOiBDb21wb25lbnRDbGFzcywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30pOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3koY29udGFpbmVyKTtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcblxuICAgIGNvbnN0IHRlbXBsYXRlID0gKENvbXBvbmVudENsYXNzIGFzIGFueSkudGVtcGxhdGU7XG4gICAgaWYgKCF0ZW1wbGF0ZSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgbm9kZXMgPSB0aGlzLnRlbXBsYXRlUGFyc2VyLnBhcnNlKHRlbXBsYXRlKTtcbiAgICBjb25zdCBob3N0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaG9zdCk7XG5cbiAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50Q2xhc3MoeyBhcmdzOiB7IHBhcmFtczogcGFyYW1zIH0sIHJlZjogaG9zdCwgdHJhbnNwaWxlcjogdGhpcyB9KTtcbiAgICB0aGlzLmJpbmRNZXRob2RzKGNvbXBvbmVudCk7XG4gICAgKGhvc3QgYXMgYW55KS4ka2FzcGVySW5zdGFuY2UgPSBjb21wb25lbnQ7XG5cbiAgICBjb25zdCBjb21wb25lbnROb2RlcyA9IG5vZGVzO1xuICAgIGNvbXBvbmVudC4kcmVuZGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5pc1JlbmRlcmluZyA9IHRydWU7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmRlc3Ryb3koaG9zdCk7XG4gICAgICAgIGhvc3QuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBuZXcgU2NvcGUobnVsbCwgY29tcG9uZW50KTtcbiAgICAgICAgc2NvcGUuc2V0KFwiJGluc3RhbmNlXCIsIGNvbXBvbmVudCk7XG4gICAgICAgIGNvbnN0IHByZXYgPSB0aGlzLmludGVycHJldGVyLnNjb3BlO1xuICAgICAgICB0aGlzLmludGVycHJldGVyLnNjb3BlID0gc2NvcGU7XG5cbiAgICAgICAgZmx1c2hTeW5jKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNyZWF0ZVNpYmxpbmdzKGNvbXBvbmVudE5vZGVzLCBob3N0KTtcbiAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5vblJlbmRlciA9PT0gXCJmdW5jdGlvblwiKSBjb21wb25lbnQub25SZW5kZXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5pbnRlcnByZXRlci5zY29wZSA9IHByZXY7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmlzUmVuZGVyaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHNjb3BlID0gbmV3IFNjb3BlKG51bGwsIGNvbXBvbmVudCk7XG4gICAgc2NvcGUuc2V0KFwiJGluc3RhbmNlXCIsIGNvbXBvbmVudCk7XG4gICAgY29uc3QgcHJldiA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGU7XG4gICAgdGhpcy5pbnRlcnByZXRlci5zY29wZSA9IHNjb3BlO1xuXG4gICAgZmx1c2hTeW5jKCgpID0+IHtcbiAgICAgIHRoaXMuY3JlYXRlU2libGluZ3Mobm9kZXMsIGhvc3QpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5pbnRlcnByZXRlci5zY29wZSA9IHByZXY7XG5cbiAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5vbk1vdW50ID09PSBcImZ1bmN0aW9uXCIpIGNvbXBvbmVudC5vbk1vdW50KCk7XG4gICAgaWYgKHR5cGVvZiBjb21wb25lbnQub25SZW5kZXIgPT09IFwiZnVuY3Rpb25cIikgY29tcG9uZW50Lm9uUmVuZGVyKCk7XG4gIH1cblxuICBwdWJsaWMgZXh0cmFjdFJvdXRlcyhjaGlsZHJlbjogS05vZGUuS05vZGVbXSwgcGFyZW50R3VhcmQ/OiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+LCBzY29wZT86IFNjb3BlKTogUm91dGVDb25maWdbXSB7XG4gICAgY29uc3Qgcm91dGVzOiBSb3V0ZUNvbmZpZ1tdID0gW107XG4gICAgY29uc3QgcHJldlNjb3BlID0gc2NvcGUgPyB0aGlzLmludGVycHJldGVyLnNjb3BlIDogdW5kZWZpbmVkO1xuICAgIGlmIChzY29wZSkgdGhpcy5pbnRlcnByZXRlci5zY29wZSA9IHNjb3BlO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGlmIChjaGlsZC50eXBlICE9PSBcImVsZW1lbnRcIikgY29udGludWU7XG4gICAgICBjb25zdCBlbCA9IGNoaWxkIGFzIEtOb2RlLkVsZW1lbnQ7XG4gICAgICBpZiAoZWwubmFtZSA9PT0gXCJyb3V0ZVwiKSB7XG4gICAgICAgIGNvbnN0IHBhdGhBdHRyID0gdGhpcy5maW5kQXR0cihlbCwgW1wiQHBhdGhcIl0pO1xuICAgICAgICBjb25zdCBjb21wb25lbnRBdHRyID0gdGhpcy5maW5kQXR0cihlbCwgW1wiQGNvbXBvbmVudFwiXSk7XG4gICAgICAgIGNvbnN0IGd1YXJkQXR0ciA9IHRoaXMuZmluZEF0dHIoZWwsIFtcIkBndWFyZFwiXSk7XG5cbiAgICAgICAgaWYgKCFwYXRoQXR0ciB8fCAhY29tcG9uZW50QXR0cikge1xuICAgICAgICAgIHRoaXMuZXJyb3IoS0Vycm9yQ29kZS5NSVNTSU5HX1JFUVVJUkVEX0FUVFIsIHsgbWVzc2FnZTogXCI8cm91dGU+IHJlcXVpcmVzIEBwYXRoIGFuZCBAY29tcG9uZW50IGF0dHJpYnV0ZXMuXCIgfSwgZWwubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXRoID0gcGF0aEF0dHIhLnZhbHVlO1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmV4ZWN1dGUoY29tcG9uZW50QXR0ciEudmFsdWUpO1xuICAgICAgICBjb25zdCBndWFyZCA9IGd1YXJkQXR0ciA/IHRoaXMuZXhlY3V0ZShndWFyZEF0dHIudmFsdWUpIDogcGFyZW50R3VhcmQ7XG4gICAgICAgIHJvdXRlcy5wdXNoKHsgcGF0aDogcGF0aCwgY29tcG9uZW50OiBjb21wb25lbnQsIGd1YXJkOiBndWFyZCB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZWwubmFtZSA9PT0gXCJndWFyZFwiKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrQXR0ciA9IHRoaXMuZmluZEF0dHIoZWwsIFtcIkBjaGVja1wiXSk7XG4gICAgICAgIGlmICghY2hlY2tBdHRyKSB7XG4gICAgICAgICAgdGhpcy5lcnJvcihLRXJyb3JDb2RlLk1JU1NJTkdfUkVRVUlSRURfQVRUUiwgeyBtZXNzYWdlOiBcIjxndWFyZD4gcmVxdWlyZXMgQGNoZWNrIGF0dHJpYnV0ZS5cIiB9LCBlbC5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY2hlY2tBdHRyKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgY2hlY2sgPSB0aGlzLmV4ZWN1dGUoY2hlY2tBdHRyLnZhbHVlKTtcbiAgICAgICAgcm91dGVzLnB1c2goLi4udGhpcy5leHRyYWN0Um91dGVzKGVsLmNoaWxkcmVuLCBjaGVjaykpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2NvcGUpIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSBwcmV2U2NvcGU7XG4gICAgcmV0dXJuIHJvdXRlcztcbiAgfVxuXG4gIHByaXZhdGUgdHJpZ2dlclJlbmRlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1JlbmRlcmluZykgcmV0dXJuO1xuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5pbnRlcnByZXRlci5zY29wZS5nZXQoXCIkaW5zdGFuY2VcIik7XG4gICAgaWYgKGluc3RhbmNlICYmIHR5cGVvZiBpbnN0YW5jZS5vblJlbmRlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBpbnN0YW5jZS5vblJlbmRlcigpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB2aXNpdERvY3R5cGVLTm9kZShfbm9kZTogS05vZGUuRG9jdHlwZSk6IHZvaWQge1xuICAgIHJldHVybjtcbiAgICAvLyByZXR1cm4gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnRUeXBlKFwiaHRtbFwiLCBcIlwiLCBcIlwiKTtcbiAgfVxuXG4gIHB1YmxpYyBlcnJvcihjb2RlOiBLRXJyb3JDb2RlVHlwZSwgYXJnczogYW55LCB0YWdOYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IGZpbmFsQXJncyA9IGFyZ3M7XG4gICAgaWYgKHR5cGVvZiBhcmdzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCBjbGVhbk1lc3NhZ2UgPSBhcmdzLmluY2x1ZGVzKFwiUnVudGltZSBFcnJvclwiKVxuICAgICAgICA/IGFyZ3MucmVwbGFjZShcIlJ1bnRpbWUgRXJyb3I6IFwiLCBcIlwiKVxuICAgICAgICA6IGFyZ3M7XG4gICAgICBmaW5hbEFyZ3MgPSB7IG1lc3NhZ2U6IGNsZWFuTWVzc2FnZSB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBLYXNwZXJFcnJvcihjb2RlLCBmaW5hbEFyZ3MsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0YWdOYW1lKTtcbiAgfVxuXG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnRDbGFzcywgQ29tcG9uZW50UmVnaXN0cnkgfSBmcm9tIFwiLi9jb21wb25lbnRcIjtcbmltcG9ydCB7IFRlbXBsYXRlUGFyc2VyIH0gZnJvbSBcIi4vdGVtcGxhdGUtcGFyc2VyXCI7XG5pbXBvcnQgeyBUcmFuc3BpbGVyIH0gZnJvbSBcIi4vdHJhbnNwaWxlclwiO1xuaW1wb3J0IHsgS2FzcGVyRXJyb3IsIEtFcnJvckNvZGUgfSBmcm9tIFwiLi90eXBlcy9lcnJvclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gbGF6eShcbiAgaW1wb3J0ZXI6ICgpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgQ29tcG9uZW50Q2xhc3M+PlxuKTogeyBjb21wb25lbnQ6ICgpID0+IFByb21pc2U8Q29tcG9uZW50Q2xhc3M+OyBsYXp5OiB0cnVlIH0ge1xuICByZXR1cm4ge1xuICAgIGxhenk6IHRydWUsXG4gICAgY29tcG9uZW50OiAoKSA9PiBpbXBvcnRlcigpLnRoZW4oKG0pID0+IE9iamVjdC52YWx1ZXMobSlbMF0pLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZShzb3VyY2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnNlciA9IG5ldyBUZW1wbGF0ZVBhcnNlcigpO1xuICB0cnkge1xuICAgIGNvbnN0IG5vZGVzID0gcGFyc2VyLnBhcnNlKHNvdXJjZSk7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG5vZGVzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShbZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpXSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcGlsZShcbiAgc291cmNlOiBzdHJpbmcsXG4gIGVudGl0eT86IHsgW2tleTogc3RyaW5nXTogYW55IH0sXG4gIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50LFxuICByZWdpc3RyeT86IENvbXBvbmVudFJlZ2lzdHJ5XG4pOiBOb2RlIHtcbiAgY29uc3QgcGFyc2VyID0gbmV3IFRlbXBsYXRlUGFyc2VyKCk7XG4gIGNvbnN0IG5vZGVzID0gcGFyc2VyLnBhcnNlKHNvdXJjZSk7XG4gIGNvbnN0IHRyYW5zcGlsZXIgPSBuZXcgVHJhbnNwaWxlcih7IHJlZ2lzdHJ5OiByZWdpc3RyeSB8fCB7fSB9KTtcbiAgY29uc3QgcmVzdWx0ID0gdHJhbnNwaWxlci50cmFuc3BpbGUobm9kZXMsIGVudGl0eSB8fCB7fSwgY29udGFpbmVyKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBLYXNwZXJDb25maWcge1xuICByb290Pzogc3RyaW5nIHwgSFRNTEVsZW1lbnQ7XG4gIGVudHJ5Pzogc3RyaW5nO1xuICByZWdpc3RyeTogQ29tcG9uZW50UmVnaXN0cnk7XG4gIG1vZGU/OiBcImRldmVsb3BtZW50XCIgfCBcInByb2R1Y3Rpb25cIjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50KHRyYW5zcGlsZXI6IFRyYW5zcGlsZXIsIHRhZzogc3RyaW5nKSB7XG4gIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG4gIGNvbnN0IGNvbXBvbmVudCA9IG5ldyAodHJhbnNwaWxlci5yZWdpc3RyeVt0YWddLmNvbXBvbmVudCBhcyBDb21wb25lbnRDbGFzcykoe1xuICAgIHJlZjogZWxlbWVudCxcbiAgICB0cmFuc3BpbGVyOiB0cmFuc3BpbGVyLFxuICAgIGFyZ3M6IHt9LFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIG5vZGU6IGVsZW1lbnQsXG4gICAgaW5zdGFuY2U6IGNvbXBvbmVudCxcbiAgICBub2RlczogdHJhbnNwaWxlci5yZXNvbHZlTm9kZXModGFnKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJvb3RzdHJhcChjb25maWc6IEthc3BlckNvbmZpZykge1xuICBjb25zdCByb290ID1cbiAgICB0eXBlb2YgY29uZmlnLnJvb3QgPT09IFwic3RyaW5nXCJcbiAgICAgID8gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjb25maWcucm9vdClcbiAgICAgIDogY29uZmlnLnJvb3Q7XG5cbiAgaWYgKCFyb290KSB7XG4gICAgdGhyb3cgbmV3IEthc3BlckVycm9yKFxuICAgICAgS0Vycm9yQ29kZS5ST09UX0VMRU1FTlRfTk9UX0ZPVU5ELFxuICAgICAgeyByb290OiBjb25maWcucm9vdCB9XG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGVudHJ5VGFnID0gY29uZmlnLmVudHJ5IHx8IFwia2FzcGVyLWFwcFwiO1xuICBpZiAoIWNvbmZpZy5yZWdpc3RyeVtlbnRyeVRhZ10pIHtcbiAgICB0aHJvdyBuZXcgS2FzcGVyRXJyb3IoXG4gICAgICBLRXJyb3JDb2RlLkVOVFJZX0NPTVBPTkVOVF9OT1RfRk9VTkQsXG4gICAgICB7IHRhZzogZW50cnlUYWcgfVxuICAgICk7XG4gIH1cblxuICBjb25zdCB0cmFuc3BpbGVyID0gbmV3IFRyYW5zcGlsZXIoeyByZWdpc3RyeTogY29uZmlnLnJlZ2lzdHJ5IH0pO1xuXG4gIGlmIChjb25maWcubW9kZSkge1xuICAgIHRyYW5zcGlsZXIubW9kZSA9IGNvbmZpZy5tb2RlO1xuICB9XG5cbiAgY29uc3QgeyBub2RlLCBpbnN0YW5jZSwgbm9kZXMgfSA9IGNyZWF0ZUNvbXBvbmVudCh0cmFuc3BpbGVyLCBlbnRyeVRhZyk7XG5cbiAgcm9vdC5pbm5lckhUTUwgPSBcIlwiO1xuICByb290LmFwcGVuZENoaWxkKG5vZGUpO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2Uub25Nb3VudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgaW5zdGFuY2Uub25Nb3VudCgpO1xuICB9XG5cbiAgdHJhbnNwaWxlci50cmFuc3BpbGUobm9kZXMsIGluc3RhbmNlLCBub2RlIGFzIEhUTUxFbGVtZW50KTtcblxuICBpZiAodHlwZW9mIGluc3RhbmNlLm9uUmVuZGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBpbnN0YW5jZS5vblJlbmRlcigpO1xuICB9XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuIl0sIm5hbWVzIjpbInJhd0VmZmVjdCIsInJhd0NvbXB1dGVkIiwiU2V0IiwiVG9rZW5UeXBlIiwiRXhwci5FYWNoIiwiRXhwci5WYXJpYWJsZSIsIkV4cHIuQmluYXJ5IiwiRXhwci5Bc3NpZ24iLCJFeHByLkdldCIsIkV4cHIuU2V0IiwiRXhwci5QaXBlbGluZSIsIkV4cHIuVGVybmFyeSIsIkV4cHIuTnVsbENvYWxlc2NpbmciLCJFeHByLkxvZ2ljYWwiLCJFeHByLlR5cGVvZiIsIkV4cHIuVW5hcnkiLCJFeHByLkNhbGwiLCJFeHByLk5ldyIsIkV4cHIuUG9zdGZpeCIsIkV4cHIuU3ByZWFkIiwiRXhwci5LZXkiLCJFeHByLkxpdGVyYWwiLCJFeHByLlRlbXBsYXRlIiwiRXhwci5BcnJvd0Z1bmN0aW9uIiwiRXhwci5Hcm91cGluZyIsIkV4cHIuVm9pZCIsIkV4cHIuRGVidWciLCJFeHByLkRpY3Rpb25hcnkiLCJFeHByLkxpc3QiLCJVdGlscy5pc0RpZ2l0IiwiVXRpbHMuaXNBbHBoYU51bWVyaWMiLCJVdGlscy5jYXBpdGFsaXplIiwiVXRpbHMuaXNLZXl3b3JkIiwiVXRpbHMuaXNBbHBoYSIsIlBhcnNlciIsIk5vZGUuRG9jdHlwZSIsIk5vZGUuRWxlbWVudCIsIk5vZGUuQXR0cmlidXRlIiwiTm9kZS5UZXh0IiwiQ29tcG9uZW50Q2xhc3MiLCJzY29wZSIsInBhcmVudCIsInByZXYiXSwibWFwcGluZ3MiOiJBQUFPLE1BQU0sYUFBYTtBQUFBO0FBQUEsRUFFeEIsd0JBQXdCO0FBQUEsRUFDeEIsMkJBQTJCO0FBQUE7QUFBQSxFQUczQixzQkFBc0I7QUFBQSxFQUN0QixxQkFBcUI7QUFBQSxFQUNyQixzQkFBc0I7QUFBQTtBQUFBLEVBR3RCLGdCQUFn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LElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsY0FBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLFlBQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxXQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsT0FBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLE1BQUEsSUFBQSxFQUFBLElBQUE7QUFHQUEsYUFBQUEsV0FBQSxPQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsTUFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLFdBQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxnQkFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLE9BQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxPQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsWUFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLGlCQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsU0FBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLGNBQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxNQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsV0FBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLE9BQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxZQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsWUFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLGNBQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxNQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsV0FBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLFVBQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxVQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsYUFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLGtCQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsWUFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLFdBQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxRQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsV0FBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLGtCQUFBLElBQUEsRUFBQSxJQUFBO0FBR0FBLGFBQUFBLFdBQUEsWUFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLFVBQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxRQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsUUFBQSxJQUFBLEVBQUEsSUFBQTtBQUdBQSxhQUFBQSxXQUFBLFdBQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxZQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsVUFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLE9BQUEsSUFBQSxFQUFBLElBQUE7QUFHQUEsYUFBQUEsV0FBQSxLQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsT0FBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLE9BQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxPQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsSUFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLFlBQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxLQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsTUFBQSxJQUFBLEVBQUEsSUFBQTtBQUNB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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2FzcGVyLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMvZXJyb3IudHMiLCIuLi9zcmMvZXJyb3ItaGFuZGxlci50cyIsIi4uL3NyYy9zaWduYWwudHMiLCIuLi9zcmMvY29tcG9uZW50LnRzIiwiLi4vc3JjL3R5cGVzL2V4cHJlc3Npb25zLnRzIiwiLi4vc3JjL3R5cGVzL3Rva2VuLnRzIiwiLi4vc3JjL2V4cHJlc3Npb24tcGFyc2VyLnRzIiwiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL3NjYW5uZXIudHMiLCIuLi9zcmMvc2NvcGUudHMiLCIuLi9zcmMvaW50ZXJwcmV0ZXIudHMiLCIuLi9zcmMvdHlwZXMvbm9kZXMudHMiLCIuLi9zcmMvdGVtcGxhdGUtcGFyc2VyLnRzIiwiLi4vc3JjL3JvdXRlci50cyIsIi4uL3NyYy9ib3VuZGFyeS50cyIsIi4uL3NyYy9zY2hlZHVsZXIudHMiLCIuLi9zcmMvdHJhbnNwaWxlci50cyIsIi4uL3NyYy9rYXNwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IEtFcnJvckNvZGUgPSB7XG4gIC8vIEJvb3RzdHJhcFxuICBST09UX0VMRU1FTlRfTk9UX0ZPVU5EOiBcIkswMDEtMVwiLFxuICBFTlRSWV9DT01QT05FTlRfTk9UX0ZPVU5EOiBcIkswMDEtMlwiLFxuXG4gIC8vIFNjYW5uZXJcbiAgVU5URVJNSU5BVEVEX0NPTU1FTlQ6IFwiSzAwMi0xXCIsXG4gIFVOVEVSTUlOQVRFRF9TVFJJTkc6IFwiSzAwMi0yXCIsXG4gIFVORVhQRUNURURfQ0hBUkFDVEVSOiBcIkswMDItM1wiLFxuXG4gIC8vIFRlbXBsYXRlIFBhcnNlclxuICBVTkVYUEVDVEVEX0VPRjogXCJLMDAzLTFcIixcbiAgVU5FWFBFQ1RFRF9DTE9TSU5HX1RBRzogXCJLMDAzLTJcIixcbiAgRVhQRUNURURfVEFHX05BTUU6IFwiSzAwMy0zXCIsXG4gIEVYUEVDVEVEX0NMT1NJTkdfQlJBQ0tFVDogXCJLMDAzLTRcIixcbiAgRVhQRUNURURfQ0xPU0lOR19UQUc6IFwiSzAwMy01XCIsXG4gIEJMQU5LX0FUVFJJQlVURV9OQU1FOiBcIkswMDMtNlwiLFxuICBNSVNQTEFDRURfQ09ORElUSU9OQUw6IFwiSzAwMy03XCIsXG4gIERVUExJQ0FURV9JRjogXCJLMDAzLThcIixcbiAgTVVMVElQTEVfU1RSVUNUVVJBTF9ESVJFQ1RJVkVTOiBcIkswMDMtOVwiLFxuXG4gIC8vIEV4cHJlc3Npb24gUGFyc2VyXG4gIFVORVhQRUNURURfVE9LRU46IFwiSzAwNC0xXCIsXG4gIElOVkFMSURfTFZBTFVFOiBcIkswMDQtMlwiLFxuICBFWFBFQ1RFRF9FWFBSRVNTSU9OOiBcIkswMDQtM1wiLFxuICBJTlZBTElEX0RJQ1RJT05BUllfS0VZOiBcIkswMDQtNFwiLFxuXG4gIC8vIEludGVycHJldGVyXG4gIElOVkFMSURfUE9TVEZJWF9MVkFMVUU6IFwiSzAwNS0xXCIsXG4gIFVOS05PV05fQklOQVJZX09QRVJBVE9SOiBcIkswMDUtMlwiLFxuICBJTlZBTElEX1BSRUZJWF9SVkFMVUU6IFwiSzAwNS0zXCIsXG4gIFVOS05PV05fVU5BUllfT1BFUkFUT1I6IFwiSzAwNS00XCIsXG4gIE5PVF9BX0ZVTkNUSU9OOiBcIkswMDUtNVwiLFxuICBOT1RfQV9DTEFTUzogXCJLMDA1LTZcIixcblxuICAvLyBTaWduYWxzXG4gIENJUkNVTEFSX0NPTVBVVEVEOiBcIkswMDYtMVwiLFxuXG4gIC8vIFRyYW5zcGlsZXJcbiAgUlVOVElNRV9FUlJPUjogXCJLMDA3LTFcIixcbiAgTUlTU0lOR19SRVFVSVJFRF9BVFRSOiBcIkswMDctMlwiLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgS0Vycm9yQ29kZVR5cGUgPSAodHlwZW9mIEtFcnJvckNvZGUpW2tleW9mIHR5cGVvZiBLRXJyb3JDb2RlXTtcblxuZXhwb3J0IGNvbnN0IEVycm9yVGVtcGxhdGVzOiBSZWNvcmQ8c3RyaW5nLCAoYXJnczogYW55KSA9PiBzdHJpbmc+ID0ge1xuICBcIkswMDEtMVwiOiAoYSkgPT4gYFJvb3QgZWxlbWVudCBub3QgZm91bmQ6ICR7YS5yb290fWAsXG4gIFwiSzAwMS0yXCI6IChhKSA9PiBgRW50cnkgY29tcG9uZW50IDwke2EudGFnfT4gbm90IGZvdW5kIGluIHJlZ2lzdHJ5LmAsXG5cbiAgXCJLMDAyLTFcIjogKCkgPT4gJ1VudGVybWluYXRlZCBjb21tZW50LCBleHBlY3RpbmcgY2xvc2luZyBcIiovXCInLFxuICBcIkswMDItMlwiOiAoYSkgPT4gYFVudGVybWluYXRlZCBzdHJpbmcsIGV4cGVjdGluZyBjbG9zaW5nICR7YS5xdW90ZX1gLFxuICBcIkswMDItM1wiOiAoYSkgPT4gYFVuZXhwZWN0ZWQgY2hhcmFjdGVyICcke2EuY2hhcn0nYCxcblxuICBcIkswMDMtMVwiOiAoYSkgPT4gYFVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuICR7YS5lb2ZFcnJvcn1gLFxuICBcIkswMDMtMlwiOiAoKSA9PiBcIlVuZXhwZWN0ZWQgY2xvc2luZyB0YWdcIixcbiAgXCJLMDAzLTNcIjogKCkgPT4gXCJFeHBlY3RlZCBhIHRhZyBuYW1lXCIsXG4gIFwiSzAwMy00XCI6ICgpID0+IFwiRXhwZWN0ZWQgY2xvc2luZyB0YWcgPlwiLFxuICBcIkswMDMtNVwiOiAoYSkgPT4gYEV4cGVjdGVkIDwvJHthLm5hbWV9PmAsXG4gIFwiSzAwMy02XCI6ICgpID0+IFwiQmxhbmsgYXR0cmlidXRlIG5hbWVcIixcbiAgXCJLMDAzLTdcIjogKGEpID0+IGBAJHthLm5hbWV9IG11c3QgYmUgcHJlY2VkZWQgYnkgYW4gQGlmIG9yIEBlbHNlaWYgYmxvY2suYCxcbiAgXCJLMDAzLThcIjogKCkgPT4gXCJNdWx0aXBsZSBjb25kaXRpb25hbCBkaXJlY3RpdmVzIChAaWYsIEBlbHNlaWYsIEBlbHNlKSBvbiB0aGUgc2FtZSBlbGVtZW50IGFyZSBub3QgYWxsb3dlZC5cIixcbiAgXCJLMDAzLTlcIjogKCkgPT4gXCJNdWx0aXBsZSBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZXMgKEBpZiwgQGVhY2gpIG9uIHRoZSBzYW1lIGVsZW1lbnQgYXJlIG5vdCBhbGxvd2VkLiBOZXN0IHRoZW0gb3IgdXNlIDx2b2lkPiBpbnN0ZWFkLlwiLFxuXG4gIFwiSzAwNC0xXCI6IChhKSA9PiBgJHthLm1lc3NhZ2V9LCB1bmV4cGVjdGVkIHRva2VuIFwiJHthLnRva2VufVwiYCxcbiAgXCJLMDA0LTJcIjogKCkgPT4gXCJJbnZhbGlkIGwtdmFsdWUsIGlzIG5vdCBhbiBhc3NpZ25pbmcgdGFyZ2V0LlwiLFxuICBcIkswMDQtM1wiOiAoYSkgPT4gYEV4cGVjdGVkIGV4cHJlc3Npb24sIHVuZXhwZWN0ZWQgdG9rZW4gXCIke2EudG9rZW59XCJgLFxuICBcIkswMDQtNFwiOiAoYSkgPT4gYFN0cmluZywgTnVtYmVyIG9yIElkZW50aWZpZXIgZXhwZWN0ZWQgYXMgYSBLZXkgb2YgRGljdGlvbmFyeSB7LCB1bmV4cGVjdGVkIHRva2VuICR7YS50b2tlbn1gLFxuXG4gIFwiSzAwNS0xXCI6IChhKSA9PiBgSW52YWxpZCBsZWZ0LWhhbmQgc2lkZSBpbiBwb3N0Zml4IG9wZXJhdGlvbjogJHthLmVudGl0eX1gLFxuICBcIkswMDUtMlwiOiAoYSkgPT4gYFVua25vd24gYmluYXJ5IG9wZXJhdG9yICR7YS5vcGVyYXRvcn1gLFxuICBcIkswMDUtM1wiOiAoYSkgPT4gYEludmFsaWQgcmlnaHQtaGFuZCBzaWRlIGV4cHJlc3Npb24gaW4gcHJlZml4IG9wZXJhdGlvbjogJHthLnJpZ2h0fWAsXG4gIFwiSzAwNS00XCI6IChhKSA9PiBgVW5rbm93biB1bmFyeSBvcGVyYXRvciAke2Eub3BlcmF0b3J9YCxcbiAgXCJLMDA1LTVcIjogKGEpID0+IGAke2EuY2FsbGVlfSBpcyBub3QgYSBmdW5jdGlvbmAsXG4gIFwiSzAwNS02XCI6IChhKSA9PiBgJyR7YS5jbGF6en0nIGlzIG5vdCBhIGNsYXNzLiAnbmV3JyBzdGF0ZW1lbnQgbXVzdCBiZSB1c2VkIHdpdGggY2xhc3Nlcy5gLFxuXG4gIFwiSzAwNi0xXCI6ICgpID0+IFwiQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZCBpbiBjb21wdXRlZCBzaWduYWxcIixcblxuICBcIkswMDctMVwiOiAoYSkgPT4gYS5tZXNzYWdlLFxuICBcIkswMDctMlwiOiAoYSkgPT4gYS5tZXNzYWdlLFxufTtcblxuZnVuY3Rpb24gY29kZVNuaXBwZXQoc291cmNlOiBzdHJpbmcsIGxpbmU6IG51bWJlciwgY29sOiBudW1iZXIsIGNvbnRleHQgPSAyKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXMgPSBzb3VyY2Uuc3BsaXQoXCJcXG5cIik7XG4gIGNvbnN0IGVycm9yTGluZSA9IGxpbmUgLSAxOyAvLyAwLWluZGV4ZWRcbiAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCgwLCBlcnJvckxpbmUgLSBjb250ZXh0KTtcbiAgY29uc3QgZW5kID0gTWF0aC5taW4obGluZXMubGVuZ3RoIC0gMSwgZXJyb3JMaW5lICsgY29udGV4dCk7XG5cbiAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtcIlwiXTtcbiAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgY29uc3QgaW5kaWNhdG9yID0gaSA9PT0gZXJyb3JMaW5lID8gXCI+XCIgOiBcIiBcIjtcbiAgICByZXN1bHQucHVzaChgICAke2luZGljYXRvcn0gfCAke2xpbmVzW2ldfWApO1xuICAgIGlmIChpID09PSBlcnJvckxpbmUgJiYgY29sID4gMCkge1xuICAgICAgLy8gcHJlZml4OiBcIiAgPiB8IFwiICg2KSArIChjb2wgLSAxKSBzcGFjZXNcbiAgICAgIGNvbnN0IHBvaW50ZXIgPSBcIiBcIi5yZXBlYXQoNiArIGNvbCAtIDEpICsgXCJeXCI7XG4gICAgICByZXN1bHQucHVzaChwb2ludGVyKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5qb2luKFwiXFxuXCIpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEthc3BlckVycm9yT3B0aW9ucyB7XG4gIGxpbmU/OiBudW1iZXI7XG4gIGNvbD86IG51bWJlcjtcbiAgdGFnPzogc3RyaW5nO1xuICBzb3VyY2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBLYXNwZXJFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIGxpbmU/OiBudW1iZXI7XG4gIHB1YmxpYyBjb2w/OiBudW1iZXI7XG4gIHB1YmxpYyB0YWdOYW1lPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb2RlOiBLRXJyb3JDb2RlVHlwZSxcbiAgICBwdWJsaWMgYXJnczogYW55ID0ge30sXG4gICAgb3B0aW9uczogS2FzcGVyRXJyb3JPcHRpb25zID0ge31cbiAgKSB7XG4gICAgY29uc3QgeyBsaW5lLCBjb2wsIHRhZywgc291cmNlIH0gPSBvcHRpb25zO1xuXG4gICAgLy8gRGV0ZWN0IGVudmlyb25tZW50XG4gICAgY29uc3QgaXNEZXYgPVxuICAgICAgdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCJcbiAgICAgICAgOiAoaW1wb3J0Lm1ldGEgYXMgYW55KS5lbnY/Lk1PREUgIT09IFwicHJvZHVjdGlvblwiO1xuXG4gICAgY29uc3QgdGVtcGxhdGUgPSBFcnJvclRlbXBsYXRlc1tjb2RlXTtcbiAgICBjb25zdCBtZXNzYWdlID0gdGVtcGxhdGVcbiAgICAgID8gdGVtcGxhdGUoYXJncylcbiAgICAgIDogKHR5cGVvZiBhcmdzID09PSAnc3RyaW5nJyA/IGFyZ3MgOiBcIlVua25vd24gZXJyb3JcIik7XG5cbiAgICBjb25zdCB0YWdJbmZvID0gdGFnID8gYFxcbiAgYXQgPCR7dGFnfT5gIDogXCJcIjtcbiAgICBjb25zdCBzbmlwcGV0ID0gbGluZSAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZSA/IGNvZGVTbmlwcGV0KHNvdXJjZSwgbGluZSwgY29sID8/IDApIDogXCJcIjtcbiAgICBjb25zdCBsaW5rID0gaXNEZXZcbiAgICAgID8gYFxcblNlZTogaHR0cHM6Ly9rYXNwZXJqcy50b3AvcmVmZXJlbmNlL2Vycm9ycyMke2NvZGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKFwiLlwiLCBcIlwiKX1cXG5gXG4gICAgICA6IFwiXCI7XG5cbiAgICBzdXBlcihgWyR7Y29kZX1dICR7bWVzc2FnZX0ke3RhZ0luZm99JHtzbmlwcGV0fSR7bGlua31gKTtcbiAgICB0aGlzLm5hbWUgPSBcIkthc3BlckVycm9yXCI7XG4gICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB0aGlzLmNvbCA9IGNvbDtcbiAgICB0aGlzLnRhZ05hbWUgPSB0YWc7XG4gIH1cblxuICBwdWJsaWMgd2l0aFRhZyh0YWdOYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAoIXRoaXMudGFnTmFtZSkge1xuICAgICAgdGhpcy50YWdOYW1lID0gdGFnTmFtZTtcbiAgICAgIHRoaXMubWVzc2FnZSArPSBgXFxuICBhdCA8JHt0YWdOYW1lfT5gO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIiwiZXhwb3J0IHR5cGUgRXJyb3JQaGFzZSA9ICdyZW5kZXInIHwgJ3dhdGNoZXInO1xuXG5leHBvcnQgdHlwZSBFcnJvckhhbmRsZXJGbiA9IChcbiAgZXJyb3I6IEVycm9yLFxuICBjb250ZXh0OiB7IGNvbXBvbmVudD86IGFueTsgcGhhc2U6IEVycm9yUGhhc2UgfVxuKSA9PiB2b2lkO1xuXG5sZXQgZ2xvYmFsSGFuZGxlcjogRXJyb3JIYW5kbGVyRm4gfCBudWxsID0gbnVsbDtcblxuZXhwb3J0IGZ1bmN0aW9uIHNldEVycm9ySGFuZGxlcihoYW5kbGVyOiBFcnJvckhhbmRsZXJGbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBnbG9iYWxIYW5kbGVyID0gaGFuZGxlciA/PyBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXJyb3IoZXJyb3I6IHVua25vd24sIHBoYXNlOiBFcnJvclBoYXNlLCBjb21wb25lbnQ/OiBhbnkpOiB2b2lkIHtcbiAgY29uc3QgZXJyID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xuXG4gIC8vIFRyeSBjb21wb25lbnQtbGV2ZWwgb25FcnJvciBmaXJzdFxuICBpZiAoY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQub25FcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBjb21wb25lbnQub25FcnJvcihlcnIsIHBoYXNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBvbkVycm9yIGl0c2VsZiB0aHJldyDigJQgZmFsbCB0aHJvdWdoIHdpdGggb3JpZ2luYWwgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvLyBUcnkgZ2xvYmFsIGhhbmRsZXJcbiAgaWYgKGdsb2JhbEhhbmRsZXIpIHtcbiAgICB0cnkge1xuICAgICAgZ2xvYmFsSGFuZGxlcihlcnIsIHsgY29tcG9uZW50LCBwaGFzZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChfKSB7fVxuICB9XG5cbiAgLy8gRmluYWwgZmFsbGJhY2tcbiAgY29uc29sZS5lcnJvcihgW0thc3Blcl0gRXJyb3IgZHVyaW5nICR7cGhhc2V9OmAsIGVycik7XG59XG4iLCJpbXBvcnQgeyBLYXNwZXJFcnJvciwgS0Vycm9yQ29kZSB9IGZyb20gXCIuL3R5cGVzL2Vycm9yXCI7XG5cbnR5cGUgTGlzdGVuZXIgPSAoKSA9PiB2b2lkO1xuXG5pbXBvcnQgeyBoYW5kbGVFcnJvciB9IGZyb20gXCIuL2Vycm9yLWhhbmRsZXJcIjtcblxubGV0IGFjdGl2ZUVmZmVjdDogeyBmbjogTGlzdGVuZXI7IGRlcHM6IFNldDxhbnk+IH0gfCBudWxsID0gbnVsbDtcbmNvbnN0IGVmZmVjdFN0YWNrOiBhbnlbXSA9IFtdO1xuXG5sZXQgYmF0Y2hpbmcgPSBmYWxzZTtcbmNvbnN0IHBlbmRpbmdTdWJzY3JpYmVycyA9IG5ldyBTZXQ8TGlzdGVuZXI+KCk7XG5jb25zdCBwZW5kaW5nV2F0Y2hlcnM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cbnR5cGUgV2F0Y2hlcjxUPiA9IChuZXdWYWx1ZTogVCwgb2xkVmFsdWU6IFQpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsT3B0aW9ucyB7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG5leHBvcnQgY2xhc3MgU2lnbmFsPFQ+IHtcbiAgcHJvdGVjdGVkIF92YWx1ZTogVDtcbiAgcHJpdmF0ZSBzdWJzY3JpYmVycyA9IG5ldyBTZXQ8TGlzdGVuZXI+KCk7XG4gIHByaXZhdGUgd2F0Y2hlcnMgPSBuZXcgU2V0PFdhdGNoZXI8VD4+KCk7XG5cbiAgY29uc3RydWN0b3IoaW5pdGlhbFZhbHVlOiBUKSB7XG4gICAgdGhpcy5fdmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogVCB7XG4gICAgaWYgKGFjdGl2ZUVmZmVjdCkge1xuICAgICAgdGhpcy5zdWJzY3JpYmVycy5hZGQoYWN0aXZlRWZmZWN0LmZuKTtcbiAgICAgIGFjdGl2ZUVmZmVjdC5kZXBzLmFkZCh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgc2V0IHZhbHVlKG5ld1ZhbHVlOiBUKSB7XG4gICAgaWYgKHRoaXMuX3ZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl92YWx1ZTtcbiAgICAgIHRoaXMuX3ZhbHVlID0gbmV3VmFsdWU7XG4gICAgICBpZiAoYmF0Y2hpbmcpIHtcbiAgICAgICAgZm9yIChjb25zdCBzdWIgb2YgdGhpcy5zdWJzY3JpYmVycykgcGVuZGluZ1N1YnNjcmliZXJzLmFkZChzdWIpO1xuICAgICAgICBmb3IgKGNvbnN0IHdhdGNoZXIgb2YgdGhpcy53YXRjaGVycykgcGVuZGluZ1dhdGNoZXJzLnB1c2goKCkgPT4gd2F0Y2hlcihuZXdWYWx1ZSwgb2xkVmFsdWUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN1YnMgPSBBcnJheS5mcm9tKHRoaXMuc3Vic2NyaWJlcnMpO1xuICAgICAgICBmb3IgKGNvbnN0IHN1YiBvZiBzdWJzKSB7XG4gICAgICAgICAgc3ViKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB3YXRjaGVyIG9mIHRoaXMud2F0Y2hlcnMpIHtcbiAgICAgICAgICB0cnkgeyB3YXRjaGVyKG5ld1ZhbHVlLCBvbGRWYWx1ZSk7IH0gY2F0Y2ggKGUpIHsgaGFuZGxlRXJyb3IoZSwgJ3dhdGNoZXInKTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25DaGFuZ2UoZm46IFdhdGNoZXI8VD4sIG9wdGlvbnM/OiBTaWduYWxPcHRpb25zKTogKCkgPT4gdm9pZCB7XG4gICAgaWYgKG9wdGlvbnM/LnNpZ25hbD8uYWJvcnRlZCkgcmV0dXJuICgpID0+IHt9O1xuICAgIHRoaXMud2F0Y2hlcnMuYWRkKGZuKTtcbiAgICBjb25zdCBzdG9wID0gKCkgPT4gdGhpcy53YXRjaGVycy5kZWxldGUoZm4pO1xuICAgIGlmIChvcHRpb25zPy5zaWduYWwpIHtcbiAgICAgIG9wdGlvbnMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBzdG9wLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiBzdG9wO1xuICB9XG5cbiAgdW5zdWJzY3JpYmUoZm46IExpc3RlbmVyKSB7XG4gICAgdGhpcy5zdWJzY3JpYmVycy5kZWxldGUoZm4pO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7IHJldHVybiBTdHJpbmcodGhpcy52YWx1ZSk7IH1cbiAgcGVlaygpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9XG59XG5cbmNsYXNzIENvbXB1dGVkU2lnbmFsPFQ+IGV4dGVuZHMgU2lnbmFsPFQ+IHtcbiAgcHJpdmF0ZSBmbjogKCkgPT4gVDtcbiAgcHJpdmF0ZSBjb21wdXRpbmcgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihmbjogKCkgPT4gVCwgb3B0aW9ucz86IFNpZ25hbE9wdGlvbnMpIHtcbiAgICBzdXBlcih1bmRlZmluZWQgYXMgYW55KTtcbiAgICB0aGlzLmZuID0gZm47XG5cbiAgICBjb25zdCBzdG9wID0gZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNvbXB1dGluZykge1xuICAgICAgICB0aHJvdyBuZXcgS2FzcGVyRXJyb3IoS0Vycm9yQ29kZS5DSVJDVUxBUl9DT01QVVRFRCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29tcHV0aW5nID0gdHJ1ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEVhZ2VybHkgdXBkYXRlIHRoZSB2YWx1ZSBzbyBzdWJzY3JpYmVycyBhcmUgbm90aWZpZWQgaW1tZWRpYXRlbHlcbiAgICAgICAgc3VwZXIudmFsdWUgPSB0aGlzLmZuKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmNvbXB1dGluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgaWYgKG9wdGlvbnM/LnNpZ25hbCkge1xuICAgICAgb3B0aW9ucy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIHN0b3AsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICBnZXQgdmFsdWUoKTogVCB7XG4gICAgcmV0dXJuIHN1cGVyLnZhbHVlO1xuICB9XG5cbiAgc2V0IHZhbHVlKF92OiBUKSB7XG4gICAgLy8gQ29tcHV0ZWQgc2lnbmFscyBhcmUgcmVhZC1vbmx5IGZyb20gb3V0c2lkZVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlZmZlY3QoZm46IExpc3RlbmVyLCBvcHRpb25zPzogU2lnbmFsT3B0aW9ucykge1xuICBpZiAob3B0aW9ucz8uc2lnbmFsPy5hYm9ydGVkKSByZXR1cm4gKCkgPT4ge307XG4gIGNvbnN0IGVmZmVjdE9iaiA9IHtcbiAgICBmbjogKCkgPT4ge1xuICAgICAgZWZmZWN0T2JqLmRlcHMuZm9yRWFjaChzaWcgPT4gc2lnLnVuc3Vic2NyaWJlKGVmZmVjdE9iai5mbikpO1xuICAgICAgZWZmZWN0T2JqLmRlcHMuY2xlYXIoKTtcblxuICAgICAgZWZmZWN0U3RhY2sucHVzaChlZmZlY3RPYmopO1xuICAgICAgYWN0aXZlRWZmZWN0ID0gZWZmZWN0T2JqO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGVmZmVjdFN0YWNrLnBvcCgpO1xuICAgICAgICBhY3RpdmVFZmZlY3QgPSBlZmZlY3RTdGFja1tlZmZlY3RTdGFjay5sZW5ndGggLSAxXSB8fCBudWxsO1xuICAgICAgfVxuICAgIH0sXG4gICAgZGVwczogbmV3IFNldDxTaWduYWw8YW55Pj4oKVxuICB9O1xuXG4gIGVmZmVjdE9iai5mbigpO1xuICBjb25zdCBzdG9wOiBhbnkgPSAoKSA9PiB7XG4gICAgZWZmZWN0T2JqLmRlcHMuZm9yRWFjaChzaWcgPT4gc2lnLnVuc3Vic2NyaWJlKGVmZmVjdE9iai5mbikpO1xuICAgIGVmZmVjdE9iai5kZXBzLmNsZWFyKCk7XG4gIH07XG4gIHN0b3AucnVuID0gZWZmZWN0T2JqLmZuO1xuXG4gIGlmIChvcHRpb25zPy5zaWduYWwpIHtcbiAgICBvcHRpb25zLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgc3RvcCwgeyBvbmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgcmV0dXJuIHN0b3AgYXMgKCgpID0+IHZvaWQpICYgeyBydW46ICgpID0+IHZvaWQgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbDxUPihpbml0aWFsVmFsdWU6IFQpOiBTaWduYWw8VD4ge1xuICByZXR1cm4gbmV3IFNpZ25hbChpbml0aWFsVmFsdWUpO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uYWwgYWxpYXMgZm9yIFNpZ25hbC5vbkNoYW5nZSgpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YXRjaDxUPihzaWc6IFNpZ25hbDxUPiwgZm46IFdhdGNoZXI8VD4sIG9wdGlvbnM/OiBTaWduYWxPcHRpb25zKTogKCkgPT4gdm9pZCB7XG4gIHJldHVybiBzaWcub25DaGFuZ2UoZm4sIG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmF0Y2goZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgYmF0Y2hpbmcgPSB0cnVlO1xuICB0cnkge1xuICAgIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgYmF0Y2hpbmcgPSBmYWxzZTtcbiAgICBjb25zdCBzdWJzID0gQXJyYXkuZnJvbShwZW5kaW5nU3Vic2NyaWJlcnMpO1xuICAgIHBlbmRpbmdTdWJzY3JpYmVycy5jbGVhcigpO1xuICAgIGNvbnN0IHdhdGNoZXJzID0gcGVuZGluZ1dhdGNoZXJzLnNwbGljZSgwKTtcbiAgICBmb3IgKGNvbnN0IHN1YiBvZiBzdWJzKSB7XG4gICAgICBzdWIoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB3YXRjaGVyIG9mIHdhdGNoZXJzKSB7XG4gICAgICB0cnkgeyB3YXRjaGVyKCk7IH0gY2F0Y2ggKGUpIHsgaGFuZGxlRXJyb3IoZSwgJ3dhdGNoZXInKTsgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZWQ8VD4oZm46ICgpID0+IFQsIG9wdGlvbnM/OiBTaWduYWxPcHRpb25zKTogU2lnbmFsPFQ+IHtcbiAgcmV0dXJuIG5ldyBDb21wdXRlZFNpZ25hbChmbiwgb3B0aW9ucyk7XG59XG4iLCJpbXBvcnQgeyBTaWduYWwsIGVmZmVjdCBhcyByYXdFZmZlY3QsIGNvbXB1dGVkIGFzIHJhd0NvbXB1dGVkIH0gZnJvbSBcIi4vc2lnbmFsXCI7XG5pbXBvcnQgeyBUcmFuc3BpbGVyIH0gZnJvbSBcIi4vdHJhbnNwaWxlclwiO1xuaW1wb3J0IHsgS05vZGUgfSBmcm9tIFwiLi90eXBlcy9ub2Rlc1wiO1xuXG50eXBlIFdhdGNoZXI8VD4gPSAobmV3VmFsdWU6IFQsIG9sZFZhbHVlOiBUKSA9PiB2b2lkO1xuXG5pbnRlcmZhY2UgQ29tcG9uZW50QXJnczxUQXJncyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gIGFyZ3M6IFRBcmdzO1xuICByZWY/OiBOb2RlO1xuICB0cmFuc3BpbGVyPzogVHJhbnNwaWxlcjtcbn1cblxuZXhwb3J0IGNsYXNzIENvbXBvbmVudDxUQXJncyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gIHN0YXRpYyB0ZW1wbGF0ZT86IHN0cmluZztcbiAgYXJnczogVEFyZ3MgPSB7fSBhcyBUQXJncztcbiAgcmVmPzogTm9kZTtcbiAgdHJhbnNwaWxlcj86IFRyYW5zcGlsZXI7XG4gICRhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICRyZW5kZXI/OiAoKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzPzogQ29tcG9uZW50QXJnczxUQXJncz4pIHtcbiAgICBpZiAoIXByb3BzKSB7XG4gICAgICB0aGlzLmFyZ3MgPSB7fSBhcyBUQXJncztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHByb3BzLmFyZ3MpIHtcbiAgICAgIHRoaXMuYXJncyA9IHByb3BzLmFyZ3M7XG4gICAgfVxuICAgIGlmIChwcm9wcy5yZWYpIHtcbiAgICAgIHRoaXMucmVmID0gcHJvcHMucmVmO1xuICAgIH1cbiAgICBpZiAocHJvcHMudHJhbnNwaWxlcikge1xuICAgICAgdGhpcy50cmFuc3BpbGVyID0gcHJvcHMudHJhbnNwaWxlcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHJlYWN0aXZlIGVmZmVjdCB0aWVkIHRvIHRoZSBjb21wb25lbnQncyBsaWZlY3ljbGUuXG4gICAqIFJ1bnMgaW1tZWRpYXRlbHkgYW5kIHJlLXJ1bnMgd2hlbiBhbnkgc2lnbmFsIGRlcGVuZGVuY3kgY2hhbmdlcy5cbiAgICovXG4gIGVmZmVjdChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHJhd0VmZmVjdChmbiwgeyBzaWduYWw6IHRoaXMuJGFib3J0Q29udHJvbGxlci5zaWduYWwgfSk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2hlcyBhIHNwZWNpZmljIHNpZ25hbCBmb3IgY2hhbmdlcy5cbiAgICogRG9lcyBOT1QgcnVuIGltbWVkaWF0ZWx5LlxuICAgKi9cbiAgd2F0Y2g8VD4oc2lnOiBTaWduYWw8VD4sIGZuOiBXYXRjaGVyPFQ+KTogdm9pZCB7XG4gICAgc2lnLm9uQ2hhbmdlKGZuLCB7IHNpZ25hbDogdGhpcy4kYWJvcnRDb250cm9sbGVyLnNpZ25hbCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY29tcHV0ZWQgc2lnbmFsIHRpZWQgdG8gdGhlIGNvbXBvbmVudCdzIGxpZmVjeWNsZS5cbiAgICogVGhlIGludGVybmFsIGVmZmVjdCBpcyBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgdXAgd2hlbiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZC5cbiAgICovXG4gIGNvbXB1dGVkPFQ+KGZuOiAoKSA9PiBUKTogU2lnbmFsPFQ+IHtcbiAgICByZXR1cm4gcmF3Q29tcHV0ZWQoZm4sIHsgc2lnbmFsOiB0aGlzLiRhYm9ydENvbnRyb2xsZXIuc2lnbmFsIH0pO1xuICB9XG5cbiAgb25Nb3VudCgpIHsgfVxuICBvblJlbmRlcigpIHsgfVxuICBvbkNoYW5nZXMoKSB7IH1cbiAgb25EZXN0cm95KCkgeyB9XG4gIG9uRXJyb3I/KGVycm9yOiBFcnJvciwgcGhhc2U6IHN0cmluZyk6IHZvaWQ7XG5cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuJHJlbmRlcj8uKCk7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgS2FzcGVyRW50aXR5ID0gQ29tcG9uZW50IHwgUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCB0eXBlIENvbXBvbmVudENsYXNzID0geyBuZXcoYXJncz86IENvbXBvbmVudEFyZ3M8YW55Pik6IENvbXBvbmVudCB9O1xuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRSZWdpc3RyeSB7XG4gIFt0YWdOYW1lOiBzdHJpbmddOiB7XG4gICAgY29tcG9uZW50OiBDb21wb25lbnRDbGFzcyB8ICgoKSA9PiBQcm9taXNlPENvbXBvbmVudENsYXNzPik7XG4gICAgbm9kZXM/OiBLTm9kZVtdO1xuICAgIGxhenk/OiBib29sZWFuO1xuICAgIGZhbGxiYWNrPzogQ29tcG9uZW50Q2xhc3M7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBUb2tlbiwgVG9rZW5UeXBlIH0gZnJvbSAndG9rZW4nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRXhwciB7XG4gIHB1YmxpYyByZXN1bHQ6IGFueTtcbiAgcHVibGljIGxpbmU6IG51bWJlcjtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG4gIHB1YmxpYyBhYnN0cmFjdCBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSO1xufVxuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbmV4cG9ydCBpbnRlcmZhY2UgRXhwclZpc2l0b3I8Uj4ge1xuICAgIHZpc2l0QXJyb3dGdW5jdGlvbkV4cHIoZXhwcjogQXJyb3dGdW5jdGlvbik6IFI7XG4gICAgdmlzaXRBc3NpZ25FeHByKGV4cHI6IEFzc2lnbik6IFI7XG4gICAgdmlzaXRCaW5hcnlFeHByKGV4cHI6IEJpbmFyeSk6IFI7XG4gICAgdmlzaXRDYWxsRXhwcihleHByOiBDYWxsKTogUjtcbiAgICB2aXNpdERlYnVnRXhwcihleHByOiBEZWJ1Zyk6IFI7XG4gICAgdmlzaXREaWN0aW9uYXJ5RXhwcihleHByOiBEaWN0aW9uYXJ5KTogUjtcbiAgICB2aXNpdEVhY2hFeHByKGV4cHI6IEVhY2gpOiBSO1xuICAgIHZpc2l0R2V0RXhwcihleHByOiBHZXQpOiBSO1xuICAgIHZpc2l0R3JvdXBpbmdFeHByKGV4cHI6IEdyb3VwaW5nKTogUjtcbiAgICB2aXNpdEtleUV4cHIoZXhwcjogS2V5KTogUjtcbiAgICB2aXNpdExvZ2ljYWxFeHByKGV4cHI6IExvZ2ljYWwpOiBSO1xuICAgIHZpc2l0TGlzdEV4cHIoZXhwcjogTGlzdCk6IFI7XG4gICAgdmlzaXRMaXRlcmFsRXhwcihleHByOiBMaXRlcmFsKTogUjtcbiAgICB2aXNpdE5ld0V4cHIoZXhwcjogTmV3KTogUjtcbiAgICB2aXNpdE51bGxDb2FsZXNjaW5nRXhwcihleHByOiBOdWxsQ29hbGVzY2luZyk6IFI7XG4gICAgdmlzaXRQb3N0Zml4RXhwcihleHByOiBQb3N0Zml4KTogUjtcbiAgICB2aXNpdFNldEV4cHIoZXhwcjogU2V0KTogUjtcbiAgICB2aXNpdFBpcGVsaW5lRXhwcihleHByOiBQaXBlbGluZSk6IFI7XG4gICAgdmlzaXRTcHJlYWRFeHByKGV4cHI6IFNwcmVhZCk6IFI7XG4gICAgdmlzaXRUZW1wbGF0ZUV4cHIoZXhwcjogVGVtcGxhdGUpOiBSO1xuICAgIHZpc2l0VGVybmFyeUV4cHIoZXhwcjogVGVybmFyeSk6IFI7XG4gICAgdmlzaXRUeXBlb2ZFeHByKGV4cHI6IFR5cGVvZik6IFI7XG4gICAgdmlzaXRVbmFyeUV4cHIoZXhwcjogVW5hcnkpOiBSO1xuICAgIHZpc2l0VmFyaWFibGVFeHByKGV4cHI6IFZhcmlhYmxlKTogUjtcbiAgICB2aXNpdFZvaWRFeHByKGV4cHI6IFZvaWQpOiBSO1xufVxuXG5leHBvcnQgY2xhc3MgQXJyb3dGdW5jdGlvbiBleHRlbmRzIEV4cHIge1xuICAgIHB1YmxpYyBwYXJhbXM6IFRva2VuW107XG4gICAgcHVibGljIGJvZHk6IEV4cHI7XG5cbiAgICBjb25zdHJ1Y3RvcihwYXJhbXM6IFRva2VuW10sIGJvZHk6IEV4cHIsIGxpbmU6IG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBFeHByVmlzaXRvcjxSPik6IFIge1xuICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRBcnJvd0Z1bmN0aW9uRXhwcih0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdFeHByLkFycm93RnVuY3Rpb24nO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBc3NpZ24gZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgbmFtZTogVG9rZW47XG4gICAgcHVibGljIHZhbHVlOiBFeHByO1xuXG4gICAgY29uc3RydWN0b3IobmFtZTogVG9rZW4sIHZhbHVlOiBFeHByLCBsaW5lOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmxpbmUgPSBsaW5lO1xuICAgIH1cblxuICBwdWJsaWMgYWNjZXB0PFI+KHZpc2l0b3I6IEV4cHJWaXNpdG9yPFI+KTogUiB7XG4gICAgICByZXR1cm4gdmlzaXRvci52aXNpdEFzc2lnbkV4cHIodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnRXhwci5Bc3NpZ24nO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCaW5hcnkgZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgbGVmdDogRXhwcjtcbiAgICBwdWJsaWMgb3BlcmF0b3I6IFRva2VuO1xuICAgIHB1YmxpYyByaWdodDogRXhwcjtcblxuICAgIGNvbnN0cnVjdG9yKGxlZnQ6IEV4cHIsIG9wZXJhdG9yOiBUb2tlbiwgcmlnaHQ6IEV4cHIsIGxpbmU6IG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuICAgICAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgICAgIHRoaXMucmlnaHQgPSByaWdodDtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBFeHByVmlzaXRvcjxSPik6IFIge1xuICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRCaW5hcnlFeHByKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gJ0V4cHIuQmluYXJ5JztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2FsbCBleHRlbmRzIEV4cHIge1xuICAgIHB1YmxpYyBjYWxsZWU6IEV4cHI7XG4gICAgcHVibGljIHBhcmVuOiBUb2tlbjtcbiAgICBwdWJsaWMgYXJnczogRXhwcltdO1xuICAgIHB1YmxpYyBvcHRpb25hbDogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGNhbGxlZTogRXhwciwgcGFyZW46IFRva2VuLCBhcmdzOiBFeHByW10sIGxpbmU6IG51bWJlciwgb3B0aW9uYWwgPSBmYWxzZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNhbGxlZSA9IGNhbGxlZTtcbiAgICAgICAgdGhpcy5wYXJlbiA9IHBhcmVuO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgICAgICB0aGlzLmxpbmUgPSBsaW5lO1xuICAgICAgICB0aGlzLm9wdGlvbmFsID0gb3B0aW9uYWw7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Q2FsbEV4cHIodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnRXhwci5DYWxsJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVidWcgZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgdmFsdWU6IEV4cHI7XG5cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogRXhwciwgbGluZTogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBFeHByVmlzaXRvcjxSPik6IFIge1xuICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXREZWJ1Z0V4cHIodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnRXhwci5EZWJ1Zyc7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpY3Rpb25hcnkgZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgcHJvcGVydGllczogRXhwcltdO1xuXG4gICAgY29uc3RydWN0b3IocHJvcGVydGllczogRXhwcltdLCBsaW5lOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBFeHByVmlzaXRvcjxSPik6IFIge1xuICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXREaWN0aW9uYXJ5RXhwcih0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdFeHByLkRpY3Rpb25hcnknO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFYWNoIGV4dGVuZHMgRXhwciB7XG4gICAgcHVibGljIG5hbWU6IFRva2VuO1xuICAgIHB1YmxpYyBrZXk6IFRva2VuO1xuICAgIHB1YmxpYyBpdGVyYWJsZTogRXhwcjtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IFRva2VuLCBrZXk6IFRva2VuLCBpdGVyYWJsZTogRXhwciwgbGluZTogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RWFjaEV4cHIodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnRXhwci5FYWNoJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2V0IGV4dGVuZHMgRXhwciB7XG4gICAgcHVibGljIGVudGl0eTogRXhwcjtcbiAgICBwdWJsaWMga2V5OiBFeHByO1xuICAgIHB1YmxpYyB0eXBlOiBUb2tlblR5cGU7XG5cbiAgICBjb25zdHJ1Y3RvcihlbnRpdHk6IEV4cHIsIGtleTogRXhwciwgdHlwZTogVG9rZW5UeXBlLCBsaW5lOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmxpbmUgPSBsaW5lO1xuICAgIH1cblxuICBwdWJsaWMgYWNjZXB0PFI+KHZpc2l0b3I6IEV4cHJWaXNpdG9yPFI+KTogUiB7XG4gICAgICByZXR1cm4gdmlzaXRvci52aXNpdEdldEV4cHIodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnRXhwci5HZXQnO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHcm91cGluZyBleHRlbmRzIEV4cHIge1xuICAgIHB1YmxpYyBleHByZXNzaW9uOiBFeHByO1xuXG4gICAgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogRXhwciwgbGluZTogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0R3JvdXBpbmdFeHByKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gJ0V4cHIuR3JvdXBpbmcnO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBLZXkgZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgbmFtZTogVG9rZW47XG5cbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBUb2tlbiwgbGluZTogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0S2V5RXhwcih0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdFeHByLktleSc7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExvZ2ljYWwgZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgbGVmdDogRXhwcjtcbiAgICBwdWJsaWMgb3BlcmF0b3I6IFRva2VuO1xuICAgIHB1YmxpYyByaWdodDogRXhwcjtcblxuICAgIGNvbnN0cnVjdG9yKGxlZnQ6IEV4cHIsIG9wZXJhdG9yOiBUb2tlbiwgcmlnaHQ6IEV4cHIsIGxpbmU6IG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuICAgICAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgICAgIHRoaXMucmlnaHQgPSByaWdodDtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBFeHByVmlzaXRvcjxSPik6IFIge1xuICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRMb2dpY2FsRXhwcih0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdFeHByLkxvZ2ljYWwnO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMaXN0IGV4dGVuZHMgRXhwciB7XG4gICAgcHVibGljIHZhbHVlOiBFeHByW107XG5cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogRXhwcltdLCBsaW5lOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmxpbmUgPSBsaW5lO1xuICAgIH1cblxuICBwdWJsaWMgYWNjZXB0PFI+KHZpc2l0b3I6IEV4cHJWaXNpdG9yPFI+KTogUiB7XG4gICAgICByZXR1cm4gdmlzaXRvci52aXNpdExpc3RFeHByKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gJ0V4cHIuTGlzdCc7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpdGVyYWwgZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgdmFsdWU6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBhbnksIGxpbmU6IG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TGl0ZXJhbEV4cHIodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnRXhwci5MaXRlcmFsJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTmV3IGV4dGVuZHMgRXhwciB7XG4gICAgcHVibGljIGNsYXp6OiBFeHByO1xuICAgIHB1YmxpYyBhcmdzOiBFeHByW107XG5cbiAgICBjb25zdHJ1Y3RvcihjbGF6ejogRXhwciwgYXJnczogRXhwcltdLCBsaW5lOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jbGF6eiA9IGNsYXp6O1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgICAgICB0aGlzLmxpbmUgPSBsaW5lO1xuICAgIH1cblxuICBwdWJsaWMgYWNjZXB0PFI+KHZpc2l0b3I6IEV4cHJWaXNpdG9yPFI+KTogUiB7XG4gICAgICByZXR1cm4gdmlzaXRvci52aXNpdE5ld0V4cHIodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnRXhwci5OZXcnO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOdWxsQ29hbGVzY2luZyBleHRlbmRzIEV4cHIge1xuICAgIHB1YmxpYyBsZWZ0OiBFeHByO1xuICAgIHB1YmxpYyByaWdodDogRXhwcjtcblxuICAgIGNvbnN0cnVjdG9yKGxlZnQ6IEV4cHIsIHJpZ2h0OiBFeHByLCBsaW5lOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDtcbiAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuICAgICAgICB0aGlzLmxpbmUgPSBsaW5lO1xuICAgIH1cblxuICBwdWJsaWMgYWNjZXB0PFI+KHZpc2l0b3I6IEV4cHJWaXNpdG9yPFI+KTogUiB7XG4gICAgICByZXR1cm4gdmlzaXRvci52aXNpdE51bGxDb2FsZXNjaW5nRXhwcih0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdFeHByLk51bGxDb2FsZXNjaW5nJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUG9zdGZpeCBleHRlbmRzIEV4cHIge1xuICAgIHB1YmxpYyBlbnRpdHk6IEV4cHI7XG4gICAgcHVibGljIGluY3JlbWVudDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoZW50aXR5OiBFeHByLCBpbmNyZW1lbnQ6IG51bWJlciwgbGluZTogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuICAgICAgICB0aGlzLmluY3JlbWVudCA9IGluY3JlbWVudDtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBFeHByVmlzaXRvcjxSPik6IFIge1xuICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRQb3N0Zml4RXhwcih0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdFeHByLlBvc3RmaXgnO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXQgZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgZW50aXR5OiBFeHByO1xuICAgIHB1YmxpYyBrZXk6IEV4cHI7XG4gICAgcHVibGljIHZhbHVlOiBFeHByO1xuXG4gICAgY29uc3RydWN0b3IoZW50aXR5OiBFeHByLCBrZXk6IEV4cHIsIHZhbHVlOiBFeHByLCBsaW5lOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U2V0RXhwcih0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdFeHByLlNldCc7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBpcGVsaW5lIGV4dGVuZHMgRXhwciB7XG4gICAgcHVibGljIGxlZnQ6IEV4cHI7XG4gICAgcHVibGljIHJpZ2h0OiBFeHByO1xuXG4gICAgY29uc3RydWN0b3IobGVmdDogRXhwciwgcmlnaHQ6IEV4cHIsIGxpbmU6IG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0UGlwZWxpbmVFeHByKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gJ0V4cHIuUGlwZWxpbmUnO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTcHJlYWQgZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgdmFsdWU6IEV4cHI7XG5cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogRXhwciwgbGluZTogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBFeHByVmlzaXRvcjxSPik6IFIge1xuICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTcHJlYWRFeHByKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gJ0V4cHIuU3ByZWFkJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGUgZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBzdHJpbmcsIGxpbmU6IG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VGVtcGxhdGVFeHByKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gJ0V4cHIuVGVtcGxhdGUnO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUZXJuYXJ5IGV4dGVuZHMgRXhwciB7XG4gICAgcHVibGljIGNvbmRpdGlvbjogRXhwcjtcbiAgICBwdWJsaWMgdGhlbkV4cHI6IEV4cHI7XG4gICAgcHVibGljIGVsc2VFeHByOiBFeHByO1xuXG4gICAgY29uc3RydWN0b3IoY29uZGl0aW9uOiBFeHByLCB0aGVuRXhwcjogRXhwciwgZWxzZUV4cHI6IEV4cHIsIGxpbmU6IG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjtcbiAgICAgICAgdGhpcy50aGVuRXhwciA9IHRoZW5FeHByO1xuICAgICAgICB0aGlzLmVsc2VFeHByID0gZWxzZUV4cHI7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VGVybmFyeUV4cHIodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnRXhwci5UZXJuYXJ5JztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHlwZW9mIGV4dGVuZHMgRXhwciB7XG4gICAgcHVibGljIHZhbHVlOiBFeHByO1xuXG4gICAgY29uc3RydWN0b3IodmFsdWU6IEV4cHIsIGxpbmU6IG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VHlwZW9mRXhwcih0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdFeHByLlR5cGVvZic7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuYXJ5IGV4dGVuZHMgRXhwciB7XG4gICAgcHVibGljIG9wZXJhdG9yOiBUb2tlbjtcbiAgICBwdWJsaWMgcmlnaHQ6IEV4cHI7XG5cbiAgICBjb25zdHJ1Y3RvcihvcGVyYXRvcjogVG9rZW4sIHJpZ2h0OiBFeHByLCBsaW5lOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5vcGVyYXRvciA9IG9wZXJhdG9yO1xuICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogRXhwclZpc2l0b3I8Uj4pOiBSIHtcbiAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VW5hcnlFeHByKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gJ0V4cHIuVW5hcnknO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWYXJpYWJsZSBleHRlbmRzIEV4cHIge1xuICAgIHB1YmxpYyBuYW1lOiBUb2tlbjtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IFRva2VuLCBsaW5lOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBFeHByVmlzaXRvcjxSPik6IFIge1xuICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRWYXJpYWJsZUV4cHIodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnRXhwci5WYXJpYWJsZSc7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFZvaWQgZXh0ZW5kcyBFeHByIHtcbiAgICBwdWJsaWMgdmFsdWU6IEV4cHI7XG5cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogRXhwciwgbGluZTogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBFeHByVmlzaXRvcjxSPik6IFIge1xuICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRWb2lkRXhwcih0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdFeHByLlZvaWQnO1xuICB9XG59XG5cbiIsImV4cG9ydCBlbnVtIFRva2VuVHlwZSB7XHJcbiAgLy8gUGFyc2VyIFRva2Vuc1xyXG4gIEVvZixcclxuICBQYW5pYyxcclxuXHJcbiAgLy8gU2luZ2xlIENoYXJhY3RlciBUb2tlbnNcclxuICBBbXBlcnNhbmQsXHJcbiAgQXRTaWduLFxyXG4gIENhcmV0LFxyXG4gIENvbW1hLFxyXG4gIERvbGxhcixcclxuICBEb3QsXHJcbiAgSGFzaCxcclxuICBMZWZ0QnJhY2UsXHJcbiAgTGVmdEJyYWNrZXQsXHJcbiAgTGVmdFBhcmVuLFxyXG4gIFBlcmNlbnQsXHJcbiAgUGlwZSxcclxuICBSaWdodEJyYWNlLFxyXG4gIFJpZ2h0QnJhY2tldCxcclxuICBSaWdodFBhcmVuLFxyXG4gIFNlbWljb2xvbixcclxuICBTbGFzaCxcclxuICBTdGFyLFxyXG5cclxuICAvLyBPbmUgT3IgVHdvIENoYXJhY3RlciBUb2tlbnNcclxuICBBcnJvdyxcclxuICBCYW5nLFxyXG4gIEJhbmdFcXVhbCxcclxuICBCYW5nRXF1YWxFcXVhbCxcclxuICBDb2xvbixcclxuICBFcXVhbCxcclxuICBFcXVhbEVxdWFsLFxyXG4gIEVxdWFsRXF1YWxFcXVhbCxcclxuICBHcmVhdGVyLFxyXG4gIEdyZWF0ZXJFcXVhbCxcclxuICBMZXNzLFxyXG4gIExlc3NFcXVhbCxcclxuICBNaW51cyxcclxuICBNaW51c0VxdWFsLFxyXG4gIE1pbnVzTWludXMsXHJcbiAgUGVyY2VudEVxdWFsLFxyXG4gIFBsdXMsXHJcbiAgUGx1c0VxdWFsLFxyXG4gIFBsdXNQbHVzLFxyXG4gIFF1ZXN0aW9uLFxyXG4gIFF1ZXN0aW9uRG90LFxyXG4gIFF1ZXN0aW9uUXVlc3Rpb24sXHJcbiAgU2xhc2hFcXVhbCxcclxuICBTdGFyRXF1YWwsXHJcbiAgRG90RG90LFxyXG4gIERvdERvdERvdCxcclxuICBMZXNzRXF1YWxHcmVhdGVyLFxyXG5cclxuICAvLyBMaXRlcmFsc1xyXG4gIElkZW50aWZpZXIsXHJcbiAgVGVtcGxhdGUsXHJcbiAgU3RyaW5nLFxyXG4gIE51bWJlcixcclxuXHJcbiAgLy8gT25lIE9yIFR3byBDaGFyYWN0ZXIgVG9rZW5zIChiaXR3aXNlIHNoaWZ0cylcclxuICBMZWZ0U2hpZnQsXHJcbiAgUmlnaHRTaGlmdCxcclxuICBQaXBlbGluZSxcclxuICBUaWxkZSxcclxuXHJcbiAgLy8gS2V5d29yZHNcclxuICBBbmQsXHJcbiAgQ29uc3QsXHJcbiAgRGVidWcsXHJcbiAgRmFsc2UsXHJcbiAgSW4sXHJcbiAgSW5zdGFuY2VvZixcclxuICBOZXcsXHJcbiAgTnVsbCxcclxuICBVbmRlZmluZWQsXHJcbiAgT2YsXHJcbiAgT3IsXHJcbiAgVHJ1ZSxcclxuICBUeXBlb2YsXHJcbiAgVm9pZCxcclxuICBXaXRoLFxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVG9rZW4ge1xyXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcbiAgcHVibGljIGxpbmU6IG51bWJlcjtcclxuICBwdWJsaWMgY29sOiBudW1iZXI7XHJcbiAgcHVibGljIHR5cGU6IFRva2VuVHlwZTtcclxuICBwdWJsaWMgbGl0ZXJhbDogYW55O1xyXG4gIHB1YmxpYyBsZXhlbWU6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICB0eXBlOiBUb2tlblR5cGUsXHJcbiAgICBsZXhlbWU6IHN0cmluZyxcclxuICAgIGxpdGVyYWw6IGFueSxcclxuICAgIGxpbmU6IG51bWJlcixcclxuICAgIGNvbDogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICB0aGlzLm5hbWUgPSBUb2tlblR5cGVbdHlwZV07XHJcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xyXG4gICAgdGhpcy5sZXhlbWUgPSBsZXhlbWU7XHJcbiAgICB0aGlzLmxpdGVyYWwgPSBsaXRlcmFsO1xyXG4gICAgdGhpcy5saW5lID0gbGluZTtcclxuICAgIHRoaXMuY29sID0gY29sO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvU3RyaW5nKCkge1xyXG4gICAgcmV0dXJuIGBbKCR7dGhpcy5saW5lfSk6XCIke3RoaXMubGV4ZW1lfVwiXWA7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgV2hpdGVTcGFjZXMgPSBbXCIgXCIsIFwiXFxuXCIsIFwiXFx0XCIsIFwiXFxyXCJdIGFzIGNvbnN0O1xyXG5cclxuZXhwb3J0IGNvbnN0IFNlbGZDbG9zaW5nVGFncyA9IFtcclxuICBcImFyZWFcIixcclxuICBcImJhc2VcIixcclxuICBcImJyXCIsXHJcbiAgXCJjb2xcIixcclxuICBcImVtYmVkXCIsXHJcbiAgXCJoclwiLFxyXG4gIFwiaW1nXCIsXHJcbiAgXCJpbnB1dFwiLFxyXG4gIFwibGlua1wiLFxyXG4gIFwibWV0YVwiLFxyXG4gIFwicGFyYW1cIixcclxuICBcInNvdXJjZVwiLFxyXG4gIFwidHJhY2tcIixcclxuICBcIndiclwiLFxyXG5dO1xyXG4iLCJpbXBvcnQgeyBLYXNwZXJFcnJvciwgS0Vycm9yQ29kZSwgS0Vycm9yQ29kZVR5cGUgfSBmcm9tIFwiLi90eXBlcy9lcnJvclwiO1xuaW1wb3J0ICogYXMgRXhwciBmcm9tIFwiLi90eXBlcy9leHByZXNzaW9uc1wiO1xuaW1wb3J0IHsgVG9rZW4sIFRva2VuVHlwZSB9IGZyb20gXCIuL3R5cGVzL3Rva2VuXCI7XG5cbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uUGFyc2VyIHtcbiAgcHJpdmF0ZSBjdXJyZW50OiBudW1iZXI7XG4gIHByaXZhdGUgdG9rZW5zOiBUb2tlbltdO1xuICBwcml2YXRlIHNvdXJjZTogc3RyaW5nO1xuXG4gIHB1YmxpYyBwYXJzZSh0b2tlbnM6IFRva2VuW10sIHNvdXJjZSA9IFwiXCIpOiBFeHByLkV4cHJbXSB7XG4gICAgdGhpcy5jdXJyZW50ID0gMDtcbiAgICB0aGlzLnRva2VucyA9IHRva2VucztcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICBjb25zdCBleHByZXNzaW9uczogRXhwci5FeHByW10gPSBbXTtcbiAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcbiAgICAgIGV4cHJlc3Npb25zLnB1c2godGhpcy5leHByZXNzaW9uKCkpO1xuICAgIH1cbiAgICByZXR1cm4gZXhwcmVzc2lvbnM7XG4gIH1cblxuICBwcml2YXRlIG1hdGNoKC4uLnR5cGVzOiBUb2tlblR5cGVbXSk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgdHlwZSBvZiB0eXBlcykge1xuICAgICAgaWYgKHRoaXMuY2hlY2sodHlwZSkpIHtcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGFkdmFuY2UoKTogVG9rZW4ge1xuICAgIGlmICghdGhpcy5lb2YoKSkge1xuICAgICAgdGhpcy5jdXJyZW50Kys7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnByZXZpb3VzKCk7XG4gIH1cblxuICBwcml2YXRlIHBlZWsoKTogVG9rZW4ge1xuICAgIHJldHVybiB0aGlzLnRva2Vuc1t0aGlzLmN1cnJlbnRdO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmV2aW91cygpOiBUb2tlbiB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zW3RoaXMuY3VycmVudCAtIDFdO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVjayh0eXBlOiBUb2tlblR5cGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wZWVrKCkudHlwZSA9PT0gdHlwZTtcbiAgfVxuXG4gIHByaXZhdGUgZW9mKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrKFRva2VuVHlwZS5Fb2YpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lKHR5cGU6IFRva2VuVHlwZSwgbWVzc2FnZTogc3RyaW5nKTogVG9rZW4ge1xuICAgIGlmICh0aGlzLmNoZWNrKHR5cGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXJyb3IoXG4gICAgICBLRXJyb3JDb2RlLlVORVhQRUNURURfVE9LRU4sXG4gICAgICB0aGlzLnBlZWsoKSxcbiAgICAgIHsgbWVzc2FnZTogbWVzc2FnZSwgdG9rZW46IHRoaXMucGVlaygpLmxleGVtZSB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZXJyb3IoY29kZTogS0Vycm9yQ29kZVR5cGUsIHRva2VuOiBUb2tlbiwgYXJnczogYW55ID0ge30pOiBhbnkge1xuICAgIHRocm93IG5ldyBLYXNwZXJFcnJvcihjb2RlLCBhcmdzLCB7IGxpbmU6IHRva2VuLmxpbmUsIGNvbDogdG9rZW4uY29sLCBzb3VyY2U6IHRoaXMuc291cmNlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jaHJvbml6ZSgpOiB2b2lkIHtcbiAgICBkbyB7XG4gICAgICBpZiAodGhpcy5jaGVjayhUb2tlblR5cGUuU2VtaWNvbG9uKSB8fCB0aGlzLmNoZWNrKFRva2VuVHlwZS5SaWdodEJyYWNlKSkge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgfSB3aGlsZSAoIXRoaXMuZW9mKCkpO1xuICB9XG5cbiAgcHVibGljIGZvcmVhY2godG9rZW5zOiBUb2tlbltdKTogRXhwci5FeHByIHtcbiAgICB0aGlzLmN1cnJlbnQgPSAwO1xuICAgIHRoaXMudG9rZW5zID0gdG9rZW5zO1xuXG4gICAgY29uc3QgbmFtZSA9IHRoaXMuY29uc3VtZShcbiAgICAgIFRva2VuVHlwZS5JZGVudGlmaWVyLFxuICAgICAgYEV4cGVjdGVkIGFuIGlkZW50aWZpZXIgaW5zaWRlIFwiZWFjaFwiIHN0YXRlbWVudGBcbiAgICApO1xuXG4gICAgbGV0IGtleTogVG9rZW4gPSBudWxsO1xuICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5XaXRoKSkge1xuICAgICAga2V5ID0gdGhpcy5jb25zdW1lKFxuICAgICAgICBUb2tlblR5cGUuSWRlbnRpZmllcixcbiAgICAgICAgYEV4cGVjdGVkIGEgXCJrZXlcIiBpZGVudGlmaWVyIGFmdGVyIFwid2l0aFwiIGtleXdvcmQgaW4gZm9yZWFjaCBzdGF0ZW1lbnRgXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuY29uc3VtZShcbiAgICAgIFRva2VuVHlwZS5PZixcbiAgICAgIGBFeHBlY3RlZCBcIm9mXCIga2V5d29yZCBpbnNpZGUgZm9yZWFjaCBzdGF0ZW1lbnRgXG4gICAgKTtcbiAgICBjb25zdCBpdGVyYWJsZSA9IHRoaXMuZXhwcmVzc2lvbigpO1xuXG4gICAgcmV0dXJuIG5ldyBFeHByLkVhY2gobmFtZSwga2V5LCBpdGVyYWJsZSwgbmFtZS5saW5lKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhwcmVzc2lvbigpOiBFeHByLkV4cHIge1xuICAgIGNvbnN0IGV4cHJlc3Npb246IEV4cHIuRXhwciA9IHRoaXMuYXNzaWdubWVudCgpO1xuICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5TZW1pY29sb24pKSB7XG4gICAgICAvLyBjb25zdW1lIGFsbCBzZW1pY29sb25zXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgIHdoaWxlICh0aGlzLm1hdGNoKFRva2VuVHlwZS5TZW1pY29sb24pKSB7IC8qIGNvbnN1bWUgc2VtaWNvbG9ucyAqLyB9XG4gICAgfVxuICAgIHJldHVybiBleHByZXNzaW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NpZ25tZW50KCk6IEV4cHIuRXhwciB7XG4gICAgY29uc3QgZXhwcjogRXhwci5FeHByID0gdGhpcy5waXBlbGluZSgpO1xuICAgIGlmIChcbiAgICAgIHRoaXMubWF0Y2goXG4gICAgICAgIFRva2VuVHlwZS5FcXVhbCxcbiAgICAgICAgVG9rZW5UeXBlLlBsdXNFcXVhbCxcbiAgICAgICAgVG9rZW5UeXBlLk1pbnVzRXF1YWwsXG4gICAgICAgIFRva2VuVHlwZS5TdGFyRXF1YWwsXG4gICAgICAgIFRva2VuVHlwZS5TbGFzaEVxdWFsXG4gICAgICApXG4gICAgKSB7XG4gICAgICBjb25zdCBvcGVyYXRvcjogVG9rZW4gPSB0aGlzLnByZXZpb3VzKCk7XG4gICAgICBsZXQgdmFsdWU6IEV4cHIuRXhwciA9IHRoaXMuYXNzaWdubWVudCgpO1xuICAgICAgaWYgKGV4cHIgaW5zdGFuY2VvZiBFeHByLlZhcmlhYmxlKSB7XG4gICAgICAgIGNvbnN0IG5hbWU6IFRva2VuID0gZXhwci5uYW1lO1xuICAgICAgICBpZiAob3BlcmF0b3IudHlwZSAhPT0gVG9rZW5UeXBlLkVxdWFsKSB7XG4gICAgICAgICAgdmFsdWUgPSBuZXcgRXhwci5CaW5hcnkoXG4gICAgICAgICAgICBuZXcgRXhwci5WYXJpYWJsZShuYW1lLCBuYW1lLmxpbmUpLFxuICAgICAgICAgICAgb3BlcmF0b3IsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIG9wZXJhdG9yLmxpbmVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRXhwci5Bc3NpZ24obmFtZSwgdmFsdWUsIG5hbWUubGluZSk7XG4gICAgICB9IGVsc2UgaWYgKGV4cHIgaW5zdGFuY2VvZiBFeHByLkdldCkge1xuICAgICAgICBpZiAob3BlcmF0b3IudHlwZSAhPT0gVG9rZW5UeXBlLkVxdWFsKSB7XG4gICAgICAgICAgdmFsdWUgPSBuZXcgRXhwci5CaW5hcnkoXG4gICAgICAgICAgICBuZXcgRXhwci5HZXQoZXhwci5lbnRpdHksIGV4cHIua2V5LCBleHByLnR5cGUsIGV4cHIubGluZSksXG4gICAgICAgICAgICBvcGVyYXRvcixcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgb3BlcmF0b3IubGluZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBFeHByLlNldChleHByLmVudGl0eSwgZXhwci5rZXksIHZhbHVlLCBleHByLmxpbmUpO1xuICAgICAgfVxuICAgICAgdGhpcy5lcnJvcihLRXJyb3JDb2RlLklOVkFMSURfTFZBTFVFLCBvcGVyYXRvcik7XG4gICAgfVxuICAgIHJldHVybiBleHByO1xuICB9XG5cbiAgcHJpdmF0ZSBwaXBlbGluZSgpOiBFeHByLkV4cHIge1xuICAgIGxldCBleHByID0gdGhpcy50ZXJuYXJ5KCk7XG4gICAgd2hpbGUgKHRoaXMubWF0Y2goVG9rZW5UeXBlLlBpcGVsaW5lKSkge1xuICAgICAgY29uc3QgcmlnaHQgPSB0aGlzLnRlcm5hcnkoKTtcbiAgICAgIGV4cHIgPSBuZXcgRXhwci5QaXBlbGluZShleHByLCByaWdodCwgZXhwci5saW5lKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4cHI7XG4gIH1cblxuICBwcml2YXRlIHRlcm5hcnkoKTogRXhwci5FeHByIHtcbiAgICBjb25zdCBleHByID0gdGhpcy5udWxsQ29hbGVzY2luZygpO1xuICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5RdWVzdGlvbikpIHtcbiAgICAgIGNvbnN0IHRoZW5FeHByOiBFeHByLkV4cHIgPSB0aGlzLnRlcm5hcnkoKTtcbiAgICAgIHRoaXMuY29uc3VtZShUb2tlblR5cGUuQ29sb24sIGBFeHBlY3RlZCBcIjpcIiBhZnRlciB0ZXJuYXJ5ID8gZXhwcmVzc2lvbmApO1xuICAgICAgY29uc3QgZWxzZUV4cHI6IEV4cHIuRXhwciA9IHRoaXMudGVybmFyeSgpO1xuICAgICAgcmV0dXJuIG5ldyBFeHByLlRlcm5hcnkoZXhwciwgdGhlbkV4cHIsIGVsc2VFeHByLCBleHByLmxpbmUpO1xuICAgIH1cbiAgICByZXR1cm4gZXhwcjtcbiAgfVxuXG4gIHByaXZhdGUgbnVsbENvYWxlc2NpbmcoKTogRXhwci5FeHByIHtcbiAgICBjb25zdCBleHByID0gdGhpcy5sb2dpY2FsT3IoKTtcbiAgICBpZiAodGhpcy5tYXRjaChUb2tlblR5cGUuUXVlc3Rpb25RdWVzdGlvbikpIHtcbiAgICAgIGNvbnN0IHJpZ2h0RXhwcjogRXhwci5FeHByID0gdGhpcy5udWxsQ29hbGVzY2luZygpO1xuICAgICAgcmV0dXJuIG5ldyBFeHByLk51bGxDb2FsZXNjaW5nKGV4cHIsIHJpZ2h0RXhwciwgZXhwci5saW5lKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4cHI7XG4gIH1cblxuICBwcml2YXRlIGxvZ2ljYWxPcigpOiBFeHByLkV4cHIge1xuICAgIGxldCBleHByID0gdGhpcy5sb2dpY2FsQW5kKCk7XG4gICAgd2hpbGUgKHRoaXMubWF0Y2goVG9rZW5UeXBlLk9yKSkge1xuICAgICAgY29uc3Qgb3BlcmF0b3I6IFRva2VuID0gdGhpcy5wcmV2aW91cygpO1xuICAgICAgY29uc3QgcmlnaHQ6IEV4cHIuRXhwciA9IHRoaXMubG9naWNhbEFuZCgpO1xuICAgICAgZXhwciA9IG5ldyBFeHByLkxvZ2ljYWwoZXhwciwgb3BlcmF0b3IsIHJpZ2h0LCBvcGVyYXRvci5saW5lKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4cHI7XG4gIH1cblxuICBwcml2YXRlIGxvZ2ljYWxBbmQoKTogRXhwci5FeHByIHtcbiAgICBsZXQgZXhwciA9IHRoaXMuZXF1YWxpdHkoKTtcbiAgICB3aGlsZSAodGhpcy5tYXRjaChUb2tlblR5cGUuQW5kKSkge1xuICAgICAgY29uc3Qgb3BlcmF0b3I6IFRva2VuID0gdGhpcy5wcmV2aW91cygpO1xuICAgICAgY29uc3QgcmlnaHQ6IEV4cHIuRXhwciA9IHRoaXMuZXF1YWxpdHkoKTtcbiAgICAgIGV4cHIgPSBuZXcgRXhwci5Mb2dpY2FsKGV4cHIsIG9wZXJhdG9yLCByaWdodCwgb3BlcmF0b3IubGluZSk7XG4gICAgfVxuICAgIHJldHVybiBleHByO1xuICB9XG5cbiAgcHJpdmF0ZSBlcXVhbGl0eSgpOiBFeHByLkV4cHIge1xuICAgIGxldCBleHByOiBFeHByLkV4cHIgPSB0aGlzLnNoaWZ0KCk7XG4gICAgd2hpbGUgKFxuICAgICAgdGhpcy5tYXRjaChcbiAgICAgICAgVG9rZW5UeXBlLkJhbmdFcXVhbCxcbiAgICAgICAgVG9rZW5UeXBlLkJhbmdFcXVhbEVxdWFsLFxuICAgICAgICBUb2tlblR5cGUuRXF1YWxFcXVhbCxcbiAgICAgICAgVG9rZW5UeXBlLkVxdWFsRXF1YWxFcXVhbCxcbiAgICAgICAgVG9rZW5UeXBlLkdyZWF0ZXIsXG4gICAgICAgIFRva2VuVHlwZS5HcmVhdGVyRXF1YWwsXG4gICAgICAgIFRva2VuVHlwZS5MZXNzLFxuICAgICAgICBUb2tlblR5cGUuTGVzc0VxdWFsLFxuICAgICAgICBUb2tlblR5cGUuSW5zdGFuY2VvZixcbiAgICAgICAgVG9rZW5UeXBlLkluLFxuICAgICAgKVxuICAgICkge1xuICAgICAgY29uc3Qgb3BlcmF0b3I6IFRva2VuID0gdGhpcy5wcmV2aW91cygpO1xuICAgICAgY29uc3QgcmlnaHQ6IEV4cHIuRXhwciA9IHRoaXMuc2hpZnQoKTtcbiAgICAgIGV4cHIgPSBuZXcgRXhwci5CaW5hcnkoZXhwciwgb3BlcmF0b3IsIHJpZ2h0LCBvcGVyYXRvci5saW5lKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4cHI7XG4gIH1cblxuICBwcml2YXRlIHNoaWZ0KCk6IEV4cHIuRXhwciB7XG4gICAgbGV0IGV4cHI6IEV4cHIuRXhwciA9IHRoaXMuYWRkaXRpb24oKTtcbiAgICB3aGlsZSAodGhpcy5tYXRjaChUb2tlblR5cGUuTGVmdFNoaWZ0LCBUb2tlblR5cGUuUmlnaHRTaGlmdCkpIHtcbiAgICAgIGNvbnN0IG9wZXJhdG9yOiBUb2tlbiA9IHRoaXMucHJldmlvdXMoKTtcbiAgICAgIGNvbnN0IHJpZ2h0OiBFeHByLkV4cHIgPSB0aGlzLmFkZGl0aW9uKCk7XG4gICAgICBleHByID0gbmV3IEV4cHIuQmluYXJ5KGV4cHIsIG9wZXJhdG9yLCByaWdodCwgb3BlcmF0b3IubGluZSk7XG4gICAgfVxuICAgIHJldHVybiBleHByO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRpdGlvbigpOiBFeHByLkV4cHIge1xuICAgIGxldCBleHByOiBFeHByLkV4cHIgPSB0aGlzLm1vZHVsdXMoKTtcbiAgICB3aGlsZSAodGhpcy5tYXRjaChUb2tlblR5cGUuTWludXMsIFRva2VuVHlwZS5QbHVzKSkge1xuICAgICAgY29uc3Qgb3BlcmF0b3I6IFRva2VuID0gdGhpcy5wcmV2aW91cygpO1xuICAgICAgY29uc3QgcmlnaHQ6IEV4cHIuRXhwciA9IHRoaXMubW9kdWx1cygpO1xuICAgICAgZXhwciA9IG5ldyBFeHByLkJpbmFyeShleHByLCBvcGVyYXRvciwgcmlnaHQsIG9wZXJhdG9yLmxpbmUpO1xuICAgIH1cbiAgICByZXR1cm4gZXhwcjtcbiAgfVxuXG4gIHByaXZhdGUgbW9kdWx1cygpOiBFeHByLkV4cHIge1xuICAgIGxldCBleHByOiBFeHByLkV4cHIgPSB0aGlzLm11bHRpcGxpY2F0aW9uKCk7XG4gICAgd2hpbGUgKHRoaXMubWF0Y2goVG9rZW5UeXBlLlBlcmNlbnQpKSB7XG4gICAgICBjb25zdCBvcGVyYXRvcjogVG9rZW4gPSB0aGlzLnByZXZpb3VzKCk7XG4gICAgICBjb25zdCByaWdodDogRXhwci5FeHByID0gdGhpcy5tdWx0aXBsaWNhdGlvbigpO1xuICAgICAgZXhwciA9IG5ldyBFeHByLkJpbmFyeShleHByLCBvcGVyYXRvciwgcmlnaHQsIG9wZXJhdG9yLmxpbmUpO1xuICAgIH1cbiAgICByZXR1cm4gZXhwcjtcbiAgfVxuXG4gIHByaXZhdGUgbXVsdGlwbGljYXRpb24oKTogRXhwci5FeHByIHtcbiAgICBsZXQgZXhwcjogRXhwci5FeHByID0gdGhpcy50eXBlb2YoKTtcbiAgICB3aGlsZSAodGhpcy5tYXRjaChUb2tlblR5cGUuU2xhc2gsIFRva2VuVHlwZS5TdGFyKSkge1xuICAgICAgY29uc3Qgb3BlcmF0b3I6IFRva2VuID0gdGhpcy5wcmV2aW91cygpO1xuICAgICAgY29uc3QgcmlnaHQ6IEV4cHIuRXhwciA9IHRoaXMudHlwZW9mKCk7XG4gICAgICBleHByID0gbmV3IEV4cHIuQmluYXJ5KGV4cHIsIG9wZXJhdG9yLCByaWdodCwgb3BlcmF0b3IubGluZSk7XG4gICAgfVxuICAgIHJldHVybiBleHByO1xuICB9XG5cbiAgcHJpdmF0ZSB0eXBlb2YoKTogRXhwci5FeHByIHtcbiAgICBpZiAodGhpcy5tYXRjaChUb2tlblR5cGUuVHlwZW9mKSkge1xuICAgICAgY29uc3Qgb3BlcmF0b3I6IFRva2VuID0gdGhpcy5wcmV2aW91cygpO1xuICAgICAgY29uc3QgdmFsdWU6IEV4cHIuRXhwciA9IHRoaXMudHlwZW9mKCk7XG4gICAgICByZXR1cm4gbmV3IEV4cHIuVHlwZW9mKHZhbHVlLCBvcGVyYXRvci5saW5lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudW5hcnkoKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5hcnkoKTogRXhwci5FeHByIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLm1hdGNoKFxuICAgICAgICBUb2tlblR5cGUuTWludXMsXG4gICAgICAgIFRva2VuVHlwZS5CYW5nLFxuICAgICAgICBUb2tlblR5cGUuVGlsZGUsXG4gICAgICAgIFRva2VuVHlwZS5Eb2xsYXIsXG4gICAgICAgIFRva2VuVHlwZS5QbHVzUGx1cyxcbiAgICAgICAgVG9rZW5UeXBlLk1pbnVzTWludXNcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGNvbnN0IG9wZXJhdG9yOiBUb2tlbiA9IHRoaXMucHJldmlvdXMoKTtcbiAgICAgIGNvbnN0IHJpZ2h0OiBFeHByLkV4cHIgPSB0aGlzLnVuYXJ5KCk7XG4gICAgICByZXR1cm4gbmV3IEV4cHIuVW5hcnkob3BlcmF0b3IsIHJpZ2h0LCBvcGVyYXRvci5saW5lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubmV3S2V5d29yZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBuZXdLZXl3b3JkKCk6IEV4cHIuRXhwciB7XG4gICAgaWYgKHRoaXMubWF0Y2goVG9rZW5UeXBlLk5ldykpIHtcbiAgICAgIGNvbnN0IGtleXdvcmQgPSB0aGlzLnByZXZpb3VzKCk7XG4gICAgICBjb25zdCBjb25zdHJ1Y3Q6IEV4cHIuRXhwciA9IHRoaXMuY2FsbCgpO1xuICAgICAgaWYgKGNvbnN0cnVjdCBpbnN0YW5jZW9mIEV4cHIuQ2FsbCkge1xuICAgICAgICByZXR1cm4gbmV3IEV4cHIuTmV3KGNvbnN0cnVjdC5jYWxsZWUsIGNvbnN0cnVjdC5hcmdzLCBrZXl3b3JkLmxpbmUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBFeHByLk5ldyhjb25zdHJ1Y3QsIFtdLCBrZXl3b3JkLmxpbmUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wb3N0Zml4KCk7XG4gIH1cblxuICBwcml2YXRlIHBvc3RmaXgoKTogRXhwci5FeHByIHtcbiAgICBjb25zdCBleHByID0gdGhpcy5jYWxsKCk7XG4gICAgaWYgKHRoaXMubWF0Y2goVG9rZW5UeXBlLlBsdXNQbHVzKSkge1xuICAgICAgcmV0dXJuIG5ldyBFeHByLlBvc3RmaXgoZXhwciwgMSwgZXhwci5saW5lKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF0Y2goVG9rZW5UeXBlLk1pbnVzTWludXMpKSB7XG4gICAgICByZXR1cm4gbmV3IEV4cHIuUG9zdGZpeChleHByLCAtMSwgZXhwci5saW5lKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4cHI7XG4gIH1cblxuICBwcml2YXRlIGNhbGwoKTogRXhwci5FeHByIHtcbiAgICBsZXQgZXhwcjogRXhwci5FeHByID0gdGhpcy5wcmltYXJ5KCk7XG4gICAgbGV0IGNvbnN1bWVkOiBib29sZWFuO1xuICAgIGRvIHtcbiAgICAgIGNvbnN1bWVkID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5tYXRjaChUb2tlblR5cGUuTGVmdFBhcmVuKSkge1xuICAgICAgICBjb25zdW1lZCA9IHRydWU7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBleHByID0gdGhpcy5maW5pc2hDYWxsKGV4cHIsIHRoaXMucHJldmlvdXMoKSwgZmFsc2UpO1xuICAgICAgICB9IHdoaWxlICh0aGlzLm1hdGNoKFRva2VuVHlwZS5MZWZ0UGFyZW4pKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5Eb3QsIFRva2VuVHlwZS5RdWVzdGlvbkRvdCkpIHtcbiAgICAgICAgY29uc3VtZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBvcGVyYXRvciA9IHRoaXMucHJldmlvdXMoKTtcbiAgICAgICAgaWYgKG9wZXJhdG9yLnR5cGUgPT09IFRva2VuVHlwZS5RdWVzdGlvbkRvdCAmJiB0aGlzLm1hdGNoKFRva2VuVHlwZS5MZWZ0QnJhY2tldCkpIHtcbiAgICAgICAgICBleHByID0gdGhpcy5icmFja2V0R2V0KGV4cHIsIG9wZXJhdG9yKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvci50eXBlID09PSBUb2tlblR5cGUuUXVlc3Rpb25Eb3QgJiYgdGhpcy5tYXRjaChUb2tlblR5cGUuTGVmdFBhcmVuKSkge1xuICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmlzaENhbGwoZXhwciwgdGhpcy5wcmV2aW91cygpLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBleHByID0gdGhpcy5kb3RHZXQoZXhwciwgb3BlcmF0b3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5tYXRjaChUb2tlblR5cGUuTGVmdEJyYWNrZXQpKSB7XG4gICAgICAgIGNvbnN1bWVkID0gdHJ1ZTtcbiAgICAgICAgZXhwciA9IHRoaXMuYnJhY2tldEdldChleHByLCB0aGlzLnByZXZpb3VzKCkpO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKGNvbnN1bWVkKTtcbiAgICByZXR1cm4gZXhwcjtcbiAgfVxuXG4gIHByaXZhdGUgdG9rZW5BdChvZmZzZXQ6IG51bWJlcik6IFRva2VuVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zW3RoaXMuY3VycmVudCArIG9mZnNldF0/LnR5cGU7XG4gIH1cblxuICBwcml2YXRlIGlzQXJyb3dQYXJhbXMoKTogYm9vbGVhbiB7XG4gICAgbGV0IGkgPSB0aGlzLmN1cnJlbnQgKyAxOyAvLyBza2lwIChcbiAgICBpZiAodGhpcy50b2tlbnNbaV0/LnR5cGUgPT09IFRva2VuVHlwZS5SaWdodFBhcmVuKSB7XG4gICAgICByZXR1cm4gdGhpcy50b2tlbnNbaSArIDFdPy50eXBlID09PSBUb2tlblR5cGUuQXJyb3c7XG4gICAgfVxuICAgIHdoaWxlIChpIDwgdGhpcy50b2tlbnMubGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy50b2tlbnNbaV0/LnR5cGUgIT09IFRva2VuVHlwZS5JZGVudGlmaWVyKSByZXR1cm4gZmFsc2U7XG4gICAgICBpKys7XG4gICAgICBpZiAodGhpcy50b2tlbnNbaV0/LnR5cGUgPT09IFRva2VuVHlwZS5SaWdodFBhcmVuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2Vuc1tpICsgMV0/LnR5cGUgPT09IFRva2VuVHlwZS5BcnJvdztcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnRva2Vuc1tpXT8udHlwZSAhPT0gVG9rZW5UeXBlLkNvbW1hKSByZXR1cm4gZmFsc2U7XG4gICAgICBpKys7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluaXNoQ2FsbChjYWxsZWU6IEV4cHIuRXhwciwgcGFyZW46IFRva2VuLCBvcHRpb25hbDogYm9vbGVhbik6IEV4cHIuRXhwciB7XG4gICAgY29uc3QgYXJnczogRXhwci5FeHByW10gPSBbXTtcbiAgICBpZiAoIXRoaXMuY2hlY2soVG9rZW5UeXBlLlJpZ2h0UGFyZW4pKSB7XG4gICAgICBkbyB7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5Eb3REb3REb3QpKSB7XG4gICAgICAgICAgYXJncy5wdXNoKG5ldyBFeHByLlNwcmVhZCh0aGlzLmV4cHJlc3Npb24oKSwgdGhpcy5wcmV2aW91cygpLmxpbmUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhcmdzLnB1c2godGhpcy5leHByZXNzaW9uKCkpO1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlICh0aGlzLm1hdGNoKFRva2VuVHlwZS5Db21tYSkpO1xuICAgIH1cbiAgICBjb25zdCBjbG9zZVBhcmVuID0gdGhpcy5jb25zdW1lKFRva2VuVHlwZS5SaWdodFBhcmVuLCBgRXhwZWN0ZWQgXCIpXCIgYWZ0ZXIgYXJndW1lbnRzYCk7XG4gICAgcmV0dXJuIG5ldyBFeHByLkNhbGwoY2FsbGVlLCBjbG9zZVBhcmVuLCBhcmdzLCBjbG9zZVBhcmVuLmxpbmUsIG9wdGlvbmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgZG90R2V0KGV4cHI6IEV4cHIuRXhwciwgb3BlcmF0b3I6IFRva2VuKTogRXhwci5FeHByIHtcbiAgICBjb25zdCBuYW1lOiBUb2tlbiA9IHRoaXMuY29uc3VtZShcbiAgICAgIFRva2VuVHlwZS5JZGVudGlmaWVyLFxuICAgICAgYEV4cGVjdCBwcm9wZXJ0eSBuYW1lIGFmdGVyICcuJ2BcbiAgICApO1xuICAgIGNvbnN0IGtleTogRXhwci5LZXkgPSBuZXcgRXhwci5LZXkobmFtZSwgbmFtZS5saW5lKTtcbiAgICByZXR1cm4gbmV3IEV4cHIuR2V0KGV4cHIsIGtleSwgb3BlcmF0b3IudHlwZSwgbmFtZS5saW5lKTtcbiAgfVxuXG4gIHByaXZhdGUgYnJhY2tldEdldChleHByOiBFeHByLkV4cHIsIG9wZXJhdG9yOiBUb2tlbik6IEV4cHIuRXhwciB7XG4gICAgbGV0IGtleTogRXhwci5FeHByID0gbnVsbDtcblxuICAgIGlmICghdGhpcy5jaGVjayhUb2tlblR5cGUuUmlnaHRCcmFja2V0KSkge1xuICAgICAga2V5ID0gdGhpcy5leHByZXNzaW9uKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb25zdW1lKFRva2VuVHlwZS5SaWdodEJyYWNrZXQsIGBFeHBlY3RlZCBcIl1cIiBhZnRlciBhbiBpbmRleGApO1xuICAgIHJldHVybiBuZXcgRXhwci5HZXQoZXhwciwga2V5LCBvcGVyYXRvci50eXBlLCBvcGVyYXRvci5saW5lKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJpbWFyeSgpOiBFeHByLkV4cHIge1xuICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5GYWxzZSkpIHtcbiAgICAgIHJldHVybiBuZXcgRXhwci5MaXRlcmFsKGZhbHNlLCB0aGlzLnByZXZpb3VzKCkubGluZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5UcnVlKSkge1xuICAgICAgcmV0dXJuIG5ldyBFeHByLkxpdGVyYWwodHJ1ZSwgdGhpcy5wcmV2aW91cygpLmxpbmUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXRjaChUb2tlblR5cGUuTnVsbCkpIHtcbiAgICAgIHJldHVybiBuZXcgRXhwci5MaXRlcmFsKG51bGwsIHRoaXMucHJldmlvdXMoKS5saW5lKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF0Y2goVG9rZW5UeXBlLlVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybiBuZXcgRXhwci5MaXRlcmFsKHVuZGVmaW5lZCwgdGhpcy5wcmV2aW91cygpLmxpbmUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXRjaChUb2tlblR5cGUuTnVtYmVyKSB8fCB0aGlzLm1hdGNoKFRva2VuVHlwZS5TdHJpbmcpKSB7XG4gICAgICByZXR1cm4gbmV3IEV4cHIuTGl0ZXJhbCh0aGlzLnByZXZpb3VzKCkubGl0ZXJhbCwgdGhpcy5wcmV2aW91cygpLmxpbmUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXRjaChUb2tlblR5cGUuVGVtcGxhdGUpKSB7XG4gICAgICByZXR1cm4gbmV3IEV4cHIuVGVtcGxhdGUodGhpcy5wcmV2aW91cygpLmxpdGVyYWwsIHRoaXMucHJldmlvdXMoKS5saW5lKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2hlY2soVG9rZW5UeXBlLklkZW50aWZpZXIpICYmIHRoaXMudG9rZW5BdCgxKSA9PT0gVG9rZW5UeXBlLkFycm93KSB7XG4gICAgICBjb25zdCBwYXJhbSA9IHRoaXMuYWR2YW5jZSgpO1xuICAgICAgdGhpcy5hZHZhbmNlKCk7IC8vIGNvbnN1bWUgPT5cbiAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLmV4cHJlc3Npb24oKTtcbiAgICAgIHJldHVybiBuZXcgRXhwci5BcnJvd0Z1bmN0aW9uKFtwYXJhbV0sIGJvZHksIHBhcmFtLmxpbmUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXRjaChUb2tlblR5cGUuSWRlbnRpZmllcikpIHtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLnByZXZpb3VzKCk7XG4gICAgICByZXR1cm4gbmV3IEV4cHIuVmFyaWFibGUoaWRlbnRpZmllciwgaWRlbnRpZmllci5saW5lKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2hlY2soVG9rZW5UeXBlLkxlZnRQYXJlbikgJiYgdGhpcy5pc0Fycm93UGFyYW1zKCkpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpOyAvLyBjb25zdW1lIChcbiAgICAgIGNvbnN0IHBhcmFtczogVG9rZW5bXSA9IFtdO1xuICAgICAgaWYgKCF0aGlzLmNoZWNrKFRva2VuVHlwZS5SaWdodFBhcmVuKSkge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgcGFyYW1zLnB1c2godGhpcy5jb25zdW1lKFRva2VuVHlwZS5JZGVudGlmaWVyLCBcIkV4cGVjdGVkIHBhcmFtZXRlciBuYW1lXCIpKTtcbiAgICAgICAgfSB3aGlsZSAodGhpcy5tYXRjaChUb2tlblR5cGUuQ29tbWEpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29uc3VtZShUb2tlblR5cGUuUmlnaHRQYXJlbiwgYEV4cGVjdGVkIFwiKVwiYCk7XG4gICAgICB0aGlzLmNvbnN1bWUoVG9rZW5UeXBlLkFycm93LCBgRXhwZWN0ZWQgXCI9PlwiYCk7XG4gICAgICBjb25zdCBib2R5ID0gdGhpcy5leHByZXNzaW9uKCk7XG4gICAgICByZXR1cm4gbmV3IEV4cHIuQXJyb3dGdW5jdGlvbihwYXJhbXMsIGJvZHksIHRoaXMucHJldmlvdXMoKS5saW5lKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF0Y2goVG9rZW5UeXBlLkxlZnRQYXJlbikpIHtcbiAgICAgIGNvbnN0IGV4cHI6IEV4cHIuRXhwciA9IHRoaXMuZXhwcmVzc2lvbigpO1xuICAgICAgdGhpcy5jb25zdW1lKFRva2VuVHlwZS5SaWdodFBhcmVuLCBgRXhwZWN0ZWQgXCIpXCIgYWZ0ZXIgZXhwcmVzc2lvbmApO1xuICAgICAgcmV0dXJuIG5ldyBFeHByLkdyb3VwaW5nKGV4cHIsIGV4cHIubGluZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5MZWZ0QnJhY2UpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaWN0aW9uYXJ5KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5MZWZ0QnJhY2tldCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpc3QoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF0Y2goVG9rZW5UeXBlLlZvaWQpKSB7XG4gICAgICBjb25zdCBleHByOiBFeHByLkV4cHIgPSB0aGlzLmV4cHJlc3Npb24oKTtcbiAgICAgIHJldHVybiBuZXcgRXhwci5Wb2lkKGV4cHIsIHRoaXMucHJldmlvdXMoKS5saW5lKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF0Y2goVG9rZW5UeXBlLkRlYnVnKSkge1xuICAgICAgY29uc3QgZXhwcjogRXhwci5FeHByID0gdGhpcy5leHByZXNzaW9uKCk7XG4gICAgICByZXR1cm4gbmV3IEV4cHIuRGVidWcoZXhwciwgdGhpcy5wcmV2aW91cygpLmxpbmUpO1xuICAgIH1cblxuICAgIHRocm93IHRoaXMuZXJyb3IoXG4gICAgICBLRXJyb3JDb2RlLkVYUEVDVEVEX0VYUFJFU1NJT04sXG4gICAgICB0aGlzLnBlZWsoKSxcbiAgICAgIHsgdG9rZW46IHRoaXMucGVlaygpLmxleGVtZSB9XG4gICAgKTtcbiAgICAvLyB1bnJlYWNoZWFibGUgY29kZVxuICAgIHJldHVybiBuZXcgRXhwci5MaXRlcmFsKG51bGwsIDApO1xuICB9XG5cbiAgcHVibGljIGRpY3Rpb25hcnkoKTogRXhwci5FeHByIHtcbiAgICBjb25zdCBsZWZ0QnJhY2UgPSB0aGlzLnByZXZpb3VzKCk7XG4gICAgaWYgKHRoaXMubWF0Y2goVG9rZW5UeXBlLlJpZ2h0QnJhY2UpKSB7XG4gICAgICByZXR1cm4gbmV3IEV4cHIuRGljdGlvbmFyeShbXSwgdGhpcy5wcmV2aW91cygpLmxpbmUpO1xuICAgIH1cbiAgICBjb25zdCBwcm9wZXJ0aWVzOiBFeHByLkV4cHJbXSA9IFtdO1xuICAgIGRvIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5Eb3REb3REb3QpKSB7XG4gICAgICAgIHByb3BlcnRpZXMucHVzaChuZXcgRXhwci5TcHJlYWQodGhpcy5leHByZXNzaW9uKCksIHRoaXMucHJldmlvdXMoKS5saW5lKSk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0aGlzLm1hdGNoKFRva2VuVHlwZS5TdHJpbmcsIFRva2VuVHlwZS5JZGVudGlmaWVyLCBUb2tlblR5cGUuTnVtYmVyKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGtleTogVG9rZW4gPSB0aGlzLnByZXZpb3VzKCk7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5Db2xvbikpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZXhwcmVzc2lvbigpO1xuICAgICAgICAgIHByb3BlcnRpZXMucHVzaChcbiAgICAgICAgICAgIG5ldyBFeHByLlNldChudWxsLCBuZXcgRXhwci5LZXkoa2V5LCBrZXkubGluZSksIHZhbHVlLCBrZXkubGluZSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gbmV3IEV4cHIuVmFyaWFibGUoa2V5LCBrZXkubGluZSk7XG4gICAgICAgICAgcHJvcGVydGllcy5wdXNoKFxuICAgICAgICAgICAgbmV3IEV4cHIuU2V0KG51bGwsIG5ldyBFeHByLktleShrZXksIGtleS5saW5lKSwgdmFsdWUsIGtleS5saW5lKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXJyb3IoXG4gICAgICAgICAgS0Vycm9yQ29kZS5JTlZBTElEX0RJQ1RJT05BUllfS0VZLFxuICAgICAgICAgIHRoaXMucGVlaygpLFxuICAgICAgICAgIHsgdG9rZW46IHRoaXMucGVlaygpLmxleGVtZSB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSB3aGlsZSAodGhpcy5tYXRjaChUb2tlblR5cGUuQ29tbWEpKTtcbiAgICB0aGlzLmNvbnN1bWUoVG9rZW5UeXBlLlJpZ2h0QnJhY2UsIGBFeHBlY3RlZCBcIn1cIiBhZnRlciBvYmplY3QgbGl0ZXJhbGApO1xuXG4gICAgcmV0dXJuIG5ldyBFeHByLkRpY3Rpb25hcnkocHJvcGVydGllcywgbGVmdEJyYWNlLmxpbmUpO1xuICB9XG5cbiAgcHJpdmF0ZSBsaXN0KCk6IEV4cHIuRXhwciB7XG4gICAgY29uc3QgdmFsdWVzOiBFeHByLkV4cHJbXSA9IFtdO1xuICAgIGNvbnN0IGxlZnRCcmFja2V0ID0gdGhpcy5wcmV2aW91cygpO1xuXG4gICAgaWYgKHRoaXMubWF0Y2goVG9rZW5UeXBlLlJpZ2h0QnJhY2tldCkpIHtcbiAgICAgIHJldHVybiBuZXcgRXhwci5MaXN0KFtdLCB0aGlzLnByZXZpb3VzKCkubGluZSk7XG4gICAgfVxuICAgIGRvIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKFRva2VuVHlwZS5Eb3REb3REb3QpKSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKG5ldyBFeHByLlNwcmVhZCh0aGlzLmV4cHJlc3Npb24oKSwgdGhpcy5wcmV2aW91cygpLmxpbmUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKHRoaXMuZXhwcmVzc2lvbigpKTtcbiAgICAgIH1cbiAgICB9IHdoaWxlICh0aGlzLm1hdGNoKFRva2VuVHlwZS5Db21tYSkpO1xuXG4gICAgdGhpcy5jb25zdW1lKFxuICAgICAgVG9rZW5UeXBlLlJpZ2h0QnJhY2tldCxcbiAgICAgIGBFeHBlY3RlZCBcIl1cIiBhZnRlciBhcnJheSBkZWNsYXJhdGlvbmBcbiAgICApO1xuICAgIHJldHVybiBuZXcgRXhwci5MaXN0KHZhbHVlcywgbGVmdEJyYWNrZXQubGluZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFRva2VuVHlwZSB9IGZyb20gXCIuL3R5cGVzL3Rva2VuXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RpZ2l0KGNoYXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2hhciA+PSBcIjBcIiAmJiBjaGFyIDw9IFwiOVwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBbHBoYShjaGFyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICAoY2hhciA+PSBcImFcIiAmJiBjaGFyIDw9IFwielwiKSB8fCAoY2hhciA+PSBcIkFcIiAmJiBjaGFyIDw9IFwiWlwiKSB8fCBjaGFyID09PSBcIiRcIiB8fCBjaGFyID09PSBcIl9cIlxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBbHBoYU51bWVyaWMoY2hhcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc0FscGhhKGNoYXIpIHx8IGlzRGlnaXQoY2hhcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYXBpdGFsaXplKHdvcmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zdWJzdHJpbmcoMSkudG9Mb3dlckNhc2UoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzS2V5d29yZCh3b3JkOiBrZXlvZiB0eXBlb2YgVG9rZW5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBUb2tlblR5cGVbd29yZF0gPj0gVG9rZW5UeXBlLkFuZDtcbn1cbiIsImltcG9ydCAqIGFzIFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBUb2tlbiwgVG9rZW5UeXBlIH0gZnJvbSBcIi4vdHlwZXMvdG9rZW5cIjtcbmltcG9ydCB7IEthc3BlckVycm9yLCBLRXJyb3JDb2RlLCBLRXJyb3JDb2RlVHlwZSB9IGZyb20gXCIuL3R5cGVzL2Vycm9yXCI7XG5cbmV4cG9ydCBjbGFzcyBTY2FubmVyIHtcbiAgLyoqIHNjcmlwdHMgc291cmNlIGNvZGUgKi9cbiAgcHVibGljIHNvdXJjZTogc3RyaW5nO1xuICAvKiogY29udGFpbnMgdGhlIHNvdXJjZSBjb2RlIHJlcHJlc2VudGVkIGFzIGxpc3Qgb2YgdG9rZW5zICovXG4gIHB1YmxpYyB0b2tlbnM6IFRva2VuW107XG4gIC8qKiBwb2ludHMgdG8gdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGJlaW5nIHRva2VuaXplZCAqL1xuICBwcml2YXRlIGN1cnJlbnQ6IG51bWJlcjtcbiAgLyoqIHBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlIHRva2VuICAqL1xuICBwcml2YXRlIHN0YXJ0OiBudW1iZXI7XG4gIC8qKiBjdXJyZW50IGxpbmUgb2Ygc291cmNlIGNvZGUgYmVpbmcgdG9rZW5pemVkICovXG4gIHByaXZhdGUgbGluZTogbnVtYmVyO1xuICAvKiogY3VycmVudCBjb2x1bW4gb2YgdGhlIGNoYXJhY3RlciBiZWluZyB0b2tlbml6ZWQgKi9cbiAgcHJpdmF0ZSBjb2w6IG51bWJlcjtcblxuICBwdWJsaWMgc2Nhbihzb3VyY2U6IHN0cmluZyk6IFRva2VuW10ge1xuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIHRoaXMudG9rZW5zID0gW107XG4gICAgdGhpcy5jdXJyZW50ID0gMDtcbiAgICB0aGlzLnN0YXJ0ID0gMDtcbiAgICB0aGlzLmxpbmUgPSAxO1xuICAgIHRoaXMuY29sID0gMTtcblxuICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuICAgICAgdGhpcy5zdGFydCA9IHRoaXMuY3VycmVudDtcbiAgICAgIHRoaXMuZ2V0VG9rZW4oKTtcbiAgICB9XG4gICAgdGhpcy50b2tlbnMucHVzaChuZXcgVG9rZW4oVG9rZW5UeXBlLkVvZiwgXCJcIiwgbnVsbCwgdGhpcy5saW5lLCAwKSk7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zO1xuICB9XG5cbiAgcHJpdmF0ZSBlb2YoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudCA+PSB0aGlzLnNvdXJjZS5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIGFkdmFuY2UoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5wZWVrKCkgPT09IFwiXFxuXCIpIHtcbiAgICAgIHRoaXMubGluZSsrO1xuICAgICAgdGhpcy5jb2wgPSAwO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnQrKztcbiAgICB0aGlzLmNvbCsrO1xuICAgIHJldHVybiB0aGlzLnNvdXJjZS5jaGFyQXQodGhpcy5jdXJyZW50IC0gMSk7XG4gIH1cblxuICBwcml2YXRlIGFkZFRva2VuKHRva2VuVHlwZTogVG9rZW5UeXBlLCBsaXRlcmFsOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5zb3VyY2Uuc3Vic3RyaW5nKHRoaXMuc3RhcnQsIHRoaXMuY3VycmVudCk7XG4gICAgdGhpcy50b2tlbnMucHVzaChuZXcgVG9rZW4odG9rZW5UeXBlLCB0ZXh0LCBsaXRlcmFsLCB0aGlzLmxpbmUsIHRoaXMuY29sKSk7XG4gIH1cblxuICBwcml2YXRlIG1hdGNoKGV4cGVjdGVkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5lb2YoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNvdXJjZS5jaGFyQXQodGhpcy5jdXJyZW50KSAhPT0gZXhwZWN0ZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnQrKztcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgcGVlaygpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmVvZigpKSB7XG4gICAgICByZXR1cm4gXCJcXDBcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc291cmNlLmNoYXJBdCh0aGlzLmN1cnJlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBwZWVrTmV4dCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmN1cnJlbnQgKyAxID49IHRoaXMuc291cmNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFwiXFwwXCI7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNvdXJjZS5jaGFyQXQodGhpcy5jdXJyZW50ICsgMSk7XG4gIH1cblxuICBwcml2YXRlIGNvbW1lbnQoKTogdm9pZCB7XG4gICAgd2hpbGUgKHRoaXMucGVlaygpICE9PSBcIlxcblwiICYmICF0aGlzLmVvZigpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG11bHRpbGluZUNvbW1lbnQoKTogdm9pZCB7XG4gICAgd2hpbGUgKCF0aGlzLmVvZigpICYmICEodGhpcy5wZWVrKCkgPT09IFwiKlwiICYmIHRoaXMucGVla05leHQoKSA9PT0gXCIvXCIpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZW9mKCkpIHtcbiAgICAgIHRoaXMuZXJyb3IoS0Vycm9yQ29kZS5VTlRFUk1JTkFURURfQ09NTUVOVCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZSBjbG9zaW5nIHNsYXNoICcqLydcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdHJpbmcocXVvdGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHdoaWxlICh0aGlzLnBlZWsoKSAhPT0gcXVvdGUgJiYgIXRoaXMuZW9mKCkpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cblxuICAgIC8vIFVudGVybWluYXRlZCBzdHJpbmcuXG4gICAgaWYgKHRoaXMuZW9mKCkpIHtcbiAgICAgIHRoaXMuZXJyb3IoS0Vycm9yQ29kZS5VTlRFUk1JTkFURURfU1RSSU5HLCB7IHF1b3RlOiBxdW90ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgY2xvc2luZyBcIi5cbiAgICB0aGlzLmFkdmFuY2UoKTtcblxuICAgIC8vIFRyaW0gdGhlIHN1cnJvdW5kaW5nIHF1b3Rlcy5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc291cmNlLnN1YnN0cmluZyh0aGlzLnN0YXJ0ICsgMSwgdGhpcy5jdXJyZW50IC0gMSk7XG4gICAgdGhpcy5hZGRUb2tlbihxdW90ZSAhPT0gXCJgXCIgPyBUb2tlblR5cGUuU3RyaW5nIDogVG9rZW5UeXBlLlRlbXBsYXRlLCB2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIG51bWJlcigpOiB2b2lkIHtcbiAgICAvLyBnZXRzIGludGVnZXIgcGFydFxuICAgIHdoaWxlIChVdGlscy5pc0RpZ2l0KHRoaXMucGVlaygpKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuXG4gICAgLy8gY2hlY2tzIGZvciBmcmFjdGlvblxuICAgIGlmICh0aGlzLnBlZWsoKSA9PT0gXCIuXCIgJiYgVXRpbHMuaXNEaWdpdCh0aGlzLnBlZWtOZXh0KCkpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG5cbiAgICAvLyBnZXRzIGZyYWN0aW9uIHBhcnRcbiAgICB3aGlsZSAoVXRpbHMuaXNEaWdpdCh0aGlzLnBlZWsoKSkpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrcyBmb3IgZXhwb25lbnRcbiAgICBpZiAodGhpcy5wZWVrKCkudG9Mb3dlckNhc2UoKSA9PT0gXCJlXCIpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgaWYgKHRoaXMucGVlaygpID09PSBcIi1cIiB8fCB0aGlzLnBlZWsoKSA9PT0gXCIrXCIpIHtcbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2hpbGUgKFV0aWxzLmlzRGlnaXQodGhpcy5wZWVrKCkpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc291cmNlLnN1YnN0cmluZyh0aGlzLnN0YXJ0LCB0aGlzLmN1cnJlbnQpO1xuICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlLk51bWJlciwgTnVtYmVyKHZhbHVlKSk7XG4gIH1cblxuICBwcml2YXRlIGlkZW50aWZpZXIoKTogdm9pZCB7XG4gICAgd2hpbGUgKFV0aWxzLmlzQWxwaGFOdW1lcmljKHRoaXMucGVlaygpKSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnNvdXJjZS5zdWJzdHJpbmcodGhpcy5zdGFydCwgdGhpcy5jdXJyZW50KTtcbiAgICBjb25zdCBjYXBpdGFsaXplZCA9IFV0aWxzLmNhcGl0YWxpemUodmFsdWUpIGFzIGtleW9mIHR5cGVvZiBUb2tlblR5cGU7XG4gICAgaWYgKFV0aWxzLmlzS2V5d29yZChjYXBpdGFsaXplZCkpIHtcbiAgICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlW2NhcGl0YWxpemVkXSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5JZGVudGlmaWVyLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRUb2tlbigpOiB2b2lkIHtcbiAgICBjb25zdCBjaGFyID0gdGhpcy5hZHZhbmNlKCk7XG4gICAgc3dpdGNoIChjaGFyKSB7XG4gICAgICBjYXNlIFwiKFwiOlxuICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5MZWZ0UGFyZW4sIG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCIpXCI6XG4gICAgICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlLlJpZ2h0UGFyZW4sIG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJbXCI6XG4gICAgICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlLkxlZnRCcmFja2V0LCBudWxsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiXVwiOlxuICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5SaWdodEJyYWNrZXQsIG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ7XCI6XG4gICAgICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlLkxlZnRCcmFjZSwgbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIn1cIjpcbiAgICAgICAgdGhpcy5hZGRUb2tlbihUb2tlblR5cGUuUmlnaHRCcmFjZSwgbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIixcIjpcbiAgICAgICAgdGhpcy5hZGRUb2tlbihUb2tlblR5cGUuQ29tbWEsIG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCI7XCI6XG4gICAgICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlLlNlbWljb2xvbiwgbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIn5cIjpcbiAgICAgICAgdGhpcy5hZGRUb2tlbihUb2tlblR5cGUuVGlsZGUsIG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJeXCI6XG4gICAgICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlLkNhcmV0LCBudWxsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiI1wiOlxuICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5IYXNoLCBudWxsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiOlwiOlxuICAgICAgICB0aGlzLmFkZFRva2VuKFxuICAgICAgICAgIHRoaXMubWF0Y2goXCI9XCIpID8gVG9rZW5UeXBlLkFycm93IDogVG9rZW5UeXBlLkNvbG9uLFxuICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiKlwiOlxuICAgICAgICB0aGlzLmFkZFRva2VuKFxuICAgICAgICAgIHRoaXMubWF0Y2goXCI9XCIpID8gVG9rZW5UeXBlLlN0YXJFcXVhbCA6IFRva2VuVHlwZS5TdGFyLFxuICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiJVwiOlxuICAgICAgICB0aGlzLmFkZFRva2VuKFxuICAgICAgICAgIHRoaXMubWF0Y2goXCI9XCIpID8gVG9rZW5UeXBlLlBlcmNlbnRFcXVhbCA6IFRva2VuVHlwZS5QZXJjZW50LFxuICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwifFwiOlxuICAgICAgICB0aGlzLmFkZFRva2VuKFxuICAgICAgICAgIHRoaXMubWF0Y2goXCJ8XCIpID8gVG9rZW5UeXBlLk9yIDpcbiAgICAgICAgICB0aGlzLm1hdGNoKFwiPlwiKSA/IFRva2VuVHlwZS5QaXBlbGluZSA6XG4gICAgICAgICAgVG9rZW5UeXBlLlBpcGUsXG4gICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCImXCI6XG4gICAgICAgIHRoaXMuYWRkVG9rZW4oXG4gICAgICAgICAgdGhpcy5tYXRjaChcIiZcIikgPyBUb2tlblR5cGUuQW5kIDogVG9rZW5UeXBlLkFtcGVyc2FuZCxcbiAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIj5cIjpcbiAgICAgICAgdGhpcy5hZGRUb2tlbihcbiAgICAgICAgICB0aGlzLm1hdGNoKFwiPlwiKSA/IFRva2VuVHlwZS5SaWdodFNoaWZ0IDpcbiAgICAgICAgICB0aGlzLm1hdGNoKFwiPVwiKSA/IFRva2VuVHlwZS5HcmVhdGVyRXF1YWwgOiBUb2tlblR5cGUuR3JlYXRlcixcbiAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIiFcIjpcbiAgICAgICAgdGhpcy5hZGRUb2tlbihcbiAgICAgICAgICB0aGlzLm1hdGNoKFwiPVwiKVxuICAgICAgICAgICAgPyB0aGlzLm1hdGNoKFwiPVwiKSA/IFRva2VuVHlwZS5CYW5nRXF1YWxFcXVhbCA6IFRva2VuVHlwZS5CYW5nRXF1YWxcbiAgICAgICAgICAgIDogVG9rZW5UeXBlLkJhbmcsXG4gICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCI/XCI6XG4gICAgICAgIHRoaXMuYWRkVG9rZW4oXG4gICAgICAgICAgdGhpcy5tYXRjaChcIj9cIilcbiAgICAgICAgICAgID8gVG9rZW5UeXBlLlF1ZXN0aW9uUXVlc3Rpb25cbiAgICAgICAgICAgIDogdGhpcy5tYXRjaChcIi5cIilcbiAgICAgICAgICAgID8gVG9rZW5UeXBlLlF1ZXN0aW9uRG90XG4gICAgICAgICAgICA6IFRva2VuVHlwZS5RdWVzdGlvbixcbiAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIj1cIjpcbiAgICAgICAgaWYgKHRoaXMubWF0Y2goXCI9XCIpKSB7XG4gICAgICAgICAgdGhpcy5hZGRUb2tlbihcbiAgICAgICAgICAgIHRoaXMubWF0Y2goXCI9XCIpID8gVG9rZW5UeXBlLkVxdWFsRXF1YWxFcXVhbCA6IFRva2VuVHlwZS5FcXVhbEVxdWFsLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRUb2tlbihcbiAgICAgICAgICB0aGlzLm1hdGNoKFwiPlwiKSA/IFRva2VuVHlwZS5BcnJvdyA6IFRva2VuVHlwZS5FcXVhbCxcbiAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIitcIjpcbiAgICAgICAgdGhpcy5hZGRUb2tlbihcbiAgICAgICAgICB0aGlzLm1hdGNoKFwiK1wiKVxuICAgICAgICAgICAgPyBUb2tlblR5cGUuUGx1c1BsdXNcbiAgICAgICAgICAgIDogdGhpcy5tYXRjaChcIj1cIilcbiAgICAgICAgICAgID8gVG9rZW5UeXBlLlBsdXNFcXVhbFxuICAgICAgICAgICAgOiBUb2tlblR5cGUuUGx1cyxcbiAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIi1cIjpcbiAgICAgICAgdGhpcy5hZGRUb2tlbihcbiAgICAgICAgICB0aGlzLm1hdGNoKFwiLVwiKVxuICAgICAgICAgICAgPyBUb2tlblR5cGUuTWludXNNaW51c1xuICAgICAgICAgICAgOiB0aGlzLm1hdGNoKFwiPVwiKVxuICAgICAgICAgICAgPyBUb2tlblR5cGUuTWludXNFcXVhbFxuICAgICAgICAgICAgOiBUb2tlblR5cGUuTWludXMsXG4gICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCI8XCI6XG4gICAgICAgIHRoaXMuYWRkVG9rZW4oXG4gICAgICAgICAgdGhpcy5tYXRjaChcIjxcIikgPyBUb2tlblR5cGUuTGVmdFNoaWZ0IDpcbiAgICAgICAgICB0aGlzLm1hdGNoKFwiPVwiKVxuICAgICAgICAgICAgPyB0aGlzLm1hdGNoKFwiPlwiKVxuICAgICAgICAgICAgICA/IFRva2VuVHlwZS5MZXNzRXF1YWxHcmVhdGVyXG4gICAgICAgICAgICAgIDogVG9rZW5UeXBlLkxlc3NFcXVhbFxuICAgICAgICAgICAgOiBUb2tlblR5cGUuTGVzcyxcbiAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIi5cIjpcbiAgICAgICAgaWYgKHRoaXMubWF0Y2goXCIuXCIpKSB7XG4gICAgICAgICAgaWYgKHRoaXMubWF0Y2goXCIuXCIpKSB7XG4gICAgICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5Eb3REb3REb3QsIG51bGwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5Eb3REb3QsIG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5Eb3QsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIi9cIjpcbiAgICAgICAgaWYgKHRoaXMubWF0Y2goXCIvXCIpKSB7XG4gICAgICAgICAgdGhpcy5jb21tZW50KCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXRjaChcIipcIikpIHtcbiAgICAgICAgICB0aGlzLm11bHRpbGluZUNvbW1lbnQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFkZFRva2VuKFxuICAgICAgICAgICAgdGhpcy5tYXRjaChcIj1cIikgPyBUb2tlblR5cGUuU2xhc2hFcXVhbCA6IFRva2VuVHlwZS5TbGFzaCxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBgJ2A6XG4gICAgICBjYXNlIGBcImA6XG4gICAgICBjYXNlIFwiYFwiOlxuICAgICAgICB0aGlzLnN0cmluZyhjaGFyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBpZ25vcmUgY2FzZXNcbiAgICAgIGNhc2UgXCJcXG5cIjpcbiAgICAgIGNhc2UgXCIgXCI6XG4gICAgICBjYXNlIFwiXFxyXCI6XG4gICAgICBjYXNlIFwiXFx0XCI6XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gY29tcGxleCBjYXNlc1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKFV0aWxzLmlzRGlnaXQoY2hhcikpIHtcbiAgICAgICAgICB0aGlzLm51bWJlcigpO1xuICAgICAgICB9IGVsc2UgaWYgKFV0aWxzLmlzQWxwaGEoY2hhcikpIHtcbiAgICAgICAgICB0aGlzLmlkZW50aWZpZXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVycm9yKEtFcnJvckNvZGUuVU5FWFBFQ1RFRF9DSEFSQUNURVIsIHsgY2hhcjogY2hhciB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVycm9yKGNvZGU6IEtFcnJvckNvZGVUeXBlLCBhcmdzOiBhbnkgPSB7fSk6IHZvaWQge1xuICAgIHRocm93IG5ldyBLYXNwZXJFcnJvcihjb2RlLCBhcmdzLCB7IGxpbmU6IHRoaXMubGluZSwgY29sOiB0aGlzLmNvbCwgc291cmNlOiB0aGlzLnNvdXJjZSB9KTtcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIFNjb3BlIHtcbiAgcHVibGljIHZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgcHVibGljIHBhcmVudDogU2NvcGU7XG5cbiAgY29uc3RydWN0b3IocGFyZW50PzogU2NvcGUsIGVudGl0eT86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0aGlzLnBhcmVudCA9IHBhcmVudCA/IHBhcmVudCA6IG51bGw7XG4gICAgdGhpcy52YWx1ZXMgPSBlbnRpdHkgPyBlbnRpdHkgOiB7fTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0KGVudGl0eT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlcyA9IGVudGl0eSA/IGVudGl0eSA6IHt9O1xuICB9XG5cbiAgcHVibGljIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlc1tuYW1lXSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnZhbHVlc1trZXldICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZXNba2V5XTtcbiAgICB9XG5cbiAgICBjb25zdCAkaW1wb3J0cyA9ICh0aGlzLnZhbHVlcz8uY29uc3RydWN0b3IgYXMgYW55KT8uJGltcG9ydHM7XG4gICAgaWYgKCRpbXBvcnRzICYmIHR5cGVvZiAkaW1wb3J0c1trZXldICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gJGltcG9ydHNba2V5XTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wYXJlbnQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmVudC5nZXQoa2V5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2luZG93W2tleSBhcyBrZXlvZiB0eXBlb2Ygd2luZG93XTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgRXhwciBmcm9tIFwiLi90eXBlcy9leHByZXNzaW9uc1wiO1xuaW1wb3J0IHsgU2Nhbm5lciB9IGZyb20gXCIuL3NjYW5uZXJcIjtcbmltcG9ydCB7IEV4cHJlc3Npb25QYXJzZXIgYXMgUGFyc2VyIH0gZnJvbSBcIi4vZXhwcmVzc2lvbi1wYXJzZXJcIjtcbmltcG9ydCB7IFNjb3BlIH0gZnJvbSBcIi4vc2NvcGVcIjtcbmltcG9ydCB7IFRva2VuVHlwZSB9IGZyb20gXCIuL3R5cGVzL3Rva2VuXCI7XG5pbXBvcnQgeyBLYXNwZXJFcnJvciwgS0Vycm9yQ29kZSwgS0Vycm9yQ29kZVR5cGUgfSBmcm9tIFwiLi90eXBlcy9lcnJvclwiO1xuXG5leHBvcnQgY2xhc3MgSW50ZXJwcmV0ZXIgaW1wbGVtZW50cyBFeHByLkV4cHJWaXNpdG9yPGFueT4ge1xuICBwdWJsaWMgc2NvcGUgPSBuZXcgU2NvcGUoKTtcbiAgcHJpdmF0ZSBzY2FubmVyID0gbmV3IFNjYW5uZXIoKTtcbiAgcHJpdmF0ZSBwYXJzZXIgPSBuZXcgUGFyc2VyKCk7XG5cbiAgcHVibGljIGV2YWx1YXRlKGV4cHI6IEV4cHIuRXhwcik6IGFueSB7XG4gICAgcmV0dXJuIChleHByLnJlc3VsdCA9IGV4cHIuYWNjZXB0KHRoaXMpKTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdFBpcGVsaW5lRXhwcihleHByOiBFeHByLlBpcGVsaW5lKTogYW55IHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZXZhbHVhdGUoZXhwci5sZWZ0KTtcblxuICAgIGlmIChleHByLnJpZ2h0IGluc3RhbmNlb2YgRXhwci5DYWxsKSB7XG4gICAgICBjb25zdCBjYWxsZWUgPSB0aGlzLmV2YWx1YXRlKGV4cHIucmlnaHQuY2FsbGVlKTtcbiAgICAgIGNvbnN0IGFyZ3MgPSBbdmFsdWVdO1xuICAgICAgZm9yIChjb25zdCBhcmcgb2YgZXhwci5yaWdodC5hcmdzKSB7XG4gICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBFeHByLlNwcmVhZCkge1xuICAgICAgICAgIGFyZ3MucHVzaCguLi50aGlzLmV2YWx1YXRlKChhcmcgYXMgRXhwci5TcHJlYWQpLnZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXJncy5wdXNoKHRoaXMuZXZhbHVhdGUoYXJnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChleHByLnJpZ2h0LmNhbGxlZSBpbnN0YW5jZW9mIEV4cHIuR2V0KSB7XG4gICAgICAgIHJldHVybiBjYWxsZWUuYXBwbHkoZXhwci5yaWdodC5jYWxsZWUuZW50aXR5LnJlc3VsdCwgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FsbGVlKC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIGNvbnN0IGZuID0gdGhpcy5ldmFsdWF0ZShleHByLnJpZ2h0KTtcbiAgICByZXR1cm4gZm4odmFsdWUpO1xuICB9XG5cbiAgcHVibGljIHZpc2l0QXJyb3dGdW5jdGlvbkV4cHIoZXhwcjogRXhwci5BcnJvd0Z1bmN0aW9uKTogYW55IHtcbiAgICBjb25zdCBjYXB0dXJlZFNjb3BlID0gdGhpcy5zY29wZTtcbiAgICByZXR1cm4gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBjb25zdCBwcmV2ID0gdGhpcy5zY29wZTtcbiAgICAgIHRoaXMuc2NvcGUgPSBuZXcgU2NvcGUoY2FwdHVyZWRTY29wZSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cHIucGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuc2NvcGUuc2V0KGV4cHIucGFyYW1zW2ldLmxleGVtZSwgYXJnc1tpXSk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShleHByLmJvZHkpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5zY29wZSA9IHByZXY7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBlcnJvcihjb2RlOiBLRXJyb3JDb2RlVHlwZSwgYXJnczogYW55ID0ge30sIGxpbmU/OiBudW1iZXIsIGNvbD86IG51bWJlcik6IHZvaWQge1xuICAgIHRocm93IG5ldyBLYXNwZXJFcnJvcihjb2RlLCBhcmdzLCB7IGxpbmUsIGNvbCB9KTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdFZhcmlhYmxlRXhwcihleHByOiBFeHByLlZhcmlhYmxlKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5zY29wZS5nZXQoZXhwci5uYW1lLmxleGVtZSk7XG4gIH1cblxuICBwdWJsaWMgdmlzaXRBc3NpZ25FeHByKGV4cHI6IEV4cHIuQXNzaWduKTogYW55IHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZXZhbHVhdGUoZXhwci52YWx1ZSk7XG4gICAgdGhpcy5zY29wZS5zZXQoZXhwci5uYW1lLmxleGVtZSwgdmFsdWUpO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdEtleUV4cHIoZXhwcjogRXhwci5LZXkpOiBhbnkge1xuICAgIHJldHVybiBleHByLm5hbWUubGl0ZXJhbDtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdEdldEV4cHIoZXhwcjogRXhwci5HZXQpOiBhbnkge1xuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZXZhbHVhdGUoZXhwci5lbnRpdHkpO1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZXZhbHVhdGUoZXhwci5rZXkpO1xuICAgIGlmICghZW50aXR5ICYmIGV4cHIudHlwZSA9PT0gVG9rZW5UeXBlLlF1ZXN0aW9uRG90KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gZW50aXR5W2tleV07XG4gIH1cblxuICBwdWJsaWMgdmlzaXRTZXRFeHByKGV4cHI6IEV4cHIuU2V0KTogYW55IHtcbiAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmV2YWx1YXRlKGV4cHIuZW50aXR5KTtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmV2YWx1YXRlKGV4cHIua2V5KTtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZXZhbHVhdGUoZXhwci52YWx1ZSk7XG4gICAgZW50aXR5W2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgdmlzaXRQb3N0Zml4RXhwcihleHByOiBFeHByLlBvc3RmaXgpOiBhbnkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5ldmFsdWF0ZShleHByLmVudGl0eSk7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB2YWx1ZSArIGV4cHIuaW5jcmVtZW50O1xuXG4gICAgaWYgKGV4cHIuZW50aXR5IGluc3RhbmNlb2YgRXhwci5WYXJpYWJsZSkge1xuICAgICAgdGhpcy5zY29wZS5zZXQoZXhwci5lbnRpdHkubmFtZS5sZXhlbWUsIG5ld1ZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGV4cHIuZW50aXR5IGluc3RhbmNlb2YgRXhwci5HZXQpIHtcbiAgICAgIGNvbnN0IGFzc2lnbiA9IG5ldyBFeHByLlNldChcbiAgICAgICAgZXhwci5lbnRpdHkuZW50aXR5LFxuICAgICAgICBleHByLmVudGl0eS5rZXksXG4gICAgICAgIG5ldyBFeHByLkxpdGVyYWwobmV3VmFsdWUsIGV4cHIubGluZSksXG4gICAgICAgIGV4cHIubGluZVxuICAgICAgKTtcbiAgICAgIHRoaXMuZXZhbHVhdGUoYXNzaWduKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lcnJvcihLRXJyb3JDb2RlLklOVkFMSURfUE9TVEZJWF9MVkFMVUUsIHsgZW50aXR5OiBleHByLmVudGl0eSB9LCBleHByLmxpbmUpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdExpc3RFeHByKGV4cHI6IEV4cHIuTGlzdCk6IGFueSB7XG4gICAgY29uc3QgdmFsdWVzOiBhbnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZXhwcmVzc2lvbiBvZiBleHByLnZhbHVlKSB7XG4gICAgICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEV4cHIuU3ByZWFkKSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKC4uLnRoaXMuZXZhbHVhdGUoKGV4cHJlc3Npb24gYXMgRXhwci5TcHJlYWQpLnZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZXMucHVzaCh0aGlzLmV2YWx1YXRlKGV4cHJlc3Npb24pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdFNwcmVhZEV4cHIoZXhwcjogRXhwci5TcHJlYWQpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKGV4cHIudmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSB0ZW1wbGF0ZVBhcnNlKHNvdXJjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB0b2tlbnMgPSB0aGlzLnNjYW5uZXIuc2Nhbihzb3VyY2UpO1xuICAgIGNvbnN0IGV4cHJlc3Npb25zID0gdGhpcy5wYXJzZXIucGFyc2UodG9rZW5zLCBzb3VyY2UpO1xuICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgIGZvciAoY29uc3QgZXhwcmVzc2lvbiBvZiBleHByZXNzaW9ucykge1xuICAgICAgcmVzdWx0ICs9IHRoaXMuZXZhbHVhdGUoZXhwcmVzc2lvbikudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdFRlbXBsYXRlRXhwcihleHByOiBFeHByLlRlbXBsYXRlKTogYW55IHtcbiAgICBjb25zdCByZXN1bHQgPSBleHByLnZhbHVlLnJlcGxhY2UoXG4gICAgICAvXFx7XFx7KFtcXHNcXFNdKz8pXFx9XFx9L2csXG4gICAgICAobSwgcGxhY2Vob2xkZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVQYXJzZShwbGFjZWhvbGRlcik7XG4gICAgICB9XG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHZpc2l0QmluYXJ5RXhwcihleHByOiBFeHByLkJpbmFyeSk6IGFueSB7XG4gICAgY29uc3QgbGVmdCA9IHRoaXMuZXZhbHVhdGUoZXhwci5sZWZ0KTtcbiAgICBjb25zdCByaWdodCA9IHRoaXMuZXZhbHVhdGUoZXhwci5yaWdodCk7XG5cbiAgICBzd2l0Y2ggKGV4cHIub3BlcmF0b3IudHlwZSkge1xuICAgICAgY2FzZSBUb2tlblR5cGUuTWludXM6XG4gICAgICBjYXNlIFRva2VuVHlwZS5NaW51c0VxdWFsOlxuICAgICAgICByZXR1cm4gbGVmdCAtIHJpZ2h0O1xuICAgICAgY2FzZSBUb2tlblR5cGUuU2xhc2g6XG4gICAgICBjYXNlIFRva2VuVHlwZS5TbGFzaEVxdWFsOlxuICAgICAgICByZXR1cm4gbGVmdCAvIHJpZ2h0O1xuICAgICAgY2FzZSBUb2tlblR5cGUuU3RhcjpcbiAgICAgIGNhc2UgVG9rZW5UeXBlLlN0YXJFcXVhbDpcbiAgICAgICAgcmV0dXJuIGxlZnQgKiByaWdodDtcbiAgICAgIGNhc2UgVG9rZW5UeXBlLlBlcmNlbnQ6XG4gICAgICBjYXNlIFRva2VuVHlwZS5QZXJjZW50RXF1YWw6XG4gICAgICAgIHJldHVybiBsZWZ0ICUgcmlnaHQ7XG4gICAgICBjYXNlIFRva2VuVHlwZS5QbHVzOlxuICAgICAgY2FzZSBUb2tlblR5cGUuUGx1c0VxdWFsOlxuICAgICAgICByZXR1cm4gbGVmdCArIHJpZ2h0O1xuICAgICAgY2FzZSBUb2tlblR5cGUuUGlwZTpcbiAgICAgICAgcmV0dXJuIGxlZnQgfCByaWdodDtcbiAgICAgIGNhc2UgVG9rZW5UeXBlLkNhcmV0OlxuICAgICAgICByZXR1cm4gbGVmdCBeIHJpZ2h0O1xuICAgICAgY2FzZSBUb2tlblR5cGUuR3JlYXRlcjpcbiAgICAgICAgcmV0dXJuIGxlZnQgPiByaWdodDtcbiAgICAgIGNhc2UgVG9rZW5UeXBlLkdyZWF0ZXJFcXVhbDpcbiAgICAgICAgcmV0dXJuIGxlZnQgPj0gcmlnaHQ7XG4gICAgICBjYXNlIFRva2VuVHlwZS5MZXNzOlxuICAgICAgICByZXR1cm4gbGVmdCA8IHJpZ2h0O1xuICAgICAgY2FzZSBUb2tlblR5cGUuTGVzc0VxdWFsOlxuICAgICAgICByZXR1cm4gbGVmdCA8PSByaWdodDtcbiAgICAgIGNhc2UgVG9rZW5UeXBlLkVxdWFsRXF1YWw6XG4gICAgICBjYXNlIFRva2VuVHlwZS5FcXVhbEVxdWFsRXF1YWw6XG4gICAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodDtcbiAgICAgIGNhc2UgVG9rZW5UeXBlLkJhbmdFcXVhbDpcbiAgICAgIGNhc2UgVG9rZW5UeXBlLkJhbmdFcXVhbEVxdWFsOlxuICAgICAgICByZXR1cm4gbGVmdCAhPT0gcmlnaHQ7XG4gICAgICBjYXNlIFRva2VuVHlwZS5JbnN0YW5jZW9mOlxuICAgICAgICByZXR1cm4gbGVmdCBpbnN0YW5jZW9mIHJpZ2h0O1xuICAgICAgY2FzZSBUb2tlblR5cGUuSW46XG4gICAgICAgIHJldHVybiBsZWZ0IGluIHJpZ2h0O1xuICAgICAgY2FzZSBUb2tlblR5cGUuTGVmdFNoaWZ0OlxuICAgICAgICByZXR1cm4gbGVmdCA8PCByaWdodDtcbiAgICAgIGNhc2UgVG9rZW5UeXBlLlJpZ2h0U2hpZnQ6XG4gICAgICAgIHJldHVybiBsZWZ0ID4+IHJpZ2h0O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5lcnJvcihLRXJyb3JDb2RlLlVOS05PV05fQklOQVJZX09QRVJBVE9SLCB7IG9wZXJhdG9yOiBleHByLm9wZXJhdG9yIH0sIGV4cHIubGluZSk7XG4gICAgICAgIHJldHVybiBudWxsOyAvLyB1bnJlYWNoYWJsZVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB2aXNpdExvZ2ljYWxFeHByKGV4cHI6IEV4cHIuTG9naWNhbCk6IGFueSB7XG4gICAgY29uc3QgbGVmdCA9IHRoaXMuZXZhbHVhdGUoZXhwci5sZWZ0KTtcblxuICAgIGlmIChleHByLm9wZXJhdG9yLnR5cGUgPT09IFRva2VuVHlwZS5Pcikge1xuICAgICAgaWYgKGxlZnQpIHtcbiAgICAgICAgcmV0dXJuIGxlZnQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghbGVmdCkge1xuICAgICAgICByZXR1cm4gbGVmdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShleHByLnJpZ2h0KTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdFRlcm5hcnlFeHByKGV4cHI6IEV4cHIuVGVybmFyeSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZXZhbHVhdGUoZXhwci5jb25kaXRpb24pXG4gICAgICA/IHRoaXMuZXZhbHVhdGUoZXhwci50aGVuRXhwcilcbiAgICAgIDogdGhpcy5ldmFsdWF0ZShleHByLmVsc2VFeHByKTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdE51bGxDb2FsZXNjaW5nRXhwcihleHByOiBFeHByLk51bGxDb2FsZXNjaW5nKTogYW55IHtcbiAgICBjb25zdCBsZWZ0ID0gdGhpcy5ldmFsdWF0ZShleHByLmxlZnQpO1xuICAgIGlmIChsZWZ0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKGV4cHIucmlnaHQpO1xuICAgIH1cbiAgICByZXR1cm4gbGVmdDtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdEdyb3VwaW5nRXhwcihleHByOiBFeHByLkdyb3VwaW5nKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShleHByLmV4cHJlc3Npb24pO1xuICB9XG5cbiAgcHVibGljIHZpc2l0TGl0ZXJhbEV4cHIoZXhwcjogRXhwci5MaXRlcmFsKTogYW55IHtcbiAgICByZXR1cm4gZXhwci52YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdFVuYXJ5RXhwcihleHByOiBFeHByLlVuYXJ5KTogYW55IHtcbiAgICBjb25zdCByaWdodCA9IHRoaXMuZXZhbHVhdGUoZXhwci5yaWdodCk7XG4gICAgc3dpdGNoIChleHByLm9wZXJhdG9yLnR5cGUpIHtcbiAgICAgIGNhc2UgVG9rZW5UeXBlLk1pbnVzOlxuICAgICAgICByZXR1cm4gLXJpZ2h0O1xuICAgICAgY2FzZSBUb2tlblR5cGUuQmFuZzpcbiAgICAgICAgcmV0dXJuICFyaWdodDtcbiAgICAgIGNhc2UgVG9rZW5UeXBlLlRpbGRlOlxuICAgICAgICByZXR1cm4gfnJpZ2h0O1xuICAgICAgY2FzZSBUb2tlblR5cGUuUGx1c1BsdXM6XG4gICAgICBjYXNlIFRva2VuVHlwZS5NaW51c01pbnVzOiB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID1cbiAgICAgICAgICBOdW1iZXIocmlnaHQpICsgKGV4cHIub3BlcmF0b3IudHlwZSA9PT0gVG9rZW5UeXBlLlBsdXNQbHVzID8gMSA6IC0xKTtcbiAgICAgICAgaWYgKGV4cHIucmlnaHQgaW5zdGFuY2VvZiBFeHByLlZhcmlhYmxlKSB7XG4gICAgICAgICAgdGhpcy5zY29wZS5zZXQoZXhwci5yaWdodC5uYW1lLmxleGVtZSwgbmV3VmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGV4cHIucmlnaHQgaW5zdGFuY2VvZiBFeHByLkdldCkge1xuICAgICAgICAgIGNvbnN0IGFzc2lnbiA9IG5ldyBFeHByLlNldChcbiAgICAgICAgICAgIGV4cHIucmlnaHQuZW50aXR5LFxuICAgICAgICAgICAgZXhwci5yaWdodC5rZXksXG4gICAgICAgICAgICBuZXcgRXhwci5MaXRlcmFsKG5ld1ZhbHVlLCBleHByLmxpbmUpLFxuICAgICAgICAgICAgZXhwci5saW5lXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmV2YWx1YXRlKGFzc2lnbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgICAgIEtFcnJvckNvZGUuSU5WQUxJRF9QUkVGSVhfUlZBTFVFLFxuICAgICAgICAgICAgeyByaWdodDogZXhwci5yaWdodCB9LFxuICAgICAgICAgICAgZXhwci5saW5lXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmVycm9yKEtFcnJvckNvZGUuVU5LTk9XTl9VTkFSWV9PUEVSQVRPUiwgeyBvcGVyYXRvcjogZXhwci5vcGVyYXRvciB9LCBleHByLmxpbmUpO1xuICAgICAgICByZXR1cm4gbnVsbDsgLy8gc2hvdWxkIGJlIHVucmVhY2hhYmxlXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHZpc2l0Q2FsbEV4cHIoZXhwcjogRXhwci5DYWxsKTogYW55IHtcbiAgICAvLyB2ZXJpZnkgY2FsbGVlIGlzIGEgZnVuY3Rpb25cbiAgICBjb25zdCBjYWxsZWUgPSB0aGlzLmV2YWx1YXRlKGV4cHIuY2FsbGVlKTtcbiAgICBpZiAoY2FsbGVlID09IG51bGwgJiYgZXhwci5vcHRpb25hbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIGNhbGxlZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLmVycm9yKEtFcnJvckNvZGUuTk9UX0FfRlVOQ1RJT04sIHsgY2FsbGVlOiBjYWxsZWUgfSwgZXhwci5saW5lKTtcbiAgICB9XG4gICAgLy8gZXZhbHVhdGUgZnVuY3Rpb24gYXJndW1lbnRzXG4gICAgY29uc3QgYXJncyA9IFtdO1xuICAgIGZvciAoY29uc3QgYXJndW1lbnQgb2YgZXhwci5hcmdzKSB7XG4gICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBFeHByLlNwcmVhZCkge1xuICAgICAgICBhcmdzLnB1c2goLi4udGhpcy5ldmFsdWF0ZSgoYXJndW1lbnQgYXMgRXhwci5TcHJlYWQpLnZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcmdzLnB1c2godGhpcy5ldmFsdWF0ZShhcmd1bWVudCkpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBleGVjdXRlIGZ1bmN0aW9uIOKAlCBwcmVzZXJ2ZSBgdGhpc2AgZm9yIG1ldGhvZCBjYWxsc1xuICAgIGlmIChleHByLmNhbGxlZSBpbnN0YW5jZW9mIEV4cHIuR2V0KSB7XG4gICAgICByZXR1cm4gY2FsbGVlLmFwcGx5KGV4cHIuY2FsbGVlLmVudGl0eS5yZXN1bHQsIGFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY2FsbGVlKC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB2aXNpdE5ld0V4cHIoZXhwcjogRXhwci5OZXcpOiBhbnkge1xuICAgIGNvbnN0IGNsYXp6ID0gdGhpcy5ldmFsdWF0ZShleHByLmNsYXp6KTtcblxuICAgIGlmICh0eXBlb2YgY2xhenogIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5lcnJvcihcbiAgICAgICAgS0Vycm9yQ29kZS5OT1RfQV9DTEFTUyxcbiAgICAgICAgeyBjbGF6ejogY2xhenogfSxcbiAgICAgICAgZXhwci5saW5lXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGFyZ3M6IGFueVtdID0gW107XG4gICAgZm9yIChjb25zdCBhcmcgb2YgZXhwci5hcmdzKSB7XG4gICAgICBhcmdzLnB1c2godGhpcy5ldmFsdWF0ZShhcmcpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBjbGF6eiguLi5hcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdERpY3Rpb25hcnlFeHByKGV4cHI6IEV4cHIuRGljdGlvbmFyeSk6IGFueSB7XG4gICAgY29uc3QgZGljdDogYW55ID0ge307XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBleHByLnByb3BlcnRpZXMpIHtcbiAgICAgIGlmIChwcm9wZXJ0eSBpbnN0YW5jZW9mIEV4cHIuU3ByZWFkKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZGljdCwgdGhpcy5ldmFsdWF0ZSgocHJvcGVydHkgYXMgRXhwci5TcHJlYWQpLnZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmV2YWx1YXRlKChwcm9wZXJ0eSBhcyBFeHByLlNldCkua2V5KTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmV2YWx1YXRlKChwcm9wZXJ0eSBhcyBFeHByLlNldCkudmFsdWUpO1xuICAgICAgICBkaWN0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRpY3Q7XG4gIH1cblxuICBwdWJsaWMgdmlzaXRUeXBlb2ZFeHByKGV4cHI6IEV4cHIuVHlwZW9mKTogYW55IHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMuZXZhbHVhdGUoZXhwci52YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgdmlzaXRFYWNoRXhwcihleHByOiBFeHByLkVhY2gpOiBhbnkge1xuICAgIHJldHVybiBbXG4gICAgICBleHByLm5hbWUubGV4ZW1lLFxuICAgICAgZXhwci5rZXkgPyBleHByLmtleS5sZXhlbWUgOiBudWxsLFxuICAgICAgdGhpcy5ldmFsdWF0ZShleHByLml0ZXJhYmxlKSxcbiAgICBdO1xuICB9XG5cbiAgdmlzaXRWb2lkRXhwcihleHByOiBFeHByLlZvaWQpOiBhbnkge1xuICAgIHRoaXMuZXZhbHVhdGUoZXhwci52YWx1ZSk7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICB2aXNpdERlYnVnRXhwcihleHByOiBFeHByLlZvaWQpOiBhbnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZXZhbHVhdGUoZXhwci52YWx1ZSk7XG4gICAgY29uc29sZS5sb2cocmVzdWx0KTtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxufVxuIiwiZXhwb3J0IGFic3RyYWN0IGNsYXNzIEtOb2RlIHtcbiAgICBwdWJsaWMgbGluZTogbnVtYmVyO1xuICAgIHB1YmxpYyB0eXBlOiBzdHJpbmc7XG4gICAgcHVibGljIGFic3RyYWN0IGFjY2VwdDxSPih2aXNpdG9yOiBLTm9kZVZpc2l0b3I8Uj4sIHBhcmVudD86IE5vZGUpOiBSO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEtOb2RlVmlzaXRvcjxSPiB7XG4gICAgdmlzaXRFbGVtZW50S05vZGUoa25vZGU6IEVsZW1lbnQsIHBhcmVudD86IE5vZGUpOiBSO1xuICAgIHZpc2l0QXR0cmlidXRlS05vZGUoa25vZGU6IEF0dHJpYnV0ZSwgcGFyZW50PzogTm9kZSk6IFI7XG4gICAgdmlzaXRUZXh0S05vZGUoa25vZGU6IFRleHQsIHBhcmVudD86IE5vZGUpOiBSO1xuICAgIHZpc2l0Q29tbWVudEtOb2RlKGtub2RlOiBDb21tZW50LCBwYXJlbnQ/OiBOb2RlKTogUjtcbiAgICB2aXNpdERvY3R5cGVLTm9kZShrbm9kZTogRG9jdHlwZSwgcGFyZW50PzogTm9kZSk6IFI7XG59XG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50IGV4dGVuZHMgS05vZGUge1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG4gICAgcHVibGljIGF0dHJpYnV0ZXM6IEtOb2RlW107XG4gICAgcHVibGljIGNoaWxkcmVuOiBLTm9kZVtdO1xuICAgIHB1YmxpYyBzZWxmOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBhdHRyaWJ1dGVzOiBLTm9kZVtdLCBjaGlsZHJlbjogS05vZGVbXSwgc2VsZjogYm9vbGVhbiwgbGluZTogbnVtYmVyID0gMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnZWxlbWVudCc7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgdGhpcy5zZWxmID0gc2VsZjtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWNjZXB0PFI+KHZpc2l0b3I6IEtOb2RlVmlzaXRvcjxSPiwgcGFyZW50PzogTm9kZSk6IFIge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdEVsZW1lbnRLTm9kZSh0aGlzLCBwYXJlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ0tOb2RlLkVsZW1lbnQnO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEF0dHJpYnV0ZSBleHRlbmRzIEtOb2RlIHtcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICAgIHB1YmxpYyB2YWx1ZTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBsaW5lOiBudW1iZXIgPSAwKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdhdHRyaWJ1dGUnO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gICAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBLTm9kZVZpc2l0b3I8Uj4sIHBhcmVudD86IE5vZGUpOiBSIHtcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRBdHRyaWJ1dGVLTm9kZSh0aGlzLCBwYXJlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ0tOb2RlLkF0dHJpYnV0ZSc7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGV4dCBleHRlbmRzIEtOb2RlIHtcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBzdHJpbmcsIGxpbmU6IG51bWJlciA9IDApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ3RleHQnO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgfVxuXG4gICAgcHVibGljIGFjY2VwdDxSPih2aXNpdG9yOiBLTm9kZVZpc2l0b3I8Uj4sIHBhcmVudD86IE5vZGUpOiBSIHtcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRUZXh0S05vZGUodGhpcywgcGFyZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICdLTm9kZS5UZXh0JztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21tZW50IGV4dGVuZHMgS05vZGUge1xuICAgIHB1YmxpYyB2YWx1ZTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IodmFsdWU6IHN0cmluZywgbGluZTogbnVtYmVyID0gMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnY29tbWVudCc7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWNjZXB0PFI+KHZpc2l0b3I6IEtOb2RlVmlzaXRvcjxSPiwgcGFyZW50PzogTm9kZSk6IFIge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdENvbW1lbnRLTm9kZSh0aGlzLCBwYXJlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ0tOb2RlLkNvbW1lbnQnO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERvY3R5cGUgZXh0ZW5kcyBLTm9kZSB7XG4gICAgcHVibGljIHZhbHVlOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogc3RyaW5nLCBsaW5lOiBudW1iZXIgPSAwKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdkb2N0eXBlJztcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmxpbmUgPSBsaW5lO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY2NlcHQ8Uj4odmlzaXRvcjogS05vZGVWaXNpdG9yPFI+LCBwYXJlbnQ/OiBOb2RlKTogUiB7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RG9jdHlwZUtOb2RlKHRoaXMsIHBhcmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnS05vZGUuRG9jdHlwZSc7XG4gICAgfVxufVxuXG4iLCJpbXBvcnQgeyBLYXNwZXJFcnJvciwgS0Vycm9yQ29kZSwgS0Vycm9yQ29kZVR5cGUgfSBmcm9tIFwiLi90eXBlcy9lcnJvclwiO1xuaW1wb3J0ICogYXMgTm9kZSBmcm9tIFwiLi90eXBlcy9ub2Rlc1wiO1xuaW1wb3J0IHsgU2VsZkNsb3NpbmdUYWdzLCBXaGl0ZVNwYWNlcyB9IGZyb20gXCIuL3R5cGVzL3Rva2VuXCI7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZVBhcnNlciB7XG4gIHB1YmxpYyBjdXJyZW50OiBudW1iZXI7XG4gIHB1YmxpYyBsaW5lOiBudW1iZXI7XG4gIHB1YmxpYyBjb2w6IG51bWJlcjtcbiAgcHVibGljIHNvdXJjZTogc3RyaW5nO1xuICBwdWJsaWMgbm9kZXM6IE5vZGUuS05vZGVbXTtcblxuICBwdWJsaWMgcGFyc2Uoc291cmNlOiBzdHJpbmcpOiBOb2RlLktOb2RlW10ge1xuICAgIHRoaXMuY3VycmVudCA9IDA7XG4gICAgdGhpcy5saW5lID0gMTtcbiAgICB0aGlzLmNvbCA9IDE7XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgdGhpcy5ub2RlcyA9IFtdO1xuXG4gICAgd2hpbGUgKCF0aGlzLmVvZigpKSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5ub2RlKCk7XG4gICAgICBpZiAobm9kZSA9PT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMubm9kZXMucHVzaChub2RlKTtcbiAgICB9XG4gICAgdGhpcy5zb3VyY2UgPSBcIlwiO1xuICAgIHJldHVybiB0aGlzLm5vZGVzO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXRjaCguLi5jaGFyczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgY2hhcnMpIHtcbiAgICAgIGlmICh0aGlzLmNoZWNrKGNoYXIpKSB7XG4gICAgICAgIHRoaXMuY3VycmVudCArPSBjaGFyLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYWR2YW5jZShlb2ZFcnJvcjogc3RyaW5nID0gXCJcIik6IHZvaWQge1xuICAgIGlmICghdGhpcy5lb2YoKSkge1xuICAgICAgaWYgKHRoaXMuY2hlY2soXCJcXG5cIikpIHtcbiAgICAgICAgdGhpcy5saW5lICs9IDE7XG4gICAgICAgIHRoaXMuY29sID0gMDtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5lb2YoKSkge1xuICAgICAgICB0aGlzLmN1cnJlbnQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXJyb3IoS0Vycm9yQ29kZS5VTkVYUEVDVEVEX0VPRiwgeyBlb2ZFcnJvcjogZW9mRXJyb3IgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwZWVrKC4uLmNoYXJzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgY2hhciBvZiBjaGFycykge1xuICAgICAgaWYgKHRoaXMuY2hlY2soY2hhcikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2soY2hhcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlLnNsaWNlKHRoaXMuY3VycmVudCwgdGhpcy5jdXJyZW50ICsgY2hhci5sZW5ndGgpID09PSBjaGFyO1xuICB9XG5cbiAgcHJpdmF0ZSBlb2YoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudCA+IHRoaXMuc291cmNlLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgZXJyb3IoY29kZTogS0Vycm9yQ29kZVR5cGUsIGFyZ3M6IGFueSA9IHt9KTogYW55IHtcbiAgICB0aHJvdyBuZXcgS2FzcGVyRXJyb3IoY29kZSwgYXJncywgeyBsaW5lOiB0aGlzLmxpbmUsIGNvbDogdGhpcy5jb2wsIHNvdXJjZTogdGhpcy5zb3VyY2UgfSk7XG4gIH1cblxuICBwcml2YXRlIG5vZGUoKTogTm9kZS5LTm9kZSB7XG4gICAgdGhpcy53aGl0ZXNwYWNlKCk7XG4gICAgbGV0IG5vZGU6IE5vZGUuS05vZGU7XG5cbiAgICBpZiAodGhpcy5tYXRjaChcIjwvXCIpKSB7XG4gICAgICB0aGlzLmVycm9yKEtFcnJvckNvZGUuVU5FWFBFQ1RFRF9DTE9TSU5HX1RBRyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWF0Y2goXCI8IS0tXCIpKSB7XG4gICAgICBub2RlID0gdGhpcy5jb21tZW50KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1hdGNoKFwiPCFkb2N0eXBlXCIpIHx8IHRoaXMubWF0Y2goXCI8IURPQ1RZUEVcIikpIHtcbiAgICAgIG5vZGUgPSB0aGlzLmRvY3R5cGUoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWF0Y2goXCI8XCIpKSB7XG4gICAgICBub2RlID0gdGhpcy5lbGVtZW50KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUgPSB0aGlzLnRleHQoKTtcbiAgICB9XG5cbiAgICB0aGlzLndoaXRlc3BhY2UoKTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHByaXZhdGUgY29tbWVudCgpOiBudWxsIHtcbiAgICBkbyB7XG4gICAgICB0aGlzLmFkdmFuY2UoXCJFeHBlY3RlZCBjb21tZW50IGNsb3NpbmcgJy0tPidcIik7XG4gICAgfSB3aGlsZSAoIXRoaXMubWF0Y2goYC0tPmApKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZG9jdHlwZSgpOiBOb2RlLktOb2RlIHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuY3VycmVudDtcbiAgICBkbyB7XG4gICAgICB0aGlzLmFkdmFuY2UoXCJFeHBlY3RlZCBjbG9zaW5nIGRvY3R5cGVcIik7XG4gICAgfSB3aGlsZSAoIXRoaXMubWF0Y2goYD5gKSk7XG4gICAgY29uc3QgZG9jdHlwZSA9IHRoaXMuc291cmNlLnNsaWNlKHN0YXJ0LCB0aGlzLmN1cnJlbnQgLSAxKS50cmltKCk7XG4gICAgcmV0dXJuIG5ldyBOb2RlLkRvY3R5cGUoZG9jdHlwZSwgdGhpcy5saW5lKTtcbiAgfVxuXG4gIHByaXZhdGUgZWxlbWVudCgpOiBOb2RlLktOb2RlIHtcbiAgICBjb25zdCBsaW5lID0gdGhpcy5saW5lO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmlkZW50aWZpZXIoXCIvXCIsIFwiPlwiKTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRoaXMuZXJyb3IoS0Vycm9yQ29kZS5FWFBFQ1RFRF9UQUdfTkFNRSk7XG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcygpO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5tYXRjaChcIi8+XCIpIHx8XG4gICAgICAoU2VsZkNsb3NpbmdUYWdzLmluY2x1ZGVzKG5hbWUpICYmIHRoaXMubWF0Y2goXCI+XCIpKVxuICAgICkge1xuICAgICAgcmV0dXJuIG5ldyBOb2RlLkVsZW1lbnQobmFtZSwgYXR0cmlidXRlcywgW10sIHRydWUsIHRoaXMubGluZSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm1hdGNoKFwiPlwiKSkge1xuICAgICAgdGhpcy5lcnJvcihLRXJyb3JDb2RlLkVYUEVDVEVEX0NMT1NJTkdfQlJBQ0tFVCk7XG4gICAgfVxuXG4gICAgbGV0IGNoaWxkcmVuOiBOb2RlLktOb2RlW10gPSBbXTtcbiAgICB0aGlzLndoaXRlc3BhY2UoKTtcbiAgICBpZiAoIXRoaXMucGVlayhcIjwvXCIpKSB7XG4gICAgICBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4obmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZShuYW1lKTtcbiAgICByZXR1cm4gbmV3IE5vZGUuRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzLCBjaGlsZHJlbiwgZmFsc2UsIGxpbmUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWF0Y2goXCI8L1wiKSkge1xuICAgICAgdGhpcy5lcnJvcihLRXJyb3JDb2RlLkVYUEVDVEVEX0NMT1NJTkdfVEFHLCB7IG5hbWU6IG5hbWUgfSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5tYXRjaChgJHtuYW1lfWApKSB7XG4gICAgICB0aGlzLmVycm9yKEtFcnJvckNvZGUuRVhQRUNURURfQ0xPU0lOR19UQUcsIHsgbmFtZTogbmFtZSB9KTtcbiAgICB9XG4gICAgdGhpcy53aGl0ZXNwYWNlKCk7XG4gICAgaWYgKCF0aGlzLm1hdGNoKFwiPlwiKSkge1xuICAgICAgdGhpcy5lcnJvcihLRXJyb3JDb2RlLkVYUEVDVEVEX0NMT1NJTkdfVEFHLCB7IG5hbWU6IG5hbWUgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGlsZHJlbihwYXJlbnQ6IHN0cmluZyk6IE5vZGUuS05vZGVbXSB7XG4gICAgY29uc3QgY2hpbGRyZW46IE5vZGUuS05vZGVbXSA9IFtdO1xuICAgIGRvIHtcbiAgICAgIGlmICh0aGlzLmVvZigpKSB7XG4gICAgICAgIHRoaXMuZXJyb3IoS0Vycm9yQ29kZS5FWFBFQ1RFRF9DTE9TSU5HX1RBRywgeyBuYW1lOiBwYXJlbnQgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5ub2RlKCk7XG4gICAgICBpZiAobm9kZSA9PT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgfSB3aGlsZSAoIXRoaXMucGVlayhgPC9gKSk7XG5cbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICBwcml2YXRlIGF0dHJpYnV0ZXMoKTogTm9kZS5BdHRyaWJ1dGVbXSB7XG4gICAgY29uc3QgYXR0cmlidXRlczogTm9kZS5BdHRyaWJ1dGVbXSA9IFtdO1xuICAgIHdoaWxlICghdGhpcy5wZWVrKFwiPlwiLCBcIi8+XCIpICYmICF0aGlzLmVvZigpKSB7XG4gICAgICB0aGlzLndoaXRlc3BhY2UoKTtcbiAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLmxpbmU7XG4gICAgICBjb25zdCBuYW1lID0gdGhpcy5pZGVudGlmaWVyKFwiPVwiLCBcIj5cIiwgXCIvPlwiKTtcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aGlzLmVycm9yKEtFcnJvckNvZGUuQkxBTktfQVRUUklCVVRFX05BTUUpO1xuICAgICAgfVxuICAgICAgdGhpcy53aGl0ZXNwYWNlKCk7XG4gICAgICBsZXQgdmFsdWUgPSBcIlwiO1xuICAgICAgaWYgKHRoaXMubWF0Y2goXCI9XCIpKSB7XG4gICAgICAgIHRoaXMud2hpdGVzcGFjZSgpO1xuICAgICAgICBpZiAodGhpcy5tYXRjaChcIidcIikpIHtcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuZGVjb2RlRW50aXRpZXModGhpcy5zdHJpbmcoXCInXCIpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1hdGNoKCdcIicpKSB7XG4gICAgICAgICAgdmFsdWUgPSB0aGlzLmRlY29kZUVudGl0aWVzKHRoaXMuc3RyaW5nKCdcIicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuZGVjb2RlRW50aXRpZXModGhpcy5pZGVudGlmaWVyKFwiPlwiLCBcIi8+XCIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy53aGl0ZXNwYWNlKCk7XG4gICAgICBhdHRyaWJ1dGVzLnB1c2gobmV3IE5vZGUuQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBsaW5lKSk7XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGVzO1xuICB9XG5cbiAgcHJpdmF0ZSB0ZXh0KCk6IE5vZGUuS05vZGUge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5jdXJyZW50O1xuICAgIGNvbnN0IGxpbmUgPSB0aGlzLmxpbmU7XG4gICAgbGV0IGRlcHRoID0gMDtcbiAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoKFwie3tcIikpIHsgZGVwdGgrKzsgY29udGludWU7IH1cbiAgICAgIGlmIChkZXB0aCA+IDAgJiYgdGhpcy5tYXRjaChcIn19XCIpKSB7IGRlcHRoLS07IGNvbnRpbnVlOyB9XG4gICAgICBpZiAoZGVwdGggPT09IDAgJiYgdGhpcy5wZWVrKFwiPFwiKSkgeyBicmVhazsgfVxuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuICAgIGNvbnN0IHJhdyA9IHRoaXMuc291cmNlLnNsaWNlKHN0YXJ0LCB0aGlzLmN1cnJlbnQpLnRyaW0oKTtcbiAgICBpZiAoIXJhdykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTm9kZS5UZXh0KHRoaXMuZGVjb2RlRW50aXRpZXMocmF3KSwgbGluZSk7XG4gIH1cblxuICBwcml2YXRlIGRlY29kZUVudGl0aWVzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRleHRcbiAgICAgIC5yZXBsYWNlKC8mbmJzcDsvZywgXCJcXHUwMGEwXCIpXG4gICAgICAucmVwbGFjZSgvJmx0Oy9nLCBcIjxcIilcbiAgICAgIC5yZXBsYWNlKC8mZ3Q7L2csIFwiPlwiKVxuICAgICAgLnJlcGxhY2UoLyZxdW90Oy9nLCAnXCInKVxuICAgICAgLnJlcGxhY2UoLyZhcG9zOy9nLCBcIidcIilcbiAgICAgIC5yZXBsYWNlKC8mYW1wOy9nLCBcIiZcIik7IC8vIG11c3QgYmUgbGFzdCB0byBhdm9pZCBkb3VibGUtZGVjb2RpbmdcbiAgfVxuXG4gIHByaXZhdGUgd2hpdGVzcGFjZSgpOiBudW1iZXIge1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgd2hpbGUgKHRoaXMucGVlayguLi5XaGl0ZVNwYWNlcykgJiYgIXRoaXMuZW9mKCkpIHtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgcHJpdmF0ZSBpZGVudGlmaWVyKC4uLmNsb3Npbmc6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICB0aGlzLndoaXRlc3BhY2UoKTtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuY3VycmVudDtcbiAgICB3aGlsZSAoIXRoaXMucGVlayguLi5XaGl0ZVNwYWNlcywgLi4uY2xvc2luZykpIHtcbiAgICAgIHRoaXMuYWR2YW5jZShgRXhwZWN0ZWQgY2xvc2luZyAke2Nsb3Npbmd9YCk7XG4gICAgfVxuICAgIGNvbnN0IGVuZCA9IHRoaXMuY3VycmVudDtcbiAgICB0aGlzLndoaXRlc3BhY2UoKTtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc2xpY2Uoc3RhcnQsIGVuZCkudHJpbSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdHJpbmcoY2xvc2luZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuY3VycmVudDtcbiAgICB3aGlsZSAoIXRoaXMubWF0Y2goY2xvc2luZykpIHtcbiAgICAgIHRoaXMuYWR2YW5jZShgRXhwZWN0ZWQgY2xvc2luZyAke2Nsb3Npbmd9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNvdXJjZS5zbGljZShzdGFydCwgdGhpcy5jdXJyZW50IC0gMSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbXBvbmVudCwgQ29tcG9uZW50Q2xhc3MgfSBmcm9tIFwiLi9jb21wb25lbnRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZUNvbmZpZyB7XG4gIHBhdGg6IHN0cmluZztcbiAgY29tcG9uZW50OiBDb21wb25lbnRDbGFzcztcbiAgZ3VhcmQ/OiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmF2aWdhdGUocGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGhpc3RvcnkucHVzaFN0YXRlKG51bGwsIFwiXCIsIHBhdGgpO1xuICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgUG9wU3RhdGVFdmVudChcInBvcHN0YXRlXCIpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoUGF0aChwYXR0ZXJuOiBzdHJpbmcsIHBhdGhuYW1lOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgbnVsbCB7XG4gIGlmIChwYXR0ZXJuID09PSBcIipcIikgcmV0dXJuIHt9O1xuICBjb25zdCBwYXR0ZXJuUGFydHMgPSBwYXR0ZXJuLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IHBhdGhQYXJ0cyA9IHBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gIGlmIChwYXR0ZXJuUGFydHMubGVuZ3RoICE9PSBwYXRoUGFydHMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHBhdHRlcm5QYXJ0c1tpXS5zdGFydHNXaXRoKFwiOlwiKSkge1xuICAgICAgcGFyYW1zW3BhdHRlcm5QYXJ0c1tpXS5zbGljZSgxKV0gPSBwYXRoUGFydHNbaV07XG4gICAgfSBlbHNlIGlmIChwYXR0ZXJuUGFydHNbaV0gIT09IHBhdGhQYXJ0c1tpXSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYXJhbXM7XG59XG5cbmV4cG9ydCBjbGFzcyBSb3V0ZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICBwcml2YXRlIHJvdXRlczogUm91dGVDb25maWdbXSA9IFtdO1xuXG4gIHNldFJvdXRlcyhyb3V0ZXM6IFJvdXRlQ29uZmlnW10pOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlcyA9IHJvdXRlcztcbiAgfVxuXG4gIG9uTW91bnQoKTogdm9pZCB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCAoKSA9PiB0aGlzLl9uYXZpZ2F0ZSgpLCB7XG4gICAgICBzaWduYWw6IHRoaXMuJGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgdGhpcy5fbmF2aWdhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX25hdmlnYXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhdGhuYW1lID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGZvciAoY29uc3Qgcm91dGUgb2YgdGhpcy5yb3V0ZXMpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG1hdGNoUGF0aChyb3V0ZS5wYXRoLCBwYXRobmFtZSk7XG4gICAgICBpZiAocGFyYW1zID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgIGlmIChyb3V0ZS5ndWFyZCkge1xuICAgICAgICBjb25zdCBhbGxvd2VkID0gYXdhaXQgcm91dGUuZ3VhcmQoKTtcbiAgICAgICAgaWYgKCFhbGxvd2VkKSByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9tb3VudChyb3V0ZS5jb21wb25lbnQsIHBhcmFtcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbW91bnQoQ29tcG9uZW50Q2xhc3M6IENvbXBvbmVudENsYXNzLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiB2b2lkIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5yZWYgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCFlbGVtZW50IHx8ICF0aGlzLnRyYW5zcGlsZXIpIHJldHVybjtcbiAgICB0aGlzLnRyYW5zcGlsZXIubW91bnRDb21wb25lbnQoQ29tcG9uZW50Q2xhc3MsIGVsZW1lbnQsIHBhcmFtcyk7XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBCb3VuZGFyeSB7XG4gIHByaXZhdGUgc3RhcnQ6IENvbW1lbnQ7XG4gIHByaXZhdGUgZW5kOiBDb21tZW50O1xuXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogTm9kZSwgbGFiZWw6IHN0cmluZyA9IFwiYm91bmRhcnlcIikge1xuICAgIHRoaXMuc3RhcnQgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KGAke2xhYmVsfS1zdGFydGApO1xuICAgIHRoaXMuZW5kID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChgJHtsYWJlbH0tZW5kYCk7XG4gICAgaWYgKChwYXJlbnQgYXMgYW55KS5pbnNlcnQgJiYgdHlwZW9mIChwYXJlbnQgYXMgYW55KS5pbnNlcnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgKHBhcmVudCBhcyBhbnkpLmluc2VydCh0aGlzLnN0YXJ0KTtcbiAgICAgIChwYXJlbnQgYXMgYW55KS5pbnNlcnQodGhpcy5lbmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5zdGFydCk7XG4gICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5lbmQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICBsZXQgY3VycmVudCA9IHRoaXMuc3RhcnQubmV4dFNpYmxpbmc7XG4gICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gdGhpcy5lbmQpIHtcbiAgICAgIGNvbnN0IHRvUmVtb3ZlID0gY3VycmVudDtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHRTaWJsaW5nO1xuICAgICAgdG9SZW1vdmUucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodG9SZW1vdmUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpbnNlcnQobm9kZTogTm9kZSk6IHZvaWQge1xuICAgIHRoaXMuZW5kLnBhcmVudE5vZGU/Lmluc2VydEJlZm9yZShub2RlLCB0aGlzLmVuZCk7XG4gIH1cblxuICBwdWJsaWMgbm9kZXMoKTogTm9kZVtdIHtcbiAgICBjb25zdCByZXN1bHQ6IE5vZGVbXSA9IFtdO1xuICAgIGxldCBjdXJyZW50ID0gdGhpcy5zdGFydC5uZXh0U2libGluZztcbiAgICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSB0aGlzLmVuZCkge1xuICAgICAgcmVzdWx0LnB1c2goY3VycmVudCk7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0U2libGluZztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50KCk6IE5vZGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydC5wYXJlbnROb2RlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRcIjtcbmltcG9ydCB7IGhhbmRsZUVycm9yIH0gZnJvbSBcIi4vZXJyb3ItaGFuZGxlclwiO1xuXG50eXBlIFRhc2sgPSAoKSA9PiB2b2lkO1xuXG5jb25zdCBxdWV1ZSA9IG5ldyBNYXA8Q29tcG9uZW50LCBUYXNrW10+KCk7XG5jb25zdCBuZXh0VGlja0NhbGxiYWNrczogVGFza1tdID0gW107XG5sZXQgaXNTY2hlZHVsZWQgPSBmYWxzZTtcbmxldCBiYXRjaGluZ0VuYWJsZWQgPSB0cnVlO1xuXG5mdW5jdGlvbiBmbHVzaCgpIHtcbiAgaXNTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAvLyAxLiBQcm9jZXNzIGNvbXBvbmVudCB1cGRhdGVzXG4gIGZvciAoY29uc3QgW2luc3RhbmNlLCB0YXNrc10gb2YgcXVldWUuZW50cmllcygpKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENhbGwgcHJlLXVwZGF0ZSBob29rIChvbmx5IGZvciByZWFjdGl2ZSB1cGRhdGVzLCBub3QgZmlyc3QgbW91bnQpXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLm9uQ2hhbmdlcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGluc3RhbmNlLm9uQ2hhbmdlcygpO1xuICAgICAgfVxuXG4gICAgICAvLyBSdW4gYWxsIHN1cmdpY2FsIERPTSB1cGRhdGVzIGZvciB0aGlzIGNvbXBvbmVudFxuICAgICAgZm9yIChjb25zdCB0YXNrIG9mIHRhc2tzKSB7XG4gICAgICAgIHRhc2soKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsbCBwb3N0LXVwZGF0ZSBob29rXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLm9uUmVuZGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgaW5zdGFuY2Uub25SZW5kZXIoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBoYW5kbGVFcnJvcihlLCAncmVuZGVyJywgaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuICBxdWV1ZS5jbGVhcigpO1xuXG4gIC8vIDIuIFByb2Nlc3MgbmV4dFRpY2sgY2FsbGJhY2tzXG4gIGNvbnN0IGNhbGxiYWNrcyA9IG5leHRUaWNrQ2FsbGJhY2tzLnNwbGljZSgwKTtcbiAgZm9yIChjb25zdCBjYiBvZiBjYWxsYmFja3MpIHtcbiAgICB0cnkge1xuICAgICAgY2IoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBoYW5kbGVFcnJvcihlLCAncmVuZGVyJyk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWV1ZVVwZGF0ZShpbnN0YW5jZTogQ29tcG9uZW50LCB0YXNrOiBUYXNrKSB7XG4gIGlmICghYmF0Y2hpbmdFbmFibGVkKSB7XG4gICAgdGFzaygpO1xuICAgIC8vIER1cmluZyBzeW5jIG1vdW50LCB3ZSBkb24ndCBjYWxsIG9uQ2hhbmdlcyBvciBvblJlbmRlciBoZXJlLlxuICAgIC8vIG9uUmVuZGVyIGlzIGNhbGxlZCBtYW51YWxseSBhdCB0aGUgZW5kIG9mIHRyYW5zcGlsZS9ib290c3RyYXAuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFxdWV1ZS5oYXMoaW5zdGFuY2UpKSB7XG4gICAgcXVldWUuc2V0KGluc3RhbmNlLCBbXSk7XG4gIH1cbiAgcXVldWUuZ2V0KGluc3RhbmNlKSEucHVzaCh0YXNrKTtcblxuICBpZiAoIWlzU2NoZWR1bGVkKSB7XG4gICAgaXNTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHF1ZXVlTWljcm90YXNrKGZsdXNoKTtcbiAgfVxufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGEgZnVuY3Rpb24gd2l0aCBiYXRjaGluZyBkaXNhYmxlZC4gXG4gKiBVc2VkIGZvciBpbml0aWFsIG1vdW50IGFuZCBtYW51YWwgcmVuZGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQmF0Y2hpbmcoKTogYm9vbGVhbiB7XG4gIHJldHVybiBiYXRjaGluZ0VuYWJsZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmbHVzaFN5bmMoZm46ICgpID0+IHZvaWQpIHtcbiAgY29uc3QgcHJldiA9IGJhdGNoaW5nRW5hYmxlZDtcbiAgYmF0Y2hpbmdFbmFibGVkID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBiYXRjaGluZ0VuYWJsZWQgPSBwcmV2O1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgbmV4dCBmcmFtZXdvcmsgdXBkYXRlIGN5Y2xlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV4dFRpY2soKTogUHJvbWlzZTx2b2lkPjtcbmV4cG9ydCBmdW5jdGlvbiBuZXh0VGljayhjYjogVGFzayk6IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gbmV4dFRpY2soY2I/OiBUYXNrKTogUHJvbWlzZTx2b2lkPiB8IHZvaWQge1xuICBpZiAoY2IpIHtcbiAgICBuZXh0VGlja0NhbGxiYWNrcy5wdXNoKGNiKTtcbiAgICBpZiAoIWlzU2NoZWR1bGVkKSB7XG4gICAgICBpc1NjaGVkdWxlZCA9IHRydWU7XG4gICAgICBxdWV1ZU1pY3JvdGFzayhmbHVzaCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIG5leHRUaWNrQ2FsbGJhY2tzLnB1c2gocmVzb2x2ZSk7XG4gICAgaWYgKCFpc1NjaGVkdWxlZCkge1xuICAgICAgaXNTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgcXVldWVNaWNyb3Rhc2soZmx1c2gpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnRDbGFzcywgQ29tcG9uZW50UmVnaXN0cnkgfSBmcm9tIFwiLi9jb21wb25lbnRcIjtcbmltcG9ydCB7IEV4cHJlc3Npb25QYXJzZXIgfSBmcm9tIFwiLi9leHByZXNzaW9uLXBhcnNlclwiO1xuaW1wb3J0IHsgSW50ZXJwcmV0ZXIgfSBmcm9tIFwiLi9pbnRlcnByZXRlclwiO1xuaW1wb3J0IHsgUm91dGVyLCBSb3V0ZUNvbmZpZyB9IGZyb20gXCIuL3JvdXRlclwiO1xuaW1wb3J0IHsgU2Nhbm5lciB9IGZyb20gXCIuL3NjYW5uZXJcIjtcbmltcG9ydCB7IFNjb3BlIH0gZnJvbSBcIi4vc2NvcGVcIjtcbmltcG9ydCB7IGVmZmVjdCB9IGZyb20gXCIuL3NpZ25hbFwiO1xuaW1wb3J0IHsgQm91bmRhcnkgfSBmcm9tIFwiLi9ib3VuZGFyeVwiO1xuaW1wb3J0IHsgVGVtcGxhdGVQYXJzZXIgfSBmcm9tIFwiLi90ZW1wbGF0ZS1wYXJzZXJcIjtcbmltcG9ydCB7IHF1ZXVlVXBkYXRlLCBmbHVzaFN5bmMgfSBmcm9tIFwiLi9zY2hlZHVsZXJcIjtcbmltcG9ydCB7IEthc3BlckVycm9yLCBLRXJyb3JDb2RlLCBLRXJyb3JDb2RlVHlwZSB9IGZyb20gXCIuL3R5cGVzL2Vycm9yXCI7XG5pbXBvcnQgeyBoYW5kbGVFcnJvciB9IGZyb20gXCIuL2Vycm9yLWhhbmRsZXJcIjtcbmltcG9ydCB7IGlzQmF0Y2hpbmcgfSBmcm9tIFwiLi9zY2hlZHVsZXJcIjtcbmltcG9ydCAqIGFzIEtOb2RlIGZyb20gXCIuL3R5cGVzL25vZGVzXCI7XG5cbmNvbnN0IEtFWV9NQVA6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHtcbiAgZXNjOiBbXCJFc2NhcGVcIiwgXCJFc2NcIl0sXG4gIGVzY2FwZTogW1wiRXNjYXBlXCIsIFwiRXNjXCJdLFxuICBzcGFjZTogW1wiIFwiLCBcIlNwYWNlYmFyXCJdLFxuICB1cDogW1wiQXJyb3dVcFwiLCBcIlVwXCJdLFxuICBkb3duOiBbXCJBcnJvd0Rvd25cIiwgXCJEb3duXCJdLFxuICBsZWZ0OiBbXCJBcnJvd0xlZnRcIiwgXCJMZWZ0XCJdLFxuICByaWdodDogW1wiQXJyb3dSaWdodFwiLCBcIlJpZ2h0XCJdLFxuICBkZWw6IFtcIkRlbGV0ZVwiLCBcIkRlbFwiXSxcbiAgZGVsZXRlOiBbXCJEZWxldGVcIiwgXCJEZWxcIl0sXG4gIGluczogW1wiSW5zZXJ0XCJdLFxuICBkb3Q6IFtcIi5cIl0sXG4gIGNvbW1hOiBbXCIsXCJdLFxuICBzbGFzaDogW1wiL1wiXSxcbiAgYmFja3NsYXNoOiBbXCJcXFxcXCJdLFxuICBwbHVzOiBbXCIrXCJdLFxuICBtaW51czogW1wiLVwiXSxcbiAgZXF1YWw6IFtcIj1cIl0sXG59O1xuXG50eXBlIElmRWxzZU5vZGUgPSBbS05vZGUuRWxlbWVudCwgS05vZGUuQXR0cmlidXRlXTtcblxuZXhwb3J0IGNsYXNzIFRyYW5zcGlsZXIgaW1wbGVtZW50cyBLTm9kZS5LTm9kZVZpc2l0b3I8dm9pZD4ge1xuICBwcml2YXRlIHNjYW5uZXIgPSBuZXcgU2Nhbm5lcigpO1xuICBwcml2YXRlIHBhcnNlciA9IG5ldyBFeHByZXNzaW9uUGFyc2VyKCk7XG4gIHByaXZhdGUgdGVtcGxhdGVQYXJzZXIgPSBuZXcgVGVtcGxhdGVQYXJzZXIoKTtcbiAgcHJpdmF0ZSBpbnRlcnByZXRlciA9IG5ldyBJbnRlcnByZXRlcigpO1xuICBwdWJsaWMgcmVnaXN0cnk6IENvbXBvbmVudFJlZ2lzdHJ5ID0ge307XG4gIHB1YmxpYyBtb2RlOiBcImRldmVsb3BtZW50XCIgfCBcInByb2R1Y3Rpb25cIiA9IFwiZGV2ZWxvcG1lbnRcIjtcbiAgcHJpdmF0ZSBpc1JlbmRlcmluZyA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiB7IHJlZ2lzdHJ5OiBDb21wb25lbnRSZWdpc3RyeSB9KSB7XG4gICAgdGhpcy5yZWdpc3RyeVtcInJvdXRlclwiXSA9IHsgY29tcG9uZW50OiBSb3V0ZXIgfTtcbiAgICBpZiAoIW9wdGlvbnMpIHJldHVybjtcbiAgICBpZiAob3B0aW9ucy5yZWdpc3RyeSkge1xuICAgICAgdGhpcy5yZWdpc3RyeSA9IHsgLi4udGhpcy5yZWdpc3RyeSwgLi4ub3B0aW9ucy5yZWdpc3RyeSB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ29tcG9uZW50SW5zdGFuY2UoXG4gICAgaW5zdGFuY2U6IGFueSxcbiAgICBub2RlczogS05vZGUuS05vZGVbXSxcbiAgICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICByZXN0b3JlU2NvcGU6IFNjb3BlLFxuICAgIHNsb3RzPzogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiB2b2lkIHtcbiAgICBpZiAoc2xvdHMpIGluc3RhbmNlLiRzbG90cyA9IHNsb3RzO1xuXG4gICAgaW5zdGFuY2UuJHJlbmRlciA9ICgpID0+IHtcbiAgICAgIHRoaXMuaXNSZW5kZXJpbmcgPSB0cnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5kZXN0cm95KGVsZW1lbnQpO1xuICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gbmV3IFNjb3BlKHJlc3RvcmVTY29wZSwgaW5zdGFuY2UpO1xuICAgICAgICBzY29wZS5zZXQoXCIkaW5zdGFuY2VcIiwgaW5zdGFuY2UpO1xuICAgICAgICBpZiAoc2xvdHMpIGluc3RhbmNlLiRzbG90cyA9IHNsb3RzO1xuICAgICAgICBjb25zdCBwcmV2U2NvcGUgPSB0aGlzLmludGVycHJldGVyLnNjb3BlO1xuICAgICAgICB0aGlzLmludGVycHJldGVyLnNjb3BlID0gc2NvcGU7XG4gICAgICAgIGZsdXNoU3luYygoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jcmVhdGVTaWJsaW5ncyhub2RlcywgZWxlbWVudCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5vblJlbmRlciA9PT0gXCJmdW5jdGlvblwiKSBpbnN0YW5jZS5vblJlbmRlcigpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbnRlcnByZXRlci5zY29wZSA9IHByZXZTY29wZTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuaXNSZW5kZXJpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5vbk1vdW50ID09PSBcImZ1bmN0aW9uXCIpIGluc3RhbmNlLm9uTW91bnQoKTtcblxuICAgIGNvbnN0IHNjb3BlID0gbmV3IFNjb3BlKHJlc3RvcmVTY29wZSwgaW5zdGFuY2UpO1xuICAgIHNjb3BlLnNldChcIiRpbnN0YW5jZVwiLCBpbnN0YW5jZSk7XG4gICAgdGhpcy5pbnRlcnByZXRlci5zY29wZSA9IHNjb3BlO1xuICAgIGZsdXNoU3luYygoKSA9PiB7XG4gICAgICB0aGlzLmNyZWF0ZVNpYmxpbmdzKG5vZGVzLCBlbGVtZW50KTtcbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2Uub25SZW5kZXIgPT09IFwiZnVuY3Rpb25cIikgaW5zdGFuY2Uub25SZW5kZXIoKTtcbiAgICB9KTtcbiAgICB0aGlzLmludGVycHJldGVyLnNjb3BlID0gcmVzdG9yZVNjb3BlO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmVOb2Rlcyh0YWc6IHN0cmluZyk6IEtOb2RlLktOb2RlW10ge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5yZWdpc3RyeVt0YWddO1xuICAgIGlmIChlbnRyeS5ub2RlcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZW50cnkubm9kZXM7XG4gICAgY29uc3Qgc291cmNlID0gKGVudHJ5LmNvbXBvbmVudCBhcyBhbnkpLnRlbXBsYXRlO1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICBlbnRyeS5ub2RlcyA9IFtdO1xuICAgICAgcmV0dXJuIGVudHJ5Lm5vZGVzO1xuICAgIH1cbiAgICBlbnRyeS5ub2RlcyA9IHRoaXMudGVtcGxhdGVQYXJzZXIucGFyc2Uoc291cmNlKTtcbiAgICByZXR1cm4gZW50cnkubm9kZXM7XG4gIH1cblxuICBwcml2YXRlIGV2YWx1YXRlKG5vZGU6IEtOb2RlLktOb2RlLCBwYXJlbnQ/OiBOb2RlKTogdm9pZCB7XG4gICAgaWYgKG5vZGUudHlwZSA9PT0gXCJlbGVtZW50XCIpIHtcbiAgICAgIGNvbnN0IGVsID0gbm9kZSBhcyBLTm9kZS5FbGVtZW50O1xuICAgICAgY29uc3QgbWlzcGxhY2VkID0gdGhpcy5maW5kQXR0cihlbCwgW1wiQGVsc2VpZlwiLCBcIkBlbHNlXCJdKTtcbiAgICAgIGlmIChtaXNwbGFjZWQpIHtcbiAgICAgICAgLy8gVGhlc2UgYXJlIGhhbmRsZWQgYnkgZG9JZiwgaWYgd2UgcmVhY2ggdGhlbSBoZXJlIGl0J3MgYW4gZXJyb3JcbiAgICAgICAgY29uc3QgbmFtZSA9IG1pc3BsYWNlZC5uYW1lLnN0YXJ0c1dpdGgoXCJAXCIpID8gbWlzcGxhY2VkLm5hbWUuc2xpY2UoMSkgOiBtaXNwbGFjZWQubmFtZTtcbiAgICAgICAgdGhpcy5lcnJvcihLRXJyb3JDb2RlLk1JU1BMQUNFRF9DT05ESVRJT05BTCwgeyBuYW1lOiBuYW1lIH0sIGVsLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBub2RlLmFjY2VwdCh0aGlzLCBwYXJlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kTWV0aG9kcyhlbnRpdHk6IGFueSk6IHZvaWQge1xuICAgIGlmICghZW50aXR5IHx8IHR5cGVvZiBlbnRpdHkgIT09IFwib2JqZWN0XCIpIHJldHVybjtcblxuICAgIGxldCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihlbnRpdHkpO1xuICAgIHdoaWxlIChwcm90byAmJiBwcm90byAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG8pKSB7XG4gICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBrZXkpPy5nZXQpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZW9mIGVudGl0eVtrZXldID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICBrZXkgIT09IFwiY29uc3RydWN0b3JcIiAmJlxuICAgICAgICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZW50aXR5LCBrZXkpXG4gICAgICAgICkge1xuICAgICAgICAgIGVudGl0eVtrZXldID0gZW50aXR5W2tleV0uYmluZChlbnRpdHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ3JlYXRlcyBhbiBlZmZlY3QgdGhhdCByZXN0b3JlcyB0aGUgY3VycmVudCBzY29wZSBvbiBldmVyeSByZS1ydW4sXG4gIC8vIHNvIGVmZmVjdHMgc2V0IHVwIGluc2lkZSBAZWFjaCBhbHdheXMgZXZhbHVhdGUgaW4gdGhlaXIgaXRlbSBzY29wZS5cbiAgcHJpdmF0ZSBzY29wZWRFZmZlY3QoZm46ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGU7XG4gICAgcmV0dXJuIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBwcmV2ID0gdGhpcy5pbnRlcnByZXRlci5zY29wZTtcbiAgICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSBzY29wZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIE9ubHkgcm91dGUgdG8gZXJyb3IgaGFuZGxlciBkdXJpbmcgcmVhY3RpdmUgcmUtcnVucyAoYmF0Y2hpbmcgZW5hYmxlZCkuXG4gICAgICAgIC8vIER1cmluZyBpbml0aWFsIG1vdW50IChmbHVzaFN5bmMgLyBiYXRjaGluZyBkaXNhYmxlZCkgZXJyb3JzIHByb3BhZ2F0ZSBub3JtYWxseS5cbiAgICAgICAgaWYgKGlzQmF0Y2hpbmcoKSkge1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5pbnRlcnByZXRlci5zY29wZS5nZXQoXCIkaW5zdGFuY2VcIik7XG4gICAgICAgICAgaGFuZGxlRXJyb3IoZSwgXCJyZW5kZXJcIiwgaW5zdGFuY2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSBwcmV2O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gV3JhcHMgYSByZWZyZXNoIGZ1bmN0aW9uIHNvIGl0IHJlc3RvcmVzIHRoZSBjb3JyZWN0IHNjb3BlIHdoZW4gY2FsbGVkXG4gIC8vIGRpcmVjdGx5IGJ5IHRyaWdnZXJSZWZyZXNoIChvdXRzaWRlIG9mIHRoZSBzaWduYWwgZWZmZWN0IG1hY2hpbmVyeSkuXG4gIHByaXZhdGUgc2NvcGVkUmVmcmVzaChmbjogKCkgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5pbnRlcnByZXRlci5zY29wZTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgcHJldiA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGU7XG4gICAgICB0aGlzLmludGVycHJldGVyLnNjb3BlID0gc2NvcGU7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5pbnRlcnByZXRlci5zY29wZSA9IHByZXY7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIGV2YWx1YXRlcyBleHByZXNzaW9ucyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBmaXJzdCBldmFsdWF0aW9uXG4gIHByaXZhdGUgZXhlY3V0ZShzb3VyY2U6IHN0cmluZywgb3ZlcnJpZGVTY29wZT86IFNjb3BlKTogYW55IHtcbiAgICBjb25zdCB0b2tlbnMgPSB0aGlzLnNjYW5uZXIuc2Nhbihzb3VyY2UpO1xuICAgIGNvbnN0IGV4cHJlc3Npb25zID0gdGhpcy5wYXJzZXIucGFyc2UodG9rZW5zLCBzb3VyY2UpO1xuXG4gICAgY29uc3QgcmVzdG9yZVNjb3BlID0gdGhpcy5pbnRlcnByZXRlci5zY29wZTtcbiAgICBpZiAob3ZlcnJpZGVTY29wZSkge1xuICAgICAgdGhpcy5pbnRlcnByZXRlci5zY29wZSA9IG92ZXJyaWRlU2NvcGU7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGV4cHJlc3Npb25zLm1hcCgoZXhwcmVzc2lvbikgPT5cbiAgICAgIHRoaXMuaW50ZXJwcmV0ZXIuZXZhbHVhdGUoZXhwcmVzc2lvbilcbiAgICApO1xuICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSByZXN0b3JlU2NvcGU7XG4gICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQubGVuZ3RoID8gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyB0cmFuc3BpbGUoXG4gICAgbm9kZXM6IEtOb2RlLktOb2RlW10sXG4gICAgZW50aXR5OiBhbnksXG4gICAgY29udGFpbmVyOiBFbGVtZW50XG4gICk6IE5vZGUge1xuICAgIHRoaXMuaXNSZW5kZXJpbmcgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmRlc3Ryb3koY29udGFpbmVyKTtcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgdGhpcy5iaW5kTWV0aG9kcyhlbnRpdHkpO1xuICAgICAgdGhpcy5pbnRlcnByZXRlci5zY29wZS5pbml0KGVudGl0eSk7XG4gICAgICB0aGlzLmludGVycHJldGVyLnNjb3BlLnNldChcIiRpbnN0YW5jZVwiLCBlbnRpdHkpO1xuXG4gICAgICBmbHVzaFN5bmMoKCkgPT4ge1xuICAgICAgICB0aGlzLmNyZWF0ZVNpYmxpbmdzKG5vZGVzLCBjb250YWluZXIpO1xuICAgICAgICB0aGlzLnRyaWdnZXJSZW5kZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzUmVuZGVyaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHZpc2l0RWxlbWVudEtOb2RlKG5vZGU6IEtOb2RlLkVsZW1lbnQsIHBhcmVudD86IE5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmNyZWF0ZUVsZW1lbnQobm9kZSwgcGFyZW50KTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdFRleHRLTm9kZShub2RlOiBLTm9kZS5UZXh0LCBwYXJlbnQ/OiBOb2RlKTogdm9pZCB7XG4gICAgY29uc3QgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIGlmICgocGFyZW50IGFzIGFueSkuaW5zZXJ0ICYmIHR5cGVvZiAocGFyZW50IGFzIGFueSkuaW5zZXJ0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgKHBhcmVudCBhcyBhbnkpLmluc2VydCh0ZXh0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZCh0ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdG9wID0gdGhpcy5zY29wZWRFZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmV2YWx1YXRlVGVtcGxhdGVTdHJpbmcobm9kZS52YWx1ZSk7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUuZ2V0KFwiJGluc3RhbmNlXCIpO1xuICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgIHF1ZXVlVXBkYXRlKGluc3RhbmNlLCAoKSA9PiB7XG4gICAgICAgICAgdGV4dC50ZXh0Q29udGVudCA9IG5ld1ZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHQudGV4dENvbnRlbnQgPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnRyYWNrRWZmZWN0KHRleHQsIHN0b3ApO1xuICB9XG5cbiAgcHVibGljIHZpc2l0QXR0cmlidXRlS05vZGUobm9kZTogS05vZGUuQXR0cmlidXRlLCBwYXJlbnQ/OiBOb2RlKTogdm9pZCB7XG4gICAgY29uc3QgYXR0ciA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShub2RlLm5hbWUpO1xuXG4gICAgY29uc3Qgc3RvcCA9IHRoaXMuc2NvcGVkRWZmZWN0KCgpID0+IHtcbiAgICAgIGF0dHIudmFsdWUgPSB0aGlzLmV2YWx1YXRlVGVtcGxhdGVTdHJpbmcobm9kZS52YWx1ZSk7XG4gICAgfSk7XG4gICAgdGhpcy50cmFja0VmZmVjdChhdHRyLCBzdG9wKTtcblxuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIChwYXJlbnQgYXMgSFRNTEVsZW1lbnQpLnNldEF0dHJpYnV0ZU5vZGUoYXR0cik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHZpc2l0Q29tbWVudEtOb2RlKF9ub2RlOiBLTm9kZS5Db21tZW50LCBfcGFyZW50PzogTm9kZSk6IHZvaWQge1xuICAgIC8vIHRlbXBsYXRlIGNvbW1lbnRzIGFyZSBzdHJpcHBlZCBmcm9tIERPTSBvdXRwdXRcbiAgfVxuXG4gIHByaXZhdGUgdHJhY2tFZmZlY3QodGFyZ2V0OiBhbnksIHN0b3A6IGFueSkge1xuICAgIGlmICghdGFyZ2V0LiRrYXNwZXJFZmZlY3RzKSB0YXJnZXQuJGthc3BlckVmZmVjdHMgPSBbXTtcbiAgICB0YXJnZXQuJGthc3BlckVmZmVjdHMucHVzaChzdG9wKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEF0dHIoXG4gICAgbm9kZTogS05vZGUuRWxlbWVudCxcbiAgICBuYW1lOiBzdHJpbmdbXVxuICApOiBLTm9kZS5BdHRyaWJ1dGUgfCBudWxsIHtcbiAgICBpZiAoIW5vZGUgfHwgIW5vZGUuYXR0cmlidXRlcyB8fCAhbm9kZS5hdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmliID0gbm9kZS5hdHRyaWJ1dGVzLmZpbmQoKGF0dHIpID0+XG4gICAgICBuYW1lLmluY2x1ZGVzKChhdHRyIGFzIEtOb2RlLkF0dHJpYnV0ZSkubmFtZSlcbiAgICApO1xuICAgIGlmIChhdHRyaWIpIHtcbiAgICAgIHJldHVybiBhdHRyaWIgYXMgS05vZGUuQXR0cmlidXRlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZG9JZihleHByZXNzaW9uczogSWZFbHNlTm9kZVtdLCBwYXJlbnQ6IE5vZGUpOiB2b2lkIHtcbiAgICBjb25zdCBib3VuZGFyeSA9IG5ldyBCb3VuZGFyeShwYXJlbnQsIFwiaWZcIik7XG5cbiAgICBjb25zdCBydW4gPSAoKSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUuZ2V0KFwiJGluc3RhbmNlXCIpO1xuXG4gICAgICBjb25zdCB0cmFja2luZ1Njb3BlID0gaW5zdGFuY2UgPyBuZXcgU2NvcGUodGhpcy5pbnRlcnByZXRlci5zY29wZSkgOiB0aGlzLmludGVycHJldGVyLnNjb3BlO1xuICAgICAgY29uc3QgcHJldlNjb3BlID0gdGhpcy5pbnRlcnByZXRlci5zY29wZTtcbiAgICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSB0cmFja2luZ1Njb3BlO1xuXG4gICAgICAvLyBFdmFsdWF0ZSBjb25kaXRpb25zIHN5bmNocm9ub3VzbHkgdG8gZW5zdXJlIHNpZ25hbCB0cmFja2luZ1xuICAgICAgY29uc3QgcmVzdWx0czogYm9vbGVhbltdID0gW107XG4gICAgICByZXN1bHRzLnB1c2goISF0aGlzLmV4ZWN1dGUoKGV4cHJlc3Npb25zWzBdWzFdIGFzIEtOb2RlLkF0dHJpYnV0ZSkudmFsdWUpKTtcblxuICAgICAgaWYgKCFyZXN1bHRzWzBdKSB7XG4gICAgICAgIGZvciAoY29uc3QgZXhwcmVzc2lvbiBvZiBleHByZXNzaW9ucy5zbGljZSgxKSkge1xuICAgICAgICAgIGlmICh0aGlzLmZpbmRBdHRyKGV4cHJlc3Npb25bMF0gYXMgS05vZGUuRWxlbWVudCwgW1wiQGVsc2VpZlwiXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9ICEhdGhpcy5leGVjdXRlKChleHByZXNzaW9uWzFdIGFzIEtOb2RlLkF0dHJpYnV0ZSkudmFsdWUpO1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHZhbCk7XG4gICAgICAgICAgICBpZiAodmFsKSBicmVhaztcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZmluZEF0dHIoZXhwcmVzc2lvblswXSBhcyBLTm9kZS5FbGVtZW50LCBbXCJAZWxzZVwiXSkpIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh0cnVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5pbnRlcnByZXRlci5zY29wZSA9IHByZXZTY29wZTtcblxuICAgICAgY29uc3QgdGFzayA9ICgpID0+IHtcbiAgICAgICAgYm91bmRhcnkubm9kZXMoKS5mb3JFYWNoKChuKSA9PiB0aGlzLmRlc3Ryb3lOb2RlKG4pKTtcbiAgICAgICAgYm91bmRhcnkuY2xlYXIoKTtcblxuICAgICAgICBjb25zdCByZXN0b3JlU2NvcGUgPSB0aGlzLmludGVycHJldGVyLnNjb3BlO1xuICAgICAgICB0aGlzLmludGVycHJldGVyLnNjb3BlID0gdHJhY2tpbmdTY29wZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAocmVzdWx0c1swXSkge1xuICAgICAgICAgICAgZXhwcmVzc2lvbnNbMF1bMF0uYWNjZXB0KHRoaXMsIGJvdW5kYXJ5IGFzIGFueSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0c1tpXSkge1xuICAgICAgICAgICAgICBleHByZXNzaW9uc1tpXVswXS5hY2NlcHQodGhpcywgYm91bmRhcnkgYXMgYW55KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0aGlzLmludGVycHJldGVyLnNjb3BlID0gcmVzdG9yZVNjb3BlO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgcXVldWVVcGRhdGUoaW5zdGFuY2UsIHRhc2spO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFzaygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAoYm91bmRhcnkgYXMgYW55KS5zdGFydC4ka2FzcGVyUmVmcmVzaCA9IHRoaXMuc2NvcGVkUmVmcmVzaChydW4pO1xuXG4gICAgY29uc3Qgc3RvcCA9IHRoaXMuc2NvcGVkRWZmZWN0KHJ1bik7XG4gICAgdGhpcy50cmFja0VmZmVjdChib3VuZGFyeSwgc3RvcCk7XG4gIH1cblxuICBwcml2YXRlIGRvRWFjaChlYWNoOiBLTm9kZS5BdHRyaWJ1dGUsIG5vZGU6IEtOb2RlLkVsZW1lbnQsIHBhcmVudDogTm9kZSkge1xuICAgIGNvbnN0IGtleUF0dHIgPSB0aGlzLmZpbmRBdHRyKG5vZGUsIFtcIkBrZXlcIl0pO1xuICAgIGlmIChrZXlBdHRyKSB7XG4gICAgICB0aGlzLmRvRWFjaEtleWVkKGVhY2gsIG5vZGUsIHBhcmVudCwga2V5QXR0cik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZG9FYWNoVW5rZXllZChlYWNoLCBub2RlLCBwYXJlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZG9FYWNoVW5rZXllZChlYWNoOiBLTm9kZS5BdHRyaWJ1dGUsIG5vZGU6IEtOb2RlLkVsZW1lbnQsIHBhcmVudDogTm9kZSkge1xuICAgIGNvbnN0IGJvdW5kYXJ5ID0gbmV3IEJvdW5kYXJ5KHBhcmVudCwgXCJlYWNoXCIpO1xuICAgIGNvbnN0IG9yaWdpbmFsU2NvcGUgPSB0aGlzLmludGVycHJldGVyLnNjb3BlO1xuXG4gICAgY29uc3QgcnVuID0gKCkgPT4ge1xuICAgICAgY29uc3QgdG9rZW5zID0gdGhpcy5zY2FubmVyLnNjYW4oZWFjaC52YWx1ZSk7XG4gICAgICBjb25zdCBbbmFtZSwga2V5LCBpdGVyYWJsZV0gPSB0aGlzLmludGVycHJldGVyLmV2YWx1YXRlKFxuICAgICAgICB0aGlzLnBhcnNlci5mb3JlYWNoKHRva2VucylcbiAgICAgICk7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUuZ2V0KFwiJGluc3RhbmNlXCIpO1xuXG4gICAgICBjb25zdCB0YXNrID0gKCkgPT4ge1xuICAgICAgICBib3VuZGFyeS5ub2RlcygpLmZvckVhY2goKG4pID0+IHRoaXMuZGVzdHJveU5vZGUobikpO1xuICAgICAgICBib3VuZGFyeS5jbGVhcigpO1xuXG4gICAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgIGNvbnN0IHNjb3BlVmFsdWVzOiBhbnkgPSB7IFtuYW1lXTogaXRlbSB9O1xuICAgICAgICAgIGlmIChrZXkpIHNjb3BlVmFsdWVzW2tleV0gPSBpbmRleDtcblxuICAgICAgICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSBuZXcgU2NvcGUob3JpZ2luYWxTY29wZSwgc2NvcGVWYWx1ZXMpO1xuICAgICAgICAgIHRoaXMuY3JlYXRlRWxlbWVudChub2RlLCBib3VuZGFyeSBhcyBhbnkpO1xuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnRlcnByZXRlci5zY29wZSA9IG9yaWdpbmFsU2NvcGU7XG4gICAgICB9O1xuXG4gICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgcXVldWVVcGRhdGUoaW5zdGFuY2UsIHRhc2spO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFzaygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAoYm91bmRhcnkgYXMgYW55KS5zdGFydC4ka2FzcGVyUmVmcmVzaCA9IHRoaXMuc2NvcGVkUmVmcmVzaChydW4pO1xuXG4gICAgY29uc3Qgc3RvcCA9IHRoaXMuc2NvcGVkRWZmZWN0KHJ1bik7XG4gICAgdGhpcy50cmFja0VmZmVjdChib3VuZGFyeSwgc3RvcCk7XG4gIH1cblxuICBwcml2YXRlIHRyaWdnZXJSZWZyZXNoKG5vZGU6IE5vZGUpOiB2b2lkIHtcbiAgICAvLyAxLiBSZS1ydW4gc3RydWN0dXJhbCBsb2dpYyAoaWYvZWFjaC93aGlsZSlcbiAgICBpZiAoKG5vZGUgYXMgYW55KS4ka2FzcGVyUmVmcmVzaCkge1xuICAgICAgKG5vZGUgYXMgYW55KS4ka2FzcGVyUmVmcmVzaCgpO1xuICAgIH1cblxuICAgIC8vIDIuIFJlLXJ1biBhbGwgc3VyZ2ljYWwgZWZmZWN0cyAodGV4dCBpbnRlcnBvbGF0aW9uLCBhdHRyaWJ1dGVzLCBldGMuKVxuICAgIGlmICgobm9kZSBhcyBhbnkpLiRrYXNwZXJFZmZlY3RzKSB7XG4gICAgICAobm9kZSBhcyBhbnkpLiRrYXNwZXJFZmZlY3RzLmZvckVhY2goKHN0b3A6IGFueSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHN0b3AucnVuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBzdG9wLnJ1bigpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAzLiBSZWN1cnNlXG4gICAgbm9kZS5jaGlsZE5vZGVzPy5mb3JFYWNoKChjaGlsZCkgPT4gdGhpcy50cmlnZ2VyUmVmcmVzaChjaGlsZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBkb0VhY2hLZXllZChlYWNoOiBLTm9kZS5BdHRyaWJ1dGUsIG5vZGU6IEtOb2RlLkVsZW1lbnQsIHBhcmVudDogTm9kZSwga2V5QXR0cjogS05vZGUuQXR0cmlidXRlKSB7XG4gICAgY29uc3QgYm91bmRhcnkgPSBuZXcgQm91bmRhcnkocGFyZW50LCBcImVhY2hcIik7XG4gICAgY29uc3Qgb3JpZ2luYWxTY29wZSA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGU7XG4gICAgY29uc3Qga2V5ZWROb2RlcyA9IG5ldyBNYXA8YW55LCBOb2RlPigpO1xuXG4gICAgY29uc3QgcnVuID0gKCkgPT4ge1xuICAgICAgY29uc3QgdG9rZW5zID0gdGhpcy5zY2FubmVyLnNjYW4oZWFjaC52YWx1ZSk7XG4gICAgICBjb25zdCBbbmFtZSwgaW5kZXhLZXksIGl0ZXJhYmxlXSA9IHRoaXMuaW50ZXJwcmV0ZXIuZXZhbHVhdGUoXG4gICAgICAgIHRoaXMucGFyc2VyLmZvcmVhY2godG9rZW5zKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5pbnRlcnByZXRlci5zY29wZS5nZXQoXCIkaW5zdGFuY2VcIik7XG5cbiAgICAgIC8vIENvbXB1dGUgbmV3IGl0ZW1zIGFuZCB0aGVpciBrZXlzIGltbWVkaWF0ZWx5XG4gICAgICBjb25zdCBuZXdJdGVtczogQXJyYXk8eyBpdGVtOiBhbnk7IGlkeDogbnVtYmVyOyBrZXk6IGFueSB9PiA9IFtdO1xuICAgICAgY29uc3Qgc2VlbktleXMgPSBuZXcgU2V0KCk7XG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZXJhYmxlKSB7XG4gICAgICAgIGNvbnN0IHNjb3BlVmFsdWVzOiBhbnkgPSB7IFtuYW1lXTogaXRlbSB9O1xuICAgICAgICBpZiAoaW5kZXhLZXkpIHNjb3BlVmFsdWVzW2luZGV4S2V5XSA9IGluZGV4O1xuICAgICAgICB0aGlzLmludGVycHJldGVyLnNjb3BlID0gbmV3IFNjb3BlKG9yaWdpbmFsU2NvcGUsIHNjb3BlVmFsdWVzKTtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5leGVjdXRlKGtleUF0dHIudmFsdWUpO1xuXG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09IFwiZGV2ZWxvcG1lbnRcIiAmJiBzZWVuS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW0thc3Blcl0gRHVwbGljYXRlIGtleSBkZXRlY3RlZCBpbiBAZWFjaDogXCIke2tleX1cIi4gS2V5cyBtdXN0IGJlIHVuaXF1ZSB0byBlbnN1cmUgY29ycmVjdCByZWNvbmNpbGlhdGlvbi5gKTtcbiAgICAgICAgfVxuICAgICAgICBzZWVuS2V5cy5hZGQoa2V5KTtcblxuICAgICAgICBuZXdJdGVtcy5wdXNoKHsgaXRlbTogaXRlbSwgaWR4OiBpbmRleCwga2V5OiBrZXkgfSk7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhc2sgPSAoKSA9PiB7XG4gICAgICAgIC8vIERlc3Ryb3kgbm9kZXMgd2hvc2Uga2V5cyBhcmUgbm8gbG9uZ2VyIHByZXNlbnRcbiAgICAgICAgY29uc3QgbmV3S2V5U2V0ID0gbmV3IFNldChuZXdJdGVtcy5tYXAoKGkpID0+IGkua2V5KSk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZG9tTm9kZV0gb2Yga2V5ZWROb2Rlcykge1xuICAgICAgICAgIGlmICghbmV3S2V5U2V0LmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lOb2RlKGRvbU5vZGUpO1xuICAgICAgICAgICAgZG9tTm9kZS5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZChkb21Ob2RlKTtcbiAgICAgICAgICAgIGtleWVkTm9kZXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5zZXJ0L3JldXNlIG5vZGVzIGluIG5ldyBvcmRlciB1c2luZyBhIGN1cnNvciB0byBhdm9pZCB1bm5lY2Vzc2FyeSBtb3Zlc1xuICAgICAgICBjb25zdCBwYXJlbnQgPSAoYm91bmRhcnkgYXMgYW55KS5lbmQucGFyZW50Tm9kZSBhcyBOb2RlO1xuICAgICAgICBsZXQgbGFzdEluc2VydGVkOiBOb2RlID0gKGJvdW5kYXJ5IGFzIGFueSkuc3RhcnQ7XG5cbiAgICAgICAgZm9yIChjb25zdCB7IGl0ZW0sIGlkeCwga2V5IH0gb2YgbmV3SXRlbXMpIHtcbiAgICAgICAgICBjb25zdCBzY29wZVZhbHVlczogYW55ID0geyBbbmFtZV06IGl0ZW0gfTtcbiAgICAgICAgICBpZiAoaW5kZXhLZXkpIHNjb3BlVmFsdWVzW2luZGV4S2V5XSA9IGlkeDtcbiAgICAgICAgICB0aGlzLmludGVycHJldGVyLnNjb3BlID0gbmV3IFNjb3BlKG9yaWdpbmFsU2NvcGUsIHNjb3BlVmFsdWVzKTtcblxuICAgICAgICAgIGlmIChrZXllZE5vZGVzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBjb25zdCBkb21Ob2RlID0ga2V5ZWROb2Rlcy5nZXQoa2V5KSE7XG5cbiAgICAgICAgICAgIC8vIE9ubHkgbW92ZSB0aGUgbm9kZSBpZiBpdCdzIG5vdCBhbHJlYWR5IGluIHRoZSBjb3JyZWN0IHBvc2l0aW9uXG4gICAgICAgICAgICBpZiAobGFzdEluc2VydGVkLm5leHRTaWJsaW5nICE9PSBkb21Ob2RlKSB7XG4gICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZG9tTm9kZSwgbGFzdEluc2VydGVkLm5leHRTaWJsaW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RJbnNlcnRlZCA9IGRvbU5vZGU7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBzY29wZSBhbmQgdHJpZ2dlciByZS1yZW5kZXIgb2YgbmVzdGVkIHN0cnVjdHVyYWwgZGlyZWN0aXZlc1xuICAgICAgICAgICAgY29uc3Qgbm9kZVNjb3BlID0gKGRvbU5vZGUgYXMgYW55KS4ka2FzcGVyU2NvcGU7XG4gICAgICAgICAgICBpZiAobm9kZVNjb3BlKSB7XG4gICAgICAgICAgICAgIG5vZGVTY29wZS5zZXQobmFtZSwgaXRlbSk7XG4gICAgICAgICAgICAgIGlmIChpbmRleEtleSkgbm9kZVNjb3BlLnNldChpbmRleEtleSwgaWR4KTtcblxuICAgICAgICAgICAgICAvLyBJZiBpdCBoYXMgaXRzIG93biByZW5kZXIgbG9naWMgKG5lc3RlZCBlYWNoL2lmKSwgdHJpZ2dlciBpdCByZWN1cnNpdmVseVxuICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJSZWZyZXNoKGRvbU5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkID0gdGhpcy5jcmVhdGVFbGVtZW50KG5vZGUsIGJvdW5kYXJ5IGFzIGFueSk7XG4gICAgICAgICAgICBpZiAoY3JlYXRlZCkge1xuICAgICAgICAgICAgICAvLyBjcmVhdGVFbGVtZW50IGluc2VydHMgYmVmb3JlIGVuZDsgbW92ZSB0byBjb3JyZWN0IHBvc2l0aW9uIGlmIG5lZWRlZFxuICAgICAgICAgICAgICBpZiAobGFzdEluc2VydGVkLm5leHRTaWJsaW5nICE9PSBjcmVhdGVkKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjcmVhdGVkLCBsYXN0SW5zZXJ0ZWQubmV4dFNpYmxpbmcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxhc3RJbnNlcnRlZCA9IGNyZWF0ZWQ7XG4gICAgICAgICAgICAgIGtleWVkTm9kZXMuc2V0KGtleSwgY3JlYXRlZCk7XG4gICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBzY29wZSBvbiB0aGUgRE9NIG5vZGUgc28gd2UgY2FuIHVwZGF0ZSBpdCBsYXRlclxuICAgICAgICAgICAgICAoY3JlYXRlZCBhcyBhbnkpLiRrYXNwZXJTY29wZSA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSBvcmlnaW5hbFNjb3BlO1xuICAgICAgfTtcblxuICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgIHF1ZXVlVXBkYXRlKGluc3RhbmNlLCB0YXNrKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhc2soKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgKGJvdW5kYXJ5IGFzIGFueSkuc3RhcnQuJGthc3BlclJlZnJlc2ggPSB0aGlzLnNjb3BlZFJlZnJlc2gocnVuKTtcblxuICAgIGNvbnN0IHN0b3AgPSB0aGlzLnNjb3BlZEVmZmVjdChydW4pO1xuICAgIHRoaXMudHJhY2tFZmZlY3QoYm91bmRhcnksIHN0b3ApO1xuICB9XG5cblxuICBwcml2YXRlIGNyZWF0ZVNpYmxpbmdzKG5vZGVzOiBLTm9kZS5LTm9kZVtdLCBwYXJlbnQ/OiBOb2RlKTogdm9pZCB7XG4gICAgbGV0IGN1cnJlbnQgPSAwO1xuICAgIGNvbnN0IGluaXRpYWxTY29wZSA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGU7XG4gICAgbGV0IGdyb3VwU2NvcGU6IFNjb3BlIHwgbnVsbCA9IG51bGw7XG5cbiAgICB3aGlsZSAoY3VycmVudCA8IG5vZGVzLmxlbmd0aCkge1xuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2N1cnJlbnQrK107XG4gICAgICBpZiAobm9kZS50eXBlID09PSBcImVsZW1lbnRcIikge1xuICAgICAgICBjb25zdCBlbCA9IG5vZGUgYXMgS05vZGUuRWxlbWVudDtcblxuICAgICAgICAvLyAxLiBQcm9jZXNzIEBsZXQgKGxlYWtzIHRvIHNpYmxpbmdzIGFuZCBhdmFpbGFibGUgdG8gb3RoZXIgZGlyZWN0aXZlcyBvbiB0aGlzIG5vZGUpXG4gICAgICAgIGNvbnN0ICRsZXQgPSB0aGlzLmZpbmRBdHRyKGVsLCBbXCJAbGV0XCJdKTtcbiAgICAgICAgaWYgKCRsZXQpIHtcbiAgICAgICAgICBpZiAoIWdyb3VwU2NvcGUpIHtcbiAgICAgICAgICAgIGdyb3VwU2NvcGUgPSBuZXcgU2NvcGUoaW5pdGlhbFNjb3BlKTtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSBncm91cFNjb3BlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmV4ZWN1dGUoJGxldC52YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBWYWxpZGF0aW9uOiBTdHJ1Y3R1cmFsIGRpcmVjdGl2ZXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVxuICAgICAgICBjb25zdCBpZkF0dHIgPSB0aGlzLmZpbmRBdHRyKGVsLCBbXCJAaWZcIl0pO1xuICAgICAgICBjb25zdCBlbHNlaWZBdHRyID0gdGhpcy5maW5kQXR0cihlbCwgW1wiQGVsc2VpZlwiXSk7XG4gICAgICAgIGNvbnN0IGVsc2VBdHRyID0gdGhpcy5maW5kQXR0cihlbCwgW1wiQGVsc2VcIl0pO1xuICAgICAgICBjb25zdCAkZWFjaCA9IHRoaXMuZmluZEF0dHIoZWwsIFtcIkBlYWNoXCJdKTtcblxuICAgICAgICBpZiAodGhpcy5tb2RlID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgICAgICBjb25zdCBzdHJ1Y3R1cmFsQ291bnQgPSBbaWZBdHRyLCBlbHNlaWZBdHRyLCBlbHNlQXR0ciwgJGVhY2hdLmZpbHRlcihhID0+IGEpLmxlbmd0aDtcbiAgICAgICAgICBpZiAoc3RydWN0dXJhbENvdW50ID4gMSkge1xuICAgICAgICAgICAgdGhpcy5lcnJvcihLRXJyb3JDb2RlLk1VTFRJUExFX1NUUlVDVFVSQUxfRElSRUNUSVZFUywge30sIGVsLm5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMuIFByb2Nlc3Mgc3RydWN0dXJhbCBkaXJlY3RpdmVzIChvbmUgd2lsbCBtYXRjaCBhbmQgY29udGludWUpXG4gICAgICAgIGlmICgkZWFjaCkge1xuICAgICAgICAgIHRoaXMuZG9FYWNoKCRlYWNoLCBlbCwgcGFyZW50ISk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaWZBdHRyKSB7XG4gICAgICAgICAgY29uc3QgZXhwcmVzc2lvbnM6IElmRWxzZU5vZGVbXSA9IFtbZWwsIGlmQXR0cl1dO1xuXG4gICAgICAgICAgd2hpbGUgKGN1cnJlbnQgPCBub2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBub2Rlc1tjdXJyZW50XTtcbiAgICAgICAgICAgIGlmIChuZXh0LnR5cGUgIT09IFwiZWxlbWVudFwiKSBicmVhaztcbiAgICAgICAgICAgIGNvbnN0IGF0dHIgPSB0aGlzLmZpbmRBdHRyKG5leHQgYXMgS05vZGUuRWxlbWVudCwgW1xuICAgICAgICAgICAgICBcIkBlbHNlXCIsXG4gICAgICAgICAgICAgIFwiQGVsc2VpZlwiLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICBpZiAoYXR0cikge1xuICAgICAgICAgICAgICBleHByZXNzaW9ucy5wdXNoKFtuZXh0IGFzIEtOb2RlLkVsZW1lbnQsIGF0dHJdKTtcbiAgICAgICAgICAgICAgY3VycmVudCArPSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5kb0lmKGV4cHJlc3Npb25zLCBwYXJlbnQhKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmV2YWx1YXRlKG5vZGUsIHBhcmVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5pbnRlcnByZXRlci5zY29wZSA9IGluaXRpYWxTY29wZTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRWxlbWVudChub2RlOiBLTm9kZS5FbGVtZW50LCBwYXJlbnQ/OiBOb2RlKTogTm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChub2RlLm5hbWUgPT09IFwic2xvdFwiKSB7XG4gICAgICAgIGNvbnN0IG5hbWVBdHRyID0gdGhpcy5maW5kQXR0cihub2RlLCBbXCJAbmFtZVwiXSk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBuYW1lQXR0ciA/IG5hbWVBdHRyLnZhbHVlIDogXCJkZWZhdWx0XCI7XG4gICAgICAgIGNvbnN0IHNsb3RzID0gdGhpcy5pbnRlcnByZXRlci5zY29wZS5nZXQoXCIkc2xvdHNcIik7XG4gICAgICAgIGlmIChzbG90cyAmJiBzbG90c1tuYW1lXSkge1xuICAgICAgICAgIGNvbnN0IHByZXYgPSB0aGlzLmludGVycHJldGVyLnNjb3BlO1xuICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIHNjb3BlIHdoZXJlIHRoZSBzbG90IGNvbnRlbnQgd2FzIGRlZmluZWQgKExleGljYWwgU2NvcGluZykuXG4gICAgICAgICAgLy8gV2Ugc3RvcmUgdGhlIHNjb3BlIHJlZmVyZW5jZSBkaXJlY3RseSBvbiB0aGUgQXJyYXkgaW5zdGFuY2UgdG8gYXZvaWQgY2hhbmdpbmcgc2lnbmF0dXJlcy5cbiAgICAgICAgICBpZiAoc2xvdHNbbmFtZV0uc2NvcGUpIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSBzbG90c1tuYW1lXS5zY29wZTtcbiAgICAgICAgICB0aGlzLmNyZWF0ZVNpYmxpbmdzKHNsb3RzW25hbWVdLCBwYXJlbnQpO1xuICAgICAgICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSBwcmV2O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzVm9pZCA9IG5vZGUubmFtZSA9PT0gXCJ2b2lkXCI7XG4gICAgICBjb25zdCBpc0NvbXBvbmVudCA9ICEhdGhpcy5yZWdpc3RyeVtub2RlLm5hbWVdO1xuXG4gICAgICBjb25zdCBlbGVtZW50ID0gaXNWb2lkID8gcGFyZW50IDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChub2RlLm5hbWUpO1xuICAgICAgY29uc3QgcmVzdG9yZVNjb3BlID0gdGhpcy5pbnRlcnByZXRlci5zY29wZTtcblxuICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudCAhPT0gcGFyZW50KSB7XG4gICAgICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUuc2V0KFwiJHJlZlwiLCBlbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQ29tcG9uZW50KSB7XG4gICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50IGFuZCBzZXQgaXQgYXMgdGhlIGN1cnJlbnQgc2NvcGVcbiAgICAgICAgbGV0IGNvbXBvbmVudDogYW55ID0ge307XG4gICAgICAgIGNvbnN0IGFyZ3NBdHRyID0gbm9kZS5hdHRyaWJ1dGVzLmZpbHRlcigoYXR0cikgPT5cbiAgICAgICAgICAoYXR0ciBhcyBLTm9kZS5BdHRyaWJ1dGUpLm5hbWUuc3RhcnRzV2l0aChcIkA6XCIpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSB0aGlzLmNyZWF0ZUNvbXBvbmVudEFyZ3MoYXJnc0F0dHIgYXMgS05vZGUuQXR0cmlidXRlW10pO1xuXG4gICAgICAgIC8vIENhcHR1cmUgY2hpbGRyZW4gZm9yIHNsb3RzLiBcbiAgICAgICAgLy8gV2UgdXNlIGEgcGxhaW4gb2JqZWN0IGtleWVkIGJ5IHNsb3QgbmFtZS4gRWFjaCB2YWx1ZSBpcyBhbiBBcnJheSBvZiBLTm9kZXMuXG4gICAgICAgIC8vIFRvIHN1cHBvcnQgbGV4aWNhbCBzY29waW5nLCB3ZSBhdHRhY2ggdGhlIGN1cnJlbnQgc2NvcGUgdG8gdGhlIEFycmF5IGluc3RhbmNlLlxuICAgICAgICBjb25zdCBzbG90czogUmVjb3JkPHN0cmluZywgYW55PiA9IHsgZGVmYXVsdDogW10gfTtcbiAgICAgICAgc2xvdHMuZGVmYXVsdC5zY29wZSA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGU7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgIGlmIChjaGlsZC50eXBlID09PSBcImVsZW1lbnRcIikge1xuICAgICAgICAgICAgY29uc3Qgc2xvdEF0dHIgPSB0aGlzLmZpbmRBdHRyKGNoaWxkIGFzIEtOb2RlLkVsZW1lbnQsIFtcIkBzbG90XCJdKTtcbiAgICAgICAgICAgIGlmIChzbG90QXR0cikge1xuICAgICAgICAgICAgICBjb25zdCBuYW1lID0gc2xvdEF0dHIudmFsdWU7XG4gICAgICAgICAgICAgIGlmICghc2xvdHNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBzbG90c1tuYW1lXSA9IFtdO1xuICAgICAgICAgICAgICAgIHNsb3RzW25hbWVdLnNjb3BlID0gdGhpcy5pbnRlcnByZXRlci5zY29wZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzbG90c1tuYW1lXS5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHNsb3RzLmRlZmF1bHQucHVzaChjaGlsZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZWdpc3RyeVtub2RlLm5hbWVdPy5sYXp5KSB7XG4gICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLnJlZ2lzdHJ5W25vZGUubmFtZV07XG5cbiAgICAgICAgICBpZiAoZW50cnkuZmFsbGJhY2spIHtcbiAgICAgICAgICAgIGNvbnN0IGZhbGxiYWNrTm9kZXMgPSB0aGlzLnRlbXBsYXRlUGFyc2VyLnBhcnNlKChlbnRyeS5mYWxsYmFjayBhcyBhbnkpLnRlbXBsYXRlID8/IFwiXCIpO1xuICAgICAgICAgICAgY29uc3QgZmFsbGJhY2tJbnN0YW5jZTogYW55ID0gbmV3IGVudHJ5LmZhbGxiYWNrKHsgYXJnczoge30sIHJlZjogZWxlbWVudCwgdHJhbnNwaWxlcjogdGhpcyB9KTtcbiAgICAgICAgICAgIHRoaXMuYmluZE1ldGhvZHMoZmFsbGJhY2tJbnN0YW5jZSk7XG4gICAgICAgICAgICAoZWxlbWVudCBhcyBhbnkpLiRrYXNwZXJJbnN0YW5jZSA9IGZhbGxiYWNrSW5zdGFuY2U7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckNvbXBvbmVudEluc3RhbmNlKGZhbGxiYWNrSW5zdGFuY2UsIGZhbGxiYWNrTm9kZXMsIGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQsIHJlc3RvcmVTY29wZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCEoZW50cnkgYXMgYW55KS5fcHJvbWlzZSkge1xuICAgICAgICAgICAgKGVudHJ5IGFzIGFueSkuX3Byb21pc2UgPSAoZW50cnkuY29tcG9uZW50IGFzICgpID0+IFByb21pc2U8Q29tcG9uZW50Q2xhc3M+KSgpLnRoZW4oKGNscykgPT4ge1xuICAgICAgICAgICAgICBlbnRyeS5ub2RlcyA9IHRoaXMudGVtcGxhdGVQYXJzZXIucGFyc2UoKGNscyBhcyBhbnkpLnRlbXBsYXRlID8/IFwiXCIpO1xuICAgICAgICAgICAgICBlbnRyeS5jb21wb25lbnQgPSBjbHM7XG4gICAgICAgICAgICAgIGRlbGV0ZSBlbnRyeS5sYXp5O1xuICAgICAgICAgICAgICBkZWxldGUgKGVudHJ5IGFzIGFueSkuX3Byb21pc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAoZW50cnkgYXMgYW55KS5fcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveShlbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgIChlbGVtZW50IGFzIEhUTUxFbGVtZW50KS5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICAgICAgY29uc3QgY2xzID0gZW50cnkuY29tcG9uZW50IGFzIENvbXBvbmVudENsYXNzO1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2U6IGFueSA9IG5ldyBjbHMoeyBhcmdzOiBhcmdzLCByZWY6IGVsZW1lbnQsIHRyYW5zcGlsZXI6IHRoaXMgfSk7XG4gICAgICAgICAgICB0aGlzLmJpbmRNZXRob2RzKGluc3RhbmNlKTtcbiAgICAgICAgICAgIChlbGVtZW50IGFzIGFueSkuJGthc3Blckluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckNvbXBvbmVudEluc3RhbmNlKGluc3RhbmNlLCBlbnRyeS5ub2RlcyEsIGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQsIHJlc3RvcmVTY29wZSwgc2xvdHMpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgaWYgKChwYXJlbnQgYXMgYW55KS5pbnNlcnQgJiYgdHlwZW9mIChwYXJlbnQgYXMgYW55KS5pbnNlcnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAocGFyZW50IGFzIGFueSkuaW5zZXJ0KGVsZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdHJ5W25vZGUubmFtZV0/LmNvbXBvbmVudCkge1xuICAgICAgICAgIGNvbXBvbmVudCA9IG5ldyAodGhpcy5yZWdpc3RyeVtub2RlLm5hbWVdLmNvbXBvbmVudCBhcyBDb21wb25lbnRDbGFzcykoe1xuICAgICAgICAgICAgYXJnczogYXJncyxcbiAgICAgICAgICAgIHJlZjogZWxlbWVudCxcbiAgICAgICAgICAgIHRyYW5zcGlsZXI6IHRoaXMsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLmJpbmRNZXRob2RzKGNvbXBvbmVudCk7XG4gICAgICAgICAgKGVsZW1lbnQgYXMgYW55KS4ka2FzcGVySW5zdGFuY2UgPSBjb21wb25lbnQ7XG5cbiAgICAgICAgICBpZiAobm9kZS5uYW1lID09PSBcInJvdXRlclwiICYmIGNvbXBvbmVudCBpbnN0YW5jZW9mIFJvdXRlcikge1xuICAgICAgICAgICAgY29uc3Qgcm91dGVTY29wZSA9IG5ldyBTY29wZShyZXN0b3JlU2NvcGUsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICBjb21wb25lbnQuc2V0Um91dGVzKHRoaXMuZXh0cmFjdFJvdXRlcyhub2RlLmNoaWxkcmVuLCB1bmRlZmluZWQsIHJvdXRlU2NvcGUpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnJlbmRlckNvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudCwgdGhpcy5yZXNvbHZlTm9kZXMobm9kZS5uYW1lKSwgZWxlbWVudCBhcyBIVE1MRWxlbWVudCwgcmVzdG9yZVNjb3BlLCBzbG90cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgIGlmICgocGFyZW50IGFzIGFueSkuaW5zZXJ0ICYmIHR5cGVvZiAocGFyZW50IGFzIGFueSkuaW5zZXJ0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIChwYXJlbnQgYXMgYW55KS5pbnNlcnQoZWxlbWVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNWb2lkKSB7XG4gICAgICAgIC8vIGV2ZW50IGJpbmRpbmdcbiAgICAgICAgY29uc3QgZXZlbnRzID0gbm9kZS5hdHRyaWJ1dGVzLmZpbHRlcigoYXR0cikgPT5cbiAgICAgICAgICAoYXR0ciBhcyBLTm9kZS5BdHRyaWJ1dGUpLm5hbWUuc3RhcnRzV2l0aChcIkBvbjpcIilcbiAgICAgICAgKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgICAgIHRoaXMuY3JlYXRlRXZlbnRMaXN0ZW5lcihlbGVtZW50LCBldmVudCBhcyBLTm9kZS5BdHRyaWJ1dGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVndWxhciBhdHRyaWJ1dGVzIChwcm9jZXNzZWQgZmlyc3QpXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBub2RlLmF0dHJpYnV0ZXMuZmlsdGVyKFxuICAgICAgICAgIChhdHRyKSA9PiAhKGF0dHIgYXMgS05vZGUuQXR0cmlidXRlKS5uYW1lLnN0YXJ0c1dpdGgoXCJAXCIpXG4gICAgICAgICk7XG5cbiAgICAgICAgZm9yIChjb25zdCBhdHRyIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICB0aGlzLmV2YWx1YXRlKGF0dHIsIGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2hvcnRoYW5kIGF0dHJpYnV0ZXMgKHByb2Nlc3NlZCBzZWNvbmQsIGFsbG93cyBtZXJnaW5nKVxuICAgICAgICBjb25zdCBzaG9ydGhhbmRBdHRyaWJ1dGVzID0gbm9kZS5hdHRyaWJ1dGVzLmZpbHRlcigoYXR0cikgPT4ge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSAoYXR0ciBhcyBLTm9kZS5BdHRyaWJ1dGUpLm5hbWU7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG5hbWUuc3RhcnRzV2l0aChcIkBcIikgJiZcbiAgICAgICAgICAgICFbXCJAaWZcIiwgXCJAZWxzZWlmXCIsIFwiQGVsc2VcIiwgXCJAZWFjaFwiLCBcIkBsZXRcIiwgXCJAa2V5XCIsIFwiQHJlZlwiXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgIW5hbWUuc3RhcnRzV2l0aChcIkBvbjpcIikgJiZcbiAgICAgICAgICAgICFuYW1lLnN0YXJ0c1dpdGgoXCJAOlwiKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgYXR0ciBvZiBzaG9ydGhhbmRBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgY29uc3QgcmVhbE5hbWUgPSAoYXR0ciBhcyBLTm9kZS5BdHRyaWJ1dGUpLm5hbWUuc2xpY2UoMSk7XG5cbiAgICAgICAgICBpZiAocmVhbE5hbWUgPT09IFwiY2xhc3NcIikge1xuICAgICAgICAgICAgY29uc3Qgc3RvcCA9IHRoaXMuc2NvcGVkRWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmV4ZWN1dGUoKGF0dHIgYXMgS05vZGUuQXR0cmlidXRlKS52YWx1ZSk7XG4gICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5pbnRlcnByZXRlci5zY29wZS5nZXQoXCIkaW5zdGFuY2VcIik7XG4gICAgICAgICAgICAgIGNvbnN0IHRhc2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHZhbHVlKTtcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICBxdWV1ZVVwZGF0ZShpbnN0YW5jZSwgdGFzayk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFzaygpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudHJhY2tFZmZlY3QoZWxlbWVudCwgc3RvcCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN0b3AgPSB0aGlzLnNjb3BlZEVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5leGVjdXRlKChhdHRyIGFzIEtOb2RlLkF0dHJpYnV0ZSkudmFsdWUpO1xuICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUuZ2V0KFwiJGluc3RhbmNlXCIpO1xuICAgICAgICAgICAgICBjb25zdCB0YXNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgaWYgKHJlYWxOYW1lICE9PSBcInN0eWxlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLnJlbW92ZUF0dHJpYnV0ZShyZWFsTmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGlmIChyZWFsTmFtZSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGV4aXN0aW5nICYmICFleGlzdGluZy5pbmNsdWRlcyh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICA/IGAke2V4aXN0aW5nLmVuZHNXaXRoKFwiO1wiKSA/IGV4aXN0aW5nIDogZXhpc3RpbmcgKyBcIjtcIn0gJHt2YWx1ZX1gXG4gICAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIChlbGVtZW50IGFzIEhUTUxFbGVtZW50KS5zZXRBdHRyaWJ1dGUocmVhbE5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgcXVldWVVcGRhdGUoaW5zdGFuY2UsIHRhc2spO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhc2soKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnRyYWNrRWZmZWN0KGVsZW1lbnQsIHN0b3ApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50ICYmICFpc1ZvaWQpIHtcbiAgICAgICAgaWYgKChwYXJlbnQgYXMgYW55KS5pbnNlcnQgJiYgdHlwZW9mIChwYXJlbnQgYXMgYW55KS5pbnNlcnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIChwYXJlbnQgYXMgYW55KS5pbnNlcnQoZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlZkF0dHIgPSB0aGlzLmZpbmRBdHRyKG5vZGUsIFtcIkByZWZcIl0pO1xuICAgICAgaWYgKHJlZkF0dHIgJiYgIWlzVm9pZCkge1xuICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHJlZkF0dHIudmFsdWUudHJpbSgpO1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUuZ2V0KFwiJGluc3RhbmNlXCIpO1xuICAgICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICBpbnN0YW5jZVtwcm9wTmFtZV0gPSBlbGVtZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUuc2V0KHByb3BOYW1lLCBlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5zZWxmKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNyZWF0ZVNpYmxpbmdzKG5vZGUuY2hpbGRyZW4sIGVsZW1lbnQpO1xuICAgICAgdGhpcy5pbnRlcnByZXRlci5zY29wZSA9IHJlc3RvcmVTY29wZTtcblxuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIEthc3BlckVycm9yKSB0aHJvdyBlLndpdGhUYWcobm9kZS5uYW1lKTtcbiAgICAgIHRoaXMuZXJyb3IoS0Vycm9yQ29kZS5SVU5USU1FX0VSUk9SLCB7IG1lc3NhZ2U6IGUubWVzc2FnZSB8fCBgJHtlfWAgfSwgbm9kZS5uYW1lKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbXBvbmVudEFyZ3MoYXJnczogS05vZGUuQXR0cmlidXRlW10pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBpZiAoIWFyZ3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICAgIGNvbnN0IGtleSA9IGFyZy5uYW1lLnNwbGl0KFwiOlwiKVsxXTtcbiAgICAgIGlmICh0aGlzLm1vZGUgPT09IFwiZGV2ZWxvcG1lbnRcIiAmJiBrZXkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwib25cIikpIHtcbiAgICAgICAgY29uc3QgdHJpbW1lZCA9IGFyZy52YWx1ZS50cmltKCk7XG4gICAgICAgIGNvbnN0IGlzQ2FsbEV4cHIgPSAvXltcXHckLl1bXFx3JC5dKlxccypcXCguKlxcKVxccyokLy50ZXN0KHRyaW1tZWQpICYmICF0cmltbWVkLmluY2x1ZGVzKFwiPT5cIik7XG4gICAgICAgIGlmIChpc0NhbGxFeHByKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFtLYXNwZXJdIEA6JHtrZXl9PVwiJHthcmcudmFsdWV9XCIg4oCUIHRoZSBleHByZXNzaW9uIGlzIGNhbGxlZCBkdXJpbmcgcmVuZGVyIGFuZCBpdHMgcmV0dXJuIHZhbHVlIGlzIHBhc3NlZCBhcyB0aGUgcHJvcC4gYCArXG4gICAgICAgICAgICBgSWYgaXQgcmV0dXJucyBhIGZ1bmN0aW9uLCB0aGF0IGZ1bmN0aW9uIGJlY29tZXMgdGhlIGhhbmRsZXIgKGZhY3RvcnkgcGF0dGVybikuIGAgK1xuICAgICAgICAgICAgYElmIGl0IHJldHVybnMgdW5kZWZpbmVkLCB0aGUgcHJvcCByZWNlaXZlcyB1bmRlZmluZWQuIGAgK1xuICAgICAgICAgICAgYElmIHRoZSBmdW5jdGlvbiBoYXMgcmVhY3RpdmUgc2lkZSBlZmZlY3RzLCBlbnN1cmUgaXQgZG9lcyBub3QgYm90aCByZWFkIGFuZCB3cml0ZSB0aGUgc2FtZSBzaWduYWwuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlc3VsdFtrZXldID0gdGhpcy5leGVjdXRlKGFyZy52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUV2ZW50TGlzdGVuZXIoZWxlbWVudDogTm9kZSwgYXR0cjogS05vZGUuQXR0cmlidXRlKTogdm9pZCB7XG4gICAgY29uc3QgW2V2ZW50TmFtZSwgLi4ubW9kaWZpZXJzXSA9IGF0dHIubmFtZS5zcGxpdChcIjpcIilbMV0uc3BsaXQoXCIuXCIpO1xuICAgIGNvbnN0IGxpc3RlbmVyU2NvcGUgPSBuZXcgU2NvcGUodGhpcy5pbnRlcnByZXRlci5zY29wZSk7XG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmludGVycHJldGVyLnNjb3BlLmdldChcIiRpbnN0YW5jZVwiKTtcblxuICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHt9O1xuICAgIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS4kYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICBvcHRpb25zLnNpZ25hbCA9IGluc3RhbmNlLiRhYm9ydENvbnRyb2xsZXIuc2lnbmFsO1xuICAgIH1cbiAgICBpZiAobW9kaWZpZXJzLmluY2x1ZGVzKFwib25jZVwiKSkgb3B0aW9ucy5vbmNlID0gdHJ1ZTtcbiAgICBpZiAobW9kaWZpZXJzLmluY2x1ZGVzKFwicGFzc2l2ZVwiKSkgb3B0aW9ucy5wYXNzaXZlID0gdHJ1ZTtcbiAgICBpZiAobW9kaWZpZXJzLmluY2x1ZGVzKFwiY2FwdHVyZVwiKSkgb3B0aW9ucy5jYXB0dXJlID0gdHJ1ZTtcblxuICAgIC8vIEFueXRoaW5nIG5vdCBpbiB0aGlzIGxpc3QgaXMgdHJlYXRlZCBhcyBhIHBvdGVudGlhbCBrZXkgbW9kaWZpZXJcbiAgICBjb25zdCBjb250cm9sTW9kaWZpZXJzID0gW1wicHJldmVudFwiLCBcInN0b3BcIiwgXCJvbmNlXCIsIFwicGFzc2l2ZVwiLCBcImNhcHR1cmVcIiwgXCJjdHJsXCIsIFwic2hpZnRcIiwgXCJhbHRcIiwgXCJtZXRhXCJdO1xuICAgIGNvbnN0IHBvdGVudGlhbEtleU1vZGlmaWVycyA9IG1vZGlmaWVycy5maWx0ZXIoKG0pID0+ICFjb250cm9sTW9kaWZpZXJzLmluY2x1ZGVzKG0udG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgZXZlbnROYW1lLFxuICAgICAgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHBvdGVudGlhbEtleU1vZGlmaWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgbWF0Y2hlZCA9IHBvdGVudGlhbEtleU1vZGlmaWVycy5zb21lKChtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsb3dlck0gPSBtLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoS0VZX01BUFtsb3dlck1dICYmIEtFWV9NQVBbbG93ZXJNXS5pbmNsdWRlcyhldmVudC5rZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChsb3dlck0gPT09IGV2ZW50LmtleT8udG9Mb3dlckNhc2UoKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFtYXRjaGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vZGlmaWVycy5pbmNsdWRlcyhcImN0cmxcIikgJiYgIWV2ZW50LmN0cmxLZXkpIHJldHVybjtcbiAgICAgICAgaWYgKG1vZGlmaWVycy5pbmNsdWRlcyhcInNoaWZ0XCIpICYmICFldmVudC5zaGlmdEtleSkgcmV0dXJuO1xuICAgICAgICBpZiAobW9kaWZpZXJzLmluY2x1ZGVzKFwiYWx0XCIpICYmICFldmVudC5hbHRLZXkpIHJldHVybjtcbiAgICAgICAgaWYgKG1vZGlmaWVycy5pbmNsdWRlcyhcIm1ldGFcIikgJiYgIWV2ZW50Lm1ldGFLZXkpIHJldHVybjtcblxuICAgICAgICBpZiAobW9kaWZpZXJzLmluY2x1ZGVzKFwicHJldmVudFwiKSkgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKG1vZGlmaWVycy5pbmNsdWRlcyhcInN0b3BcIikpIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBsaXN0ZW5lclNjb3BlLnNldChcIiRldmVudFwiLCBldmVudCk7XG4gICAgICAgIHRoaXMuZXhlY3V0ZShhdHRyLnZhbHVlLCBsaXN0ZW5lclNjb3BlKTtcbiAgICAgIH0sXG4gICAgICBvcHRpb25zXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZXZhbHVhdGVUZW1wbGF0ZVN0cmluZyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGV4dCkge1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIGNvbnN0IHJlZ2V4ID0gL1xce1xcey4rXFx9XFx9L21zO1xuICAgIGlmIChyZWdleC50ZXN0KHRleHQpKSB7XG4gICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXHtcXHsoW1xcc1xcU10rPylcXH1cXH0vZywgKG0sIHBsYWNlaG9sZGVyKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlRXhwcmVzc2lvbihwbGFjZWhvbGRlcik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICBwcml2YXRlIGV2YWx1YXRlRXhwcmVzc2lvbihzb3VyY2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdG9rZW5zID0gdGhpcy5zY2FubmVyLnNjYW4oc291cmNlKTtcbiAgICBjb25zdCBleHByZXNzaW9ucyA9IHRoaXMucGFyc2VyLnBhcnNlKHRva2Vucywgc291cmNlKTtcblxuICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgIGZvciAoY29uc3QgZXhwcmVzc2lvbiBvZiBleHByZXNzaW9ucykge1xuICAgICAgcmVzdWx0ICs9IGAke3RoaXMuaW50ZXJwcmV0ZXIuZXZhbHVhdGUoZXhwcmVzc2lvbil9YDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveU5vZGUobm9kZTogYW55KTogdm9pZCB7XG4gICAgLy8gMS4gQ2xlYW51cCBjb21wb25lbnQgaW5zdGFuY2VcbiAgICBpZiAobm9kZS4ka2FzcGVySW5zdGFuY2UpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbm9kZS4ka2FzcGVySW5zdGFuY2U7XG4gICAgICBpZiAoaW5zdGFuY2Uub25EZXN0cm95KSB7XG4gICAgICAgIGluc3RhbmNlLm9uRGVzdHJveSgpO1xuICAgICAgfVxuICAgICAgaWYgKGluc3RhbmNlLiRhYm9ydENvbnRyb2xsZXIpIGluc3RhbmNlLiRhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB9XG5cbiAgICAvLyAyLiBDbGVhbnVwIGVmZmVjdHMgYXR0YWNoZWQgdG8gdGhlIG5vZGVcbiAgICBpZiAobm9kZS4ka2FzcGVyRWZmZWN0cykge1xuICAgICAgbm9kZS4ka2FzcGVyRWZmZWN0cy5mb3JFYWNoKChzdG9wOiAoKSA9PiB2b2lkKSA9PiBzdG9wKCkpO1xuICAgICAgbm9kZS4ka2FzcGVyRWZmZWN0cyA9IFtdO1xuICAgIH1cblxuICAgIC8vIDMuIENsZWFudXAgZWZmZWN0cyBvbiBhdHRyaWJ1dGVzXG4gICAgaWYgKG5vZGUuYXR0cmlidXRlcykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYXR0ciA9IG5vZGUuYXR0cmlidXRlc1tpXTtcbiAgICAgICAgaWYgKGF0dHIuJGthc3BlckVmZmVjdHMpIHtcbiAgICAgICAgICBhdHRyLiRrYXNwZXJFZmZlY3RzLmZvckVhY2goKHN0b3A6ICgpID0+IHZvaWQpID0+IHN0b3AoKSk7XG4gICAgICAgICAgYXR0ci4ka2FzcGVyRWZmZWN0cyA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNC4gUmVjdXJzZVxuICAgIG5vZGUuY2hpbGROb2Rlcz8uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4gdGhpcy5kZXN0cm95Tm9kZShjaGlsZCkpO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koY29udGFpbmVyOiBFbGVtZW50KTogdm9pZCB7XG4gICAgY29udGFpbmVyLmNoaWxkTm9kZXMuZm9yRWFjaCgoY2hpbGQpID0+IHRoaXMuZGVzdHJveU5vZGUoY2hpbGQpKTtcbiAgfVxuXG4gIHB1YmxpYyBtb3VudENvbXBvbmVudChDb21wb25lbnRDbGFzczogQ29tcG9uZW50Q2xhc3MsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9KTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95KGNvbnRhaW5lcik7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IChDb21wb25lbnRDbGFzcyBhcyBhbnkpLnRlbXBsYXRlO1xuICAgIGlmICghdGVtcGxhdGUpIHJldHVybjtcblxuICAgIGNvbnN0IG5vZGVzID0gdGhpcy50ZW1wbGF0ZVBhcnNlci5wYXJzZSh0ZW1wbGF0ZSk7XG4gICAgY29uc3QgaG9zdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGhvc3QpO1xuXG4gICAgY29uc3QgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudENsYXNzKHsgYXJnczogeyBwYXJhbXM6IHBhcmFtcyB9LCByZWY6IGhvc3QsIHRyYW5zcGlsZXI6IHRoaXMgfSk7XG4gICAgdGhpcy5iaW5kTWV0aG9kcyhjb21wb25lbnQpO1xuICAgIChob3N0IGFzIGFueSkuJGthc3Blckluc3RhbmNlID0gY29tcG9uZW50O1xuXG4gICAgY29uc3QgY29tcG9uZW50Tm9kZXMgPSBub2RlcztcbiAgICBjb21wb25lbnQuJHJlbmRlciA9ICgpID0+IHtcbiAgICAgIHRoaXMuaXNSZW5kZXJpbmcgPSB0cnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5kZXN0cm95KGhvc3QpO1xuICAgICAgICBob3N0LmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gbmV3IFNjb3BlKG51bGwsIGNvbXBvbmVudCk7XG4gICAgICAgIHNjb3BlLnNldChcIiRpbnN0YW5jZVwiLCBjb21wb25lbnQpO1xuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5pbnRlcnByZXRlci5zY29wZTtcbiAgICAgICAgdGhpcy5pbnRlcnByZXRlci5zY29wZSA9IHNjb3BlO1xuXG4gICAgICAgIGZsdXNoU3luYygoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jcmVhdGVTaWJsaW5ncyhjb21wb25lbnROb2RlcywgaG9zdCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQub25SZW5kZXIgPT09IFwiZnVuY3Rpb25cIikgY29tcG9uZW50Lm9uUmVuZGVyKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSBwcmV2O1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5pc1JlbmRlcmluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBzY29wZSA9IG5ldyBTY29wZShudWxsLCBjb21wb25lbnQpO1xuICAgIHNjb3BlLnNldChcIiRpbnN0YW5jZVwiLCBjb21wb25lbnQpO1xuICAgIGNvbnN0IHByZXYgPSB0aGlzLmludGVycHJldGVyLnNjb3BlO1xuICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSBzY29wZTtcblxuICAgIGZsdXNoU3luYygoKSA9PiB7XG4gICAgICB0aGlzLmNyZWF0ZVNpYmxpbmdzKG5vZGVzLCBob3N0KTtcbiAgICB9KTtcblxuICAgIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSBwcmV2O1xuXG4gICAgaWYgKHR5cGVvZiBjb21wb25lbnQub25Nb3VudCA9PT0gXCJmdW5jdGlvblwiKSBjb21wb25lbnQub25Nb3VudCgpO1xuICAgIGlmICh0eXBlb2YgY29tcG9uZW50Lm9uUmVuZGVyID09PSBcImZ1bmN0aW9uXCIpIGNvbXBvbmVudC5vblJlbmRlcigpO1xuICB9XG5cbiAgcHVibGljIGV4dHJhY3RSb3V0ZXMoY2hpbGRyZW46IEtOb2RlLktOb2RlW10sIHBhcmVudEd1YXJkPzogKCkgPT4gUHJvbWlzZTxib29sZWFuPiwgc2NvcGU/OiBTY29wZSk6IFJvdXRlQ29uZmlnW10ge1xuICAgIGNvbnN0IHJvdXRlczogUm91dGVDb25maWdbXSA9IFtdO1xuICAgIGNvbnN0IHByZXZTY29wZSA9IHNjb3BlID8gdGhpcy5pbnRlcnByZXRlci5zY29wZSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoc2NvcGUpIHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUgPSBzY29wZTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICBpZiAoY2hpbGQudHlwZSAhPT0gXCJlbGVtZW50XCIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZWwgPSBjaGlsZCBhcyBLTm9kZS5FbGVtZW50O1xuICAgICAgaWYgKGVsLm5hbWUgPT09IFwicm91dGVcIikge1xuICAgICAgICBjb25zdCBwYXRoQXR0ciA9IHRoaXMuZmluZEF0dHIoZWwsIFtcIkBwYXRoXCJdKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50QXR0ciA9IHRoaXMuZmluZEF0dHIoZWwsIFtcIkBjb21wb25lbnRcIl0pO1xuICAgICAgICBjb25zdCBndWFyZEF0dHIgPSB0aGlzLmZpbmRBdHRyKGVsLCBbXCJAZ3VhcmRcIl0pO1xuXG4gICAgICAgIGlmICghcGF0aEF0dHIgfHwgIWNvbXBvbmVudEF0dHIpIHtcbiAgICAgICAgICB0aGlzLmVycm9yKEtFcnJvckNvZGUuTUlTU0lOR19SRVFVSVJFRF9BVFRSLCB7IG1lc3NhZ2U6IFwiPHJvdXRlPiByZXF1aXJlcyBAcGF0aCBhbmQgQGNvbXBvbmVudCBhdHRyaWJ1dGVzLlwiIH0sIGVsLm5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGF0aCA9IHBhdGhBdHRyIS52YWx1ZTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5leGVjdXRlKGNvbXBvbmVudEF0dHIhLnZhbHVlKTtcbiAgICAgICAgY29uc3QgZ3VhcmQgPSBndWFyZEF0dHIgPyB0aGlzLmV4ZWN1dGUoZ3VhcmRBdHRyLnZhbHVlKSA6IHBhcmVudEd1YXJkO1xuICAgICAgICByb3V0ZXMucHVzaCh7IHBhdGg6IHBhdGgsIGNvbXBvbmVudDogY29tcG9uZW50LCBndWFyZDogZ3VhcmQgfSk7XG4gICAgICB9IGVsc2UgaWYgKGVsLm5hbWUgPT09IFwiZ3VhcmRcIikge1xuICAgICAgICBjb25zdCBjaGVja0F0dHIgPSB0aGlzLmZpbmRBdHRyKGVsLCBbXCJAY2hlY2tcIl0pO1xuICAgICAgICBpZiAoIWNoZWNrQXR0cikge1xuICAgICAgICAgIHRoaXMuZXJyb3IoS0Vycm9yQ29kZS5NSVNTSU5HX1JFUVVJUkVEX0FUVFIsIHsgbWVzc2FnZTogXCI8Z3VhcmQ+IHJlcXVpcmVzIEBjaGVjayBhdHRyaWJ1dGUuXCIgfSwgZWwubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNoZWNrQXR0cikgY29udGludWU7XG4gICAgICAgIGNvbnN0IGNoZWNrID0gdGhpcy5leGVjdXRlKGNoZWNrQXR0ci52YWx1ZSk7XG4gICAgICAgIHJvdXRlcy5wdXNoKC4uLnRoaXMuZXh0cmFjdFJvdXRlcyhlbC5jaGlsZHJlbiwgY2hlY2spKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNjb3BlKSB0aGlzLmludGVycHJldGVyLnNjb3BlID0gcHJldlNjb3BlO1xuICAgIHJldHVybiByb3V0ZXM7XG4gIH1cblxuICBwcml2YXRlIHRyaWdnZXJSZW5kZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNSZW5kZXJpbmcpIHJldHVybjtcbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuaW50ZXJwcmV0ZXIuc2NvcGUuZ2V0KFwiJGluc3RhbmNlXCIpO1xuICAgIGlmIChpbnN0YW5jZSAmJiB0eXBlb2YgaW5zdGFuY2Uub25SZW5kZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgaW5zdGFuY2Uub25SZW5kZXIoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdmlzaXREb2N0eXBlS05vZGUoX25vZGU6IEtOb2RlLkRvY3R5cGUpOiB2b2lkIHtcbiAgICByZXR1cm47XG4gICAgLy8gcmV0dXJuIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50VHlwZShcImh0bWxcIiwgXCJcIiwgXCJcIik7XG4gIH1cblxuICBwdWJsaWMgZXJyb3IoY29kZTogS0Vycm9yQ29kZVR5cGUsIGFyZ3M6IGFueSwgdGFnTmFtZT86IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCBmaW5hbEFyZ3MgPSBhcmdzO1xuICAgIGlmICh0eXBlb2YgYXJncyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgY2xlYW5NZXNzYWdlID0gYXJncy5pbmNsdWRlcyhcIlJ1bnRpbWUgRXJyb3JcIilcbiAgICAgICAgPyBhcmdzLnJlcGxhY2UoXCJSdW50aW1lIEVycm9yOiBcIiwgXCJcIilcbiAgICAgICAgOiBhcmdzO1xuICAgICAgZmluYWxBcmdzID0geyBtZXNzYWdlOiBjbGVhbk1lc3NhZ2UgfTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgS2FzcGVyRXJyb3IoY29kZSwgZmluYWxBcmdzLCB7IHRhZzogdGFnTmFtZSB9KTtcbiAgfVxuXG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnRDbGFzcywgQ29tcG9uZW50UmVnaXN0cnkgfSBmcm9tIFwiLi9jb21wb25lbnRcIjtcbmltcG9ydCB7IFRlbXBsYXRlUGFyc2VyIH0gZnJvbSBcIi4vdGVtcGxhdGUtcGFyc2VyXCI7XG5pbXBvcnQgeyBUcmFuc3BpbGVyIH0gZnJvbSBcIi4vdHJhbnNwaWxlclwiO1xuaW1wb3J0IHsgS2FzcGVyRXJyb3IsIEtFcnJvckNvZGUgfSBmcm9tIFwiLi90eXBlcy9lcnJvclwiO1xuaW1wb3J0IHsgc2V0RXJyb3JIYW5kbGVyLCBFcnJvckhhbmRsZXJGbiB9IGZyb20gXCIuL2Vycm9yLWhhbmRsZXJcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGxhenkoXG4gIGltcG9ydGVyOiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIENvbXBvbmVudENsYXNzPj5cbik6IHsgY29tcG9uZW50OiAoKSA9PiBQcm9taXNlPENvbXBvbmVudENsYXNzPjsgbGF6eTogdHJ1ZSB9IHtcbiAgcmV0dXJuIHtcbiAgICBsYXp5OiB0cnVlLFxuICAgIGNvbXBvbmVudDogKCkgPT4gaW1wb3J0ZXIoKS50aGVuKChtKSA9PiBPYmplY3QudmFsdWVzKG0pWzBdKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGUoc291cmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJzZXIgPSBuZXcgVGVtcGxhdGVQYXJzZXIoKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBub2RlcyA9IHBhcnNlci5wYXJzZShzb3VyY2UpO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShub2Rlcyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoW2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKV0pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3BpbGUoXG4gIHNvdXJjZTogc3RyaW5nLFxuICBlbnRpdHk/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9LFxuICBjb250YWluZXI/OiBIVE1MRWxlbWVudCxcbiAgcmVnaXN0cnk/OiBDb21wb25lbnRSZWdpc3RyeVxuKTogTm9kZSB7XG4gIGNvbnN0IHBhcnNlciA9IG5ldyBUZW1wbGF0ZVBhcnNlcigpO1xuICBjb25zdCBub2RlcyA9IHBhcnNlci5wYXJzZShzb3VyY2UpO1xuICBjb25zdCB0cmFuc3BpbGVyID0gbmV3IFRyYW5zcGlsZXIoeyByZWdpc3RyeTogcmVnaXN0cnkgfHwge30gfSk7XG4gIGNvbnN0IHJlc3VsdCA9IHRyYW5zcGlsZXIudHJhbnNwaWxlKG5vZGVzLCBlbnRpdHkgfHwge30sIGNvbnRhaW5lcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2FzcGVyQ29uZmlnIHtcbiAgcm9vdD86IHN0cmluZyB8IEhUTUxFbGVtZW50O1xuICBlbnRyeT86IHN0cmluZztcbiAgcmVnaXN0cnk6IENvbXBvbmVudFJlZ2lzdHJ5O1xuICBtb2RlPzogXCJkZXZlbG9wbWVudFwiIHwgXCJwcm9kdWN0aW9uXCI7XG4gIG9uRXJyb3I/OiBFcnJvckhhbmRsZXJGbjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50KHRyYW5zcGlsZXI6IFRyYW5zcGlsZXIsIHRhZzogc3RyaW5nKSB7XG4gIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG4gIGNvbnN0IGNvbXBvbmVudCA9IG5ldyAodHJhbnNwaWxlci5yZWdpc3RyeVt0YWddLmNvbXBvbmVudCBhcyBDb21wb25lbnRDbGFzcykoe1xuICAgIHJlZjogZWxlbWVudCxcbiAgICB0cmFuc3BpbGVyOiB0cmFuc3BpbGVyLFxuICAgIGFyZ3M6IHt9LFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIG5vZGU6IGVsZW1lbnQsXG4gICAgaW5zdGFuY2U6IGNvbXBvbmVudCxcbiAgICBub2RlczogdHJhbnNwaWxlci5yZXNvbHZlTm9kZXModGFnKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJvb3RzdHJhcChjb25maWc6IEthc3BlckNvbmZpZykge1xuICBjb25zdCByb290ID1cbiAgICB0eXBlb2YgY29uZmlnLnJvb3QgPT09IFwic3RyaW5nXCJcbiAgICAgID8gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjb25maWcucm9vdClcbiAgICAgIDogY29uZmlnLnJvb3Q7XG5cbiAgaWYgKCFyb290KSB7XG4gICAgdGhyb3cgbmV3IEthc3BlckVycm9yKFxuICAgICAgS0Vycm9yQ29kZS5ST09UX0VMRU1FTlRfTk9UX0ZPVU5ELFxuICAgICAgeyByb290OiBjb25maWcucm9vdCB9XG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGVudHJ5VGFnID0gY29uZmlnLmVudHJ5IHx8IFwia2FzcGVyLWFwcFwiO1xuICBpZiAoIWNvbmZpZy5yZWdpc3RyeVtlbnRyeVRhZ10pIHtcbiAgICB0aHJvdyBuZXcgS2FzcGVyRXJyb3IoXG4gICAgICBLRXJyb3JDb2RlLkVOVFJZX0NPTVBPTkVOVF9OT1RfRk9VTkQsXG4gICAgICB7IHRhZzogZW50cnlUYWcgfVxuICAgICk7XG4gIH1cblxuICBpZiAoY29uZmlnLm9uRXJyb3IpIHtcbiAgICBzZXRFcnJvckhhbmRsZXIoY29uZmlnLm9uRXJyb3IpO1xuICB9XG5cbiAgY29uc3QgdHJhbnNwaWxlciA9IG5ldyBUcmFuc3BpbGVyKHsgcmVnaXN0cnk6IGNvbmZpZy5yZWdpc3RyeSB9KTtcblxuICBpZiAoY29uZmlnLm1vZGUpIHtcbiAgICB0cmFuc3BpbGVyLm1vZGUgPSBjb25maWcubW9kZTtcbiAgfVxuXG4gIGNvbnN0IHsgbm9kZSwgaW5zdGFuY2UsIG5vZGVzIH0gPSBjcmVhdGVDb21wb25lbnQodHJhbnNwaWxlciwgZW50cnlUYWcpO1xuXG4gIHJvb3QuaW5uZXJIVE1MID0gXCJcIjtcbiAgcm9vdC5hcHBlbmRDaGlsZChub2RlKTtcblxuICBpZiAodHlwZW9mIGluc3RhbmNlLm9uTW91bnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGluc3RhbmNlLm9uTW91bnQoKTtcbiAgfVxuXG4gIHRyYW5zcGlsZXIudHJhbnNwaWxlKG5vZGVzLCBpbnN0YW5jZSwgbm9kZSBhcyBIVE1MRWxlbWVudCk7XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5vblJlbmRlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgaW5zdGFuY2Uub25SZW5kZXIoKTtcbiAgfVxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbiJdLCJuYW1lcyI6WyJyYXdFZmZlY3QiLCJyYXdDb21wdXRlZCIsIlNldCIsIlRva2VuVHlwZSIsIkV4cHIuRWFjaCIsIkV4cHIuVmFyaWFibGUiLCJFeHByLkJpbmFyeSIsIkV4cHIuQXNzaWduIiwiRXhwci5HZXQiLCJFeHByLlNldCIsIkV4cHIuUGlwZWxpbmUiLCJFeHByLlRlcm5hcnkiLCJFeHByLk51bGxDb2FsZXNjaW5nIiwiRXhwci5Mb2dpY2FsIiwiRXhwci5UeXBlb2YiLCJFeHByLlVuYXJ5IiwiRXhwci5DYWxsIiwiRXhwci5OZXciLCJFeHByLlBvc3RmaXgiLCJFeHByLlNwcmVhZCIsIkV4cHIuS2V5IiwiRXhwci5MaXRlcmFsIiwiRXhwci5UZW1wbGF0ZSIsIkV4cHIuQXJyb3dGdW5jdGlvbiIsIkV4cHIuR3JvdXBpbmciLCJFeHByLlZvaWQiLCJFeHByLkRlYnVnIiwiRXhwci5EaWN0aW9uYXJ5IiwiRXhwci5MaXN0IiwiVXRpbHMuaXNEaWdpdCIsIlV0aWxzLmlzQWxwaGFOdW1lcmljIiwiVXRpbHMuY2FwaXRhbGl6ZSIsIlV0aWxzLmlzS2V5d29yZCIsIlV0aWxzLmlzQWxwaGEiLCJQYXJzZXIiLCJOb2RlLkRvY3R5cGUiLCJOb2RlLkVsZW1lbnQiLCJOb2RlLkF0dHJpYnV0ZSIsIk5vZGUuVGV4dCIsIkNvbXBvbmVudENsYXNzIiwic2NvcGUiLCJwYXJlbnQiLCJwcmV2Il0sIm1hcHBpbmdzIjoiQUFBTyxNQUFNLGFBQWE7QUFBQTtBQUFBLEVBRXhCLHdCQUF3QjtBQUFBLEVBQ3hCLDJCQUEyQjtBQUFBO0FBQUEsRUFHM0Isc0JBQXNCO0FBQUEsRUFDdEIscUJBQXFCO0FBQUEsRUFDckIsc0JBQXNCO0FBQUE7QUFBQSxFQUd0QixnQkFBZ0I7QUFBQSxFQUNoQix3QkFBd0I7QUFBQSxFQUN4QixtQkFBbUI7QUFBQSxFQUNuQiwwQkFBMEI7QUFBQSxFQUMxQixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0Qix1QkFBdUI7QUFBQSxFQUN2QixjQUFjO0FBQUEsRUFDZCxnQ0FBZ0M7QUFBQTtBQUFBLEVBR2hDLGtCQUFrQjtBQUFBLEVBQ2xCLGdCQUFnQjtBQUFBLEVBQ2hCLHFCQUFxQjtBQUFBLEVBQ3JCLHdCQUF3QjtBQUFBO0FBQUEsRUFHeEIsd0JBQXdCO0FBQUEsRUFDeEIseUJBQXlCO0FBQUEsRUFDekIsdUJBQXVCO0FBQUEsRUFDdkIsd0JBQXdCO0FBQUEsRUFDeEIsZ0JBQWdCO0FBQUEsRUFDaEIsYUFBYTtBQUFBO0FBQUEsRUFHYixtQkFBbUI7QUFBQTtBQUFBLEVBR25CLGVBQWU7QUFBQSxFQUNmLHVCQUF1QjtBQUN6QjtBQUlPLE1BQU0saUJBQXdEO0FBQUEsRUFDbkUsVUFBVSxDQUFDLE1BQU0sMkJBQTJCLEVBQUUsSUFBSTtBQUFBLEVBQ2xELFVBQVUsQ0FBQyxNQUFNLG9CQUFvQixFQUFFLEdBQUc7QUFBQSxFQUUxQyxVQUFVLE1BQU07QUFBQSxFQUNoQixVQUFVLENBQUMsTUFBTSwwQ0FBMEMsRUFBRSxLQUFLO0FBQUEsRUFDbEUsVUFBVSxDQUFDLE1BQU0seUJBQXlCLEVBQUUs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QUFBLFdBQUEsT0FBQSxJQUFBLENBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLFFBQUEsSUFBQSxDQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxLQUFBLElBQUEsQ0FBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsTUFBQSxJQUFBLENBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLFdBQUEsSUFBQSxDQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxhQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsV0FBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLFNBQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxNQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsWUFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLGNBQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxZQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsV0FBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLE9BQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxNQUFBLElBQUEsRUFBQSxJQUFBO0FBR0FBLGFBQUFBLFdBQUEsT0FBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLE1BQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxXQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsZ0JBQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxPQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsT0FBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLFlBQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxpQkFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLFNBQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxjQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsTUFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLFdBQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxPQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsWUFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLFlBQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxjQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsTUFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLFdBQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxVQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsVUFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLGFBQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxrQkFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLFlBQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxXQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsUUFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLFdBQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxrQkFBQSxJQUFBLEVBQUEsSUFBQTtBQUdBQSxhQUFBQSxXQUFBLFlBQUEsSUFBQSxFQUFBLElBQUE7QUFDQUEsYUFBQUEsV0FBQSxVQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsUUFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLFFBQUEsSUFBQSxFQUFBLElBQUE7QUFHQUEsYUFBQUEsV0FBQSxXQUFBLElBQUEsRUFBQSxJQUFBO0FBQ0FBLGFBQUFBLFdBQUEsWUFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBQSxhQUFBQSxXQUFBLFVBQUEsSUFBQSxF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 diff --git a/dist/kasper.min.js b/dist/kasper.min.js index 73d0f05..b3fd37f 100644 --- a/dist/kasper.min.js +++ b/dist/kasper.min.js @@ -33,7 +33,7 @@ const E = { // Transpiler RUNTIME_ERROR: "K007-1", MISSING_REQUIRED_ATTR: "K007-2" -}, xt = { +}, Nt = { "K001-1": (i) => `Root element not found: ${i.root}`, "K001-2": (i) => `Entry component <${i.tag}> not found in registry.`, "K002-1": () => 'Unterminated comment, expecting closing "*/"', @@ -62,24 +62,57 @@ const E = { "K007-1": (i) => i.message, "K007-2": (i) => i.message }; +function At(i, t, e, s = 2) { + const n = i.split(` +`), a = t - 1, o = Math.max(0, a - s), c = Math.min(n.length - 1, a + s), m = [""]; + for (let p = o; p <= c; p++) { + const l = p === a ? ">" : " "; + if (m.push(` ${l} | ${n[p]}`), p === a && e > 0) { + const d = " ".repeat(6 + e - 1) + "^"; + m.push(d); + } + } + return m.join(` +`); +} class C extends Error { - constructor(t, e = {}, s, n, a) { - const o = typeof process < "u" ? process.env.NODE_ENV !== "production" : !1, c = xt[t], m = c ? c(e) : typeof e == "string" ? e : "Unknown error", d = s !== void 0 ? ` (${s}:${n})` : "", l = a ? ` - at <${a}>` : "", p = o ? ` - -See: https://kasperjs.top/reference/errors#${t.toLowerCase().replace(".", "")}` : ""; - super(`[${t}] ${m}${d}${l}${p}`), this.code = t, this.args = e, this.line = s, this.col = n, this.tagName = a, this.name = "KasperError"; + constructor(t, e = {}, s = {}) { + const { line: n, col: a, tag: o, source: c } = s, m = typeof process < "u" ? process.env.NODE_ENV !== "production" : !1, p = Nt[t], l = p ? p(e) : typeof e == "string" ? e : "Unknown error", d = o ? ` + at <${o}>` : "", u = n !== void 0 && c ? At(c, n, a ?? 0) : "", f = m ? ` +See: https://kasperjs.top/reference/errors#${t.toLowerCase().replace(".", "")} +` : ""; + super(`[${t}] ${l}${d}${u}${f}`), this.code = t, this.args = e, this.name = "KasperError", this.line = n, this.col = a, this.tagName = o; } withTag(t) { return this.tagName || (this.tagName = t, this.message += ` at <${t}>`), this; } } +let Y = null; +function Ct(i) { + Y = i ?? null; +} +function X(i, t, e) { + const s = i instanceof Error ? i : new Error(String(i)); + if (e && typeof e.onError == "function") + try { + e.onError(s, t); + return; + } catch { + } + if (Y) + try { + Y(s, { component: e, phase: t }); + return; + } catch { + } + console.error(`[Kasper] Error during ${t}:`, s); +} let U = null; -const V = []; -let Y = !1; -const H = /* @__PURE__ */ new Set(), mt = []; -class Et { +const Q = []; +let J = !1; +const Z = /* @__PURE__ */ new Set(), gt = []; +class vt { constructor(t) { this.subscribers = /* @__PURE__ */ new Set(), this.watchers = /* @__PURE__ */ new Set(), this._value = t; } @@ -89,9 +122,9 @@ class Et { set value(t) { if (this._value !== t) { const e = this._value; - if (this._value = t, Y) { - for (const s of this.subscribers) H.add(s); - for (const s of this.watchers) mt.push(() => s(t, e)); + if (this._value = t, J) { + for (const s of this.subscribers) Z.add(s); + for (const s of this.watchers) gt.push(() => s(t, e)); } else { const s = Array.from(this.subscribers); for (const n of s) @@ -100,7 +133,7 @@ class Et { try { n(t, e); } catch (a) { - console.error("Watcher error:", a); + X(a, "watcher"); } } } @@ -123,10 +156,10 @@ class Et { return this._value; } } -class St extends Et { +class yt extends vt { constructor(t, e) { super(void 0), this.computing = !1, this.fn = t; - const s = tt(() => { + const s = st(() => { if (this.computing) throw new C(E.CIRCULAR_COMPUTED); this.computing = !0; @@ -144,17 +177,17 @@ class St extends Et { set value(t) { } } -function tt(i, t) { +function st(i, t) { var n; if ((n = t == null ? void 0 : t.signal) != null && n.aborted) return () => { }; const e = { fn: () => { - e.deps.forEach((a) => a.unsubscribe(e.fn)), e.deps.clear(), V.push(e), U = e; + e.deps.forEach((a) => a.unsubscribe(e.fn)), e.deps.clear(), Q.push(e), U = e; try { i(); } finally { - V.pop(), U = V[V.length - 1] || null; + Q.pop(), U = Q[Q.length - 1] || null; } }, deps: /* @__PURE__ */ new Set() @@ -165,35 +198,35 @@ function tt(i, t) { }; return s.run = e.fn, t != null && t.signal && t.signal.addEventListener("abort", s, { once: !0 }), s; } -function Ft(i) { - return new Et(i); +function Jt(i) { + return new vt(i); } -function zt(i, t, e) { +function Zt(i, t, e) { return i.onChange(t, e); } -function jt(i) { - Y = !0; +function Tt(i) { + J = !0; try { i(); } finally { - Y = !1; - const t = Array.from(H); - H.clear(); - const e = mt.splice(0); + J = !1; + const t = Array.from(Z); + Z.clear(); + const e = gt.splice(0); for (const s of t) s(); for (const s of e) try { s(); } catch (n) { - console.error("Watcher error:", n); + X(n, "watcher"); } } } -function Nt(i, t) { - return new St(i, t); +function Rt(i, t) { + return new yt(i, t); } -class At { +class Pt { constructor(t) { if (this.args = {}, this.$abortController = new AbortController(), !t) { this.args = {}; @@ -206,7 +239,7 @@ class At { * Runs immediately and re-runs when any signal dependency changes. */ effect(t) { - tt(t, { signal: this.$abortController.signal }); + st(t, { signal: this.$abortController.signal }); } /** * Watches a specific signal for changes. @@ -220,7 +253,7 @@ class At { * The internal effect is automatically cleaned up when the component is destroyed. */ computed(t) { - return Nt(t, { signal: this.$abortController.signal }); + return Rt(t, { signal: this.$abortController.signal }); } onMount() { } @@ -240,7 +273,7 @@ class v { constructor() { } } -class rt extends v { +class at extends v { constructor(t, e, s) { super(), this.params = t, this.body = e, this.line = s; } @@ -251,7 +284,7 @@ class rt extends v { return "Expr.ArrowFunction"; } } -class Ct extends v { +class kt extends v { constructor(t, e, s) { super(), this.name = t, this.value = e, this.line = s; } @@ -262,7 +295,7 @@ class Ct extends v { return "Expr.Assign"; } } -class D extends v { +class _ extends v { constructor(t, e, s, n) { super(), this.left = t, this.operator = e, this.right = s, this.line = n; } @@ -273,7 +306,7 @@ class D extends v { return "Expr.Binary"; } } -class J extends v { +class T extends v { constructor(t, e, s, n, a = !1) { super(), this.callee = t, this.paren = e, this.args = s, this.line = n, this.optional = a; } @@ -284,7 +317,7 @@ class J extends v { return "Expr.Call"; } } -class yt extends v { +class _t extends v { constructor(t, e) { super(), this.value = t, this.line = e; } @@ -295,7 +328,7 @@ class yt extends v { return "Expr.Debug"; } } -class nt extends v { +class ct extends v { constructor(t, e) { super(), this.properties = t, this.line = e; } @@ -306,7 +339,7 @@ class nt extends v { return "Expr.Dictionary"; } } -class Rt extends v { +class Dt extends v { constructor(t, e, s, n) { super(), this.name = t, this.key = e, this.iterable = s, this.line = n; } @@ -328,7 +361,7 @@ class R extends v { return "Expr.Get"; } } -class Pt extends v { +class It extends v { constructor(t, e) { super(), this.expression = t, this.line = e; } @@ -339,7 +372,7 @@ class Pt extends v { return "Expr.Grouping"; } } -class z extends v { +class j extends v { constructor(t, e) { super(), this.name = t, this.line = e; } @@ -350,7 +383,7 @@ class z extends v { return "Expr.Key"; } } -class at extends v { +class ot extends v { constructor(t, e, s, n) { super(), this.left = t, this.operator = e, this.right = s, this.line = n; } @@ -361,7 +394,7 @@ class at extends v { return "Expr.Logical"; } } -class ct extends v { +class ht extends v { constructor(t, e) { super(), this.value = t, this.line = e; } @@ -372,7 +405,7 @@ class ct extends v { return "Expr.List"; } } -class _ extends v { +class D extends v { constructor(t, e) { super(), this.value = t, this.line = e; } @@ -383,7 +416,7 @@ class _ extends v { return "Expr.Literal"; } } -class ot extends v { +class lt extends v { constructor(t, e, s) { super(), this.clazz = t, this.args = e, this.line = s; } @@ -394,7 +427,7 @@ class ot extends v { return "Expr.New"; } } -class kt extends v { +class Lt extends v { constructor(t, e, s) { super(), this.left = t, this.right = e, this.line = s; } @@ -405,7 +438,7 @@ class kt extends v { return "Expr.NullCoalescing"; } } -class ht extends v { +class ut extends v { constructor(t, e, s) { super(), this.entity = t, this.increment = e, this.line = s; } @@ -427,7 +460,7 @@ let B = class extends v { return "Expr.Set"; } }; -class Dt extends v { +class $t extends v { constructor(t, e, s) { super(), this.left = t, this.right = e, this.line = s; } @@ -449,7 +482,7 @@ class I extends v { return "Expr.Spread"; } } -class _t extends v { +class Kt extends v { constructor(t, e) { super(), this.value = t, this.line = e; } @@ -460,7 +493,7 @@ class _t extends v { return "Expr.Template"; } } -class It extends v { +class qt extends v { constructor(t, e, s, n) { super(), this.condition = t, this.thenExpr = e, this.elseExpr = s, this.line = n; } @@ -471,7 +504,7 @@ class It extends v { return "Expr.Ternary"; } } -class Lt extends v { +class Ot extends v { constructor(t, e) { super(), this.value = t, this.line = e; } @@ -482,7 +515,7 @@ class Lt extends v { return "Expr.Typeof"; } } -class Kt extends v { +class Mt extends v { constructor(t, e, s) { super(), this.operator = t, this.right = e, this.line = s; } @@ -504,7 +537,7 @@ class O extends v { return "Expr.Variable"; } } -class $t extends v { +class Ut extends v { constructor(t, e) { super(), this.value = t, this.line = e; } @@ -516,7 +549,7 @@ class $t extends v { } } var r = /* @__PURE__ */ ((i) => (i[i.Eof = 0] = "Eof", i[i.Panic = 1] = "Panic", i[i.Ampersand = 2] = "Ampersand", i[i.AtSign = 3] = "AtSign", i[i.Caret = 4] = "Caret", i[i.Comma = 5] = "Comma", i[i.Dollar = 6] = "Dollar", i[i.Dot = 7] = "Dot", i[i.Hash = 8] = "Hash", i[i.LeftBrace = 9] = "LeftBrace", i[i.LeftBracket = 10] = "LeftBracket", i[i.LeftParen = 11] = "LeftParen", i[i.Percent = 12] = "Percent", i[i.Pipe = 13] = "Pipe", i[i.RightBrace = 14] = "RightBrace", i[i.RightBracket = 15] = "RightBracket", i[i.RightParen = 16] = "RightParen", i[i.Semicolon = 17] = "Semicolon", i[i.Slash = 18] = "Slash", i[i.Star = 19] = "Star", i[i.Arrow = 20] = "Arrow", i[i.Bang = 21] = "Bang", i[i.BangEqual = 22] = "BangEqual", i[i.BangEqualEqual = 23] = "BangEqualEqual", i[i.Colon = 24] = "Colon", i[i.Equal = 25] = "Equal", i[i.EqualEqual = 26] = "EqualEqual", i[i.EqualEqualEqual = 27] = "EqualEqualEqual", i[i.Greater = 28] = "Greater", i[i.GreaterEqual = 29] = "GreaterEqual", i[i.Less = 30] = "Less", i[i.LessEqual = 31] = "LessEqual", i[i.Minus = 32] = "Minus", i[i.MinusEqual = 33] = "MinusEqual", i[i.MinusMinus = 34] = "MinusMinus", i[i.PercentEqual = 35] = "PercentEqual", i[i.Plus = 36] = "Plus", i[i.PlusEqual = 37] = "PlusEqual", i[i.PlusPlus = 38] = "PlusPlus", i[i.Question = 39] = "Question", i[i.QuestionDot = 40] = "QuestionDot", i[i.QuestionQuestion = 41] = "QuestionQuestion", i[i.SlashEqual = 42] = "SlashEqual", i[i.StarEqual = 43] = "StarEqual", i[i.DotDot = 44] = "DotDot", i[i.DotDotDot = 45] = "DotDotDot", i[i.LessEqualGreater = 46] = "LessEqualGreater", i[i.Identifier = 47] = "Identifier", i[i.Template = 48] = "Template", i[i.String = 49] = "String", i[i.Number = 50] = "Number", i[i.LeftShift = 51] = "LeftShift", i[i.RightShift = 52] = "RightShift", i[i.Pipeline = 53] = "Pipeline", i[i.Tilde = 54] = "Tilde", i[i.And = 55] = "And", i[i.Const = 56] = "Const", i[i.Debug = 57] = "Debug", i[i.False = 58] = "False", i[i.In = 59] = "In", i[i.Instanceof = 60] = "Instanceof", i[i.New = 61] = "New", i[i.Null = 62] = "Null", i[i.Undefined = 63] = "Undefined", i[i.Of = 64] = "Of", i[i.Or = 65] = "Or", i[i.True = 66] = "True", i[i.Typeof = 67] = "Typeof", i[i.Void = 68] = "Void", i[i.With = 69] = "With", i))(r || {}); -class lt { +class ft { constructor(t, e, s, n, a) { this.name = r[t], this.type = t, this.lexeme = e, this.literal = s, this.line = n, this.col = a; } @@ -524,8 +557,8 @@ class lt { return `[(${this.line}):"${this.lexeme}"]`; } } -const ut = [" ", ` -`, " ", "\r"], qt = [ +const pt = [" ", ` +`, " ", "\r"], Bt = [ "area", "base", "br", @@ -541,13 +574,13 @@ const ut = [" ", ` "track", "wbr" ]; -class gt { - parse(t) { - this.current = 0, this.tokens = t; - const e = []; +class wt { + parse(t, e = "") { + this.current = 0, this.tokens = t, this.source = e; + const s = []; for (; !this.eof(); ) - e.push(this.expression()); - return e; + s.push(this.expression()); + return s; } match(...t) { for (const e of t) @@ -578,7 +611,7 @@ class gt { ); } error(t, e, s = {}) { - throw new C(t, s, e.line, e.col); + throw new C(t, s, { line: e.line, col: e.col, source: this.source }); } synchronize() { do { @@ -604,7 +637,7 @@ class gt { 'Expected "of" keyword inside foreach statement' ); const n = this.expression(); - return new Rt(e, s, n, e.line); + return new Dt(e, s, n, e.line); } expression() { const t = this.assignment(); @@ -626,14 +659,14 @@ class gt { let s = this.assignment(); if (t instanceof O) { const n = t.name; - return e.type !== r.Equal && (s = new D( + return e.type !== r.Equal && (s = new _( new O(n, n.line), e, s, e.line - )), new Ct(n, s, n.line); + )), new kt(n, s, n.line); } else if (t instanceof R) - return e.type !== r.Equal && (s = new D( + return e.type !== r.Equal && (s = new _( new R(t.entity, t.key, t.type, t.line), e, s, @@ -647,7 +680,7 @@ class gt { let t = this.ternary(); for (; this.match(r.Pipeline); ) { const e = this.ternary(); - t = new Dt(t, e, t.line); + t = new $t(t, e, t.line); } return t; } @@ -657,7 +690,7 @@ class gt { const e = this.ternary(); this.consume(r.Colon, 'Expected ":" after ternary ? expression'); const s = this.ternary(); - return new It(t, e, s, t.line); + return new qt(t, e, s, t.line); } return t; } @@ -665,7 +698,7 @@ class gt { const t = this.logicalOr(); if (this.match(r.QuestionQuestion)) { const e = this.nullCoalescing(); - return new kt(t, e, t.line); + return new Lt(t, e, t.line); } return t; } @@ -673,7 +706,7 @@ class gt { let t = this.logicalAnd(); for (; this.match(r.Or); ) { const e = this.previous(), s = this.logicalAnd(); - t = new at(t, e, s, e.line); + t = new ot(t, e, s, e.line); } return t; } @@ -681,7 +714,7 @@ class gt { let t = this.equality(); for (; this.match(r.And); ) { const e = this.previous(), s = this.equality(); - t = new at(t, e, s, e.line); + t = new ot(t, e, s, e.line); } return t; } @@ -700,7 +733,7 @@ class gt { r.In ); ) { const e = this.previous(), s = this.shift(); - t = new D(t, e, s, e.line); + t = new _(t, e, s, e.line); } return t; } @@ -708,7 +741,7 @@ class gt { let t = this.addition(); for (; this.match(r.LeftShift, r.RightShift); ) { const e = this.previous(), s = this.addition(); - t = new D(t, e, s, e.line); + t = new _(t, e, s, e.line); } return t; } @@ -716,7 +749,7 @@ class gt { let t = this.modulus(); for (; this.match(r.Minus, r.Plus); ) { const e = this.previous(), s = this.modulus(); - t = new D(t, e, s, e.line); + t = new _(t, e, s, e.line); } return t; } @@ -724,7 +757,7 @@ class gt { let t = this.multiplication(); for (; this.match(r.Percent); ) { const e = this.previous(), s = this.multiplication(); - t = new D(t, e, s, e.line); + t = new _(t, e, s, e.line); } return t; } @@ -732,14 +765,14 @@ class gt { let t = this.typeof(); for (; this.match(r.Slash, r.Star); ) { const e = this.previous(), s = this.typeof(); - t = new D(t, e, s, e.line); + t = new _(t, e, s, e.line); } return t; } typeof() { if (this.match(r.Typeof)) { const t = this.previous(), e = this.typeof(); - return new Lt(e, t.line); + return new Ot(e, t.line); } return this.unary(); } @@ -753,20 +786,20 @@ class gt { r.MinusMinus )) { const t = this.previous(), e = this.unary(); - return new Kt(t, e, t.line); + return new Mt(t, e, t.line); } return this.newKeyword(); } newKeyword() { if (this.match(r.New)) { const t = this.previous(), e = this.call(); - return e instanceof J ? new ot(e.callee, e.args, t.line) : new ot(e, [], t.line); + return e instanceof T ? new lt(e.callee, e.args, t.line) : new lt(e, [], t.line); } return this.postfix(); } postfix() { const t = this.call(); - return this.match(r.PlusPlus) ? new ht(t, 1, t.line) : this.match(r.MinusMinus) ? new ht(t, -1, t.line) : t; + return this.match(r.PlusPlus) ? new ut(t, 1, t.line) : this.match(r.MinusMinus) ? new ut(t, -1, t.line) : t; } call() { let t = this.primary(), e; @@ -811,13 +844,13 @@ class gt { this.match(r.DotDotDot) ? n.push(new I(this.expression(), this.previous().line)) : n.push(this.expression()); while (this.match(r.Comma)); const a = this.consume(r.RightParen, 'Expected ")" after arguments'); - return new J(t, a, n, a.line, s); + return new T(t, a, n, a.line, s); } dotGet(t, e) { const s = this.consume( r.Identifier, "Expect property name after '.'" - ), n = new z(s, s.line); + ), n = new j(s, s.line); return new R(t, n, e.type, s.line); } bracketGet(t, e) { @@ -826,22 +859,22 @@ class gt { } primary() { if (this.match(r.False)) - return new _(!1, this.previous().line); + return new D(!1, this.previous().line); if (this.match(r.True)) - return new _(!0, this.previous().line); + return new D(!0, this.previous().line); if (this.match(r.Null)) - return new _(null, this.previous().line); + return new D(null, this.previous().line); if (this.match(r.Undefined)) - return new _(void 0, this.previous().line); + return new D(void 0, this.previous().line); if (this.match(r.Number) || this.match(r.String)) - return new _(this.previous().literal, this.previous().line); + return new D(this.previous().literal, this.previous().line); if (this.match(r.Template)) - return new _t(this.previous().literal, this.previous().line); + return new Kt(this.previous().literal, this.previous().line); if (this.check(r.Identifier) && this.tokenAt(1) === r.Arrow) { const t = this.advance(); this.advance(); const e = this.expression(); - return new rt([t], e, t.line); + return new at([t], e, t.line); } if (this.match(r.Identifier)) { const t = this.previous(); @@ -856,11 +889,11 @@ class gt { while (this.match(r.Comma)); this.consume(r.RightParen, 'Expected ")"'), this.consume(r.Arrow, 'Expected "=>"'); const e = this.expression(); - return new rt(t, e, this.previous().line); + return new at(t, e, this.previous().line); } if (this.match(r.LeftParen)) { const t = this.expression(); - return this.consume(r.RightParen, 'Expected ")" after expression'), new Pt(t, t.line); + return this.consume(r.RightParen, 'Expected ")" after expression'), new It(t, t.line); } if (this.match(r.LeftBrace)) return this.dictionary(); @@ -868,11 +901,11 @@ class gt { return this.list(); if (this.match(r.Void)) { const t = this.expression(); - return new $t(t, this.previous().line); + return new Ut(t, this.previous().line); } if (this.match(r.Debug)) { const t = this.expression(); - return new yt(t, this.previous().line); + return new _t(t, this.previous().line); } throw this.error( E.EXPECTED_EXPRESSION, @@ -883,7 +916,7 @@ class gt { dictionary() { const t = this.previous(); if (this.match(r.RightBrace)) - return new nt([], this.previous().line); + return new ct([], this.previous().line); const e = []; do if (this.match(r.DotDotDot)) @@ -893,12 +926,12 @@ class gt { if (this.match(r.Colon)) { const n = this.expression(); e.push( - new B(null, new z(s, s.line), n, s.line) + new B(null, new j(s, s.line), n, s.line) ); } else { const n = new O(s, s.line); e.push( - new B(null, new z(s, s.line), n, s.line) + new B(null, new j(s, s.line), n, s.line) ); } } else @@ -908,41 +941,41 @@ class gt { { token: this.peek().lexeme } ); while (this.match(r.Comma)); - return this.consume(r.RightBrace, 'Expected "}" after object literal'), new nt(e, t.line); + return this.consume(r.RightBrace, 'Expected "}" after object literal'), new ct(e, t.line); } list() { const t = [], e = this.previous(); if (this.match(r.RightBracket)) - return new ct([], this.previous().line); + return new ht([], this.previous().line); do this.match(r.DotDotDot) ? t.push(new I(this.expression(), this.previous().line)) : t.push(this.expression()); while (this.match(r.Comma)); return this.consume( r.RightBracket, 'Expected "]" after array declaration' - ), new ct(t, e.line); + ), new ht(t, e.line); } } function q(i) { return i >= "0" && i <= "9"; } -function vt(i) { +function bt(i) { return i >= "a" && i <= "z" || i >= "A" && i <= "Z" || i === "$" || i === "_"; } -function Ot(i) { - return vt(i) || q(i); +function Gt(i) { + return bt(i) || q(i); } -function Mt(i) { +function Vt(i) { return i.charAt(0).toUpperCase() + i.substring(1).toLowerCase(); } -function Ut(i) { +function Xt(i) { return r[i] >= r.And; } -class wt { +class xt { scan(t) { for (this.source = t, this.tokens = [], this.current = 0, this.start = 0, this.line = 1, this.col = 1; !this.eof(); ) this.start = this.current, this.getToken(); - return this.tokens.push(new lt(r.Eof, "", null, this.line, 0)), this.tokens; + return this.tokens.push(new ft(r.Eof, "", null, this.line, 0)), this.tokens; } eof() { return this.current >= this.source.length; @@ -953,7 +986,7 @@ class wt { } addToken(t, e) { const s = this.source.substring(this.start, this.current); - this.tokens.push(new lt(t, s, e, this.line, this.col)); + this.tokens.push(new ft(t, s, e, this.line, this.col)); } match(t) { return this.eof() || this.source.charAt(this.current) !== t ? !1 : (this.current++, !0); @@ -996,10 +1029,10 @@ class wt { this.addToken(r.Number, Number(t)); } identifier() { - for (; Ot(this.peek()); ) + for (; Gt(this.peek()); ) this.advance(); - const t = this.source.substring(this.start, this.current), e = Mt(t); - Ut(e) ? this.addToken(r[e], t) : this.addToken(r.Identifier, t); + const t = this.source.substring(this.start, this.current), e = Vt(t); + Xt(e) ? this.addToken(r[e], t) : this.addToken(r.Identifier, t); } getToken() { const t = this.advance(); @@ -1139,12 +1172,12 @@ class wt { break; // complex cases default: - q(t) ? this.number() : vt(t) ? this.identifier() : this.error(E.UNEXPECTED_CHARACTER, { char: t }); + q(t) ? this.number() : bt(t) ? this.identifier() : this.error(E.UNEXPECTED_CHARACTER, { char: t }); break; } } error(t, e = {}) { - throw new C(t, e, this.line, this.col); + throw new C(t, e, { line: this.line, col: this.col, source: this.source }); } } class b { @@ -1165,16 +1198,16 @@ class b { return e && typeof e[t] < "u" ? e[t] : this.parent !== null ? this.parent.get(t) : window[t]; } } -class Bt { +class Qt { constructor() { - this.scope = new b(), this.scanner = new wt(), this.parser = new gt(); + this.scope = new b(), this.scanner = new xt(), this.parser = new wt(); } evaluate(t) { return t.result = t.accept(this); } visitPipelineExpr(t) { const e = this.evaluate(t.left); - if (t.right instanceof J) { + if (t.right instanceof T) { const n = this.evaluate(t.right.callee), a = [e]; for (const o of t.right.args) o instanceof I ? a.push(...this.evaluate(o.value)) : a.push(this.evaluate(o)); @@ -1197,7 +1230,7 @@ class Bt { }; } error(t, e = {}, s, n) { - throw new C(t, e, s, n); + throw new C(t, e, { line: s, col: n }); } visitVariableExpr(t) { return this.scope.get(t.name.lexeme); @@ -1226,7 +1259,7 @@ class Bt { const n = new B( t.entity.entity, t.entity.key, - new _(s, t.line), + new D(s, t.line), t.line ); this.evaluate(n); @@ -1244,7 +1277,7 @@ class Bt { return this.evaluate(t.value); } templateParse(t) { - const e = this.scanner.scan(t), s = this.parser.parse(e); + const e = this.scanner.scan(t), s = this.parser.parse(e, t); let n = ""; for (const a of s) n += this.evaluate(a).toString(); @@ -1344,7 +1377,7 @@ class Bt { const n = new B( t.right.entity, t.right.key, - new _(s, t.line), + new D(s, t.line), t.line ); this.evaluate(n); @@ -1410,9 +1443,9 @@ class Bt { return console.log(e), ""; } } -class Q { +class F { } -class ft extends Q { +class dt extends F { constructor(t, e, s, n, a = 0) { super(), this.type = "element", this.name = t, this.attributes = e, this.children = s, this.self = n, this.line = a; } @@ -1423,7 +1456,7 @@ class ft extends Q { return "KNode.Element"; } } -class Gt extends Q { +class Ft extends F { constructor(t, e, s = 0) { super(), this.type = "attribute", this.name = t, this.value = e, this.line = s; } @@ -1434,7 +1467,7 @@ class Gt extends Q { return "KNode.Attribute"; } } -class Vt extends Q { +class Wt extends F { constructor(t, e = 0) { super(), this.type = "text", this.value = t, this.line = e; } @@ -1445,7 +1478,7 @@ class Vt extends Q { return "KNode.Text"; } } -class Xt extends Q { +class zt extends F { constructor(t, e = 0) { super(), this.type = "doctype", this.value = t, this.line = e; } @@ -1456,7 +1489,7 @@ class Xt extends Q { return "KNode.Doctype"; } } -class et { +class it { parse(t) { for (this.current = 0, this.line = 1, this.col = 1, this.source = t, this.nodes = []; !this.eof(); ) { const e = this.node(); @@ -1487,7 +1520,7 @@ class et { return this.current > this.source.length; } error(t, e = {}) { - throw new C(t, e, this.line, this.col); + throw new C(t, e, { line: this.line, col: this.col, source: this.source }); } node() { this.whitespace(); @@ -1506,17 +1539,17 @@ class et { this.advance("Expected closing doctype"); while (!this.match(">")); const e = this.source.slice(t, this.current - 1).trim(); - return new Xt(e, this.line); + return new zt(e, this.line); } element() { const t = this.line, e = this.identifier("/", ">"); e || this.error(E.EXPECTED_TAG_NAME); const s = this.attributes(); - if (this.match("/>") || qt.includes(e) && this.match(">")) - return new ft(e, s, [], !0, this.line); + if (this.match("/>") || Bt.includes(e) && this.match(">")) + return new dt(e, s, [], !0, this.line); this.match(">") || this.error(E.EXPECTED_CLOSING_BRACKET); let n = []; - return this.whitespace(), this.peek("") || this.error(E.EXPECTED_CLOSING_TAG, { name: t }); @@ -1537,7 +1570,7 @@ class et { const e = this.line, s = this.identifier("=", ">", "/>"); s || this.error(E.BLANK_ATTRIBUTE_NAME), this.whitespace(); let n = ""; - this.match("=") && (this.whitespace(), this.match("'") ? n = this.decodeEntities(this.string("'")) : this.match('"') ? n = this.decodeEntities(this.string('"')) : n = this.decodeEntities(this.identifier(">", "/>"))), this.whitespace(), t.push(new Gt(s, n, e)); + this.match("=") && (this.whitespace(), this.match("'") ? n = this.decodeEntities(this.string("'")) : this.match('"') ? n = this.decodeEntities(this.string('"')) : n = this.decodeEntities(this.identifier(">", "/>"))), this.whitespace(), t.push(new Ft(s, n, e)); } return t; } @@ -1558,21 +1591,21 @@ class et { this.advance(); } const n = this.source.slice(t, this.current).trim(); - return n ? new Vt(this.decodeEntities(n), e) : null; + return n ? new Wt(this.decodeEntities(n), e) : null; } decodeEntities(t) { return t.replace(/ /g, " ").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, '"').replace(/'/g, "'").replace(/&/g, "&"); } whitespace() { let t = 0; - for (; this.peek(...ut) && !this.eof(); ) + for (; this.peek(...pt) && !this.eof(); ) t += 1, this.advance(); return t; } identifier(...t) { this.whitespace(); const e = this.current; - for (; !this.peek(...ut, ...t); ) + for (; !this.peek(...pt, ...t); ) this.advance(`Expected closing ${t}`); const s = this.current; return this.whitespace(), this.source.slice(e, s).trim(); @@ -1584,10 +1617,10 @@ class et { return this.source.slice(e, this.current - 1); } } -function Ht(i) { +function ee(i) { history.pushState(null, "", i), window.dispatchEvent(new PopStateEvent("popstate")); } -function Qt(i, t) { +function jt(i, t) { if (i === "*") return {}; const e = i.split("/").filter(Boolean), s = t.split("/").filter(Boolean); if (e.length !== s.length) return null; @@ -1599,7 +1632,7 @@ function Qt(i, t) { return null; return n; } -class pt extends At { +class mt extends Pt { constructor() { super(...arguments), this.routes = []; } @@ -1614,7 +1647,7 @@ class pt extends At { async _navigate() { const t = window.location.pathname; for (const e of this.routes) { - const s = Qt(e.path, t); + const s = jt(e.path, t); if (s !== null) { if (e.guard && !await e.guard()) return; @@ -1628,7 +1661,7 @@ class pt extends At { !s || !this.transpiler || this.transpiler.mountComponent(t, s, e); } } -class j { +class H { constructor(t, e = "boundary") { this.start = document.createComment(`${e}-start`), this.end = document.createComment(`${e}-end`), t.insert && typeof t.insert == "function" ? (t.insert(this.start), t.insert(this.end)) : (t.appendChild(this.start), t.appendChild(this.end)); } @@ -1655,9 +1688,9 @@ class j { return this.start.parentNode; } } -const G = /* @__PURE__ */ new Map(), Z = []; -let L = !1, X = !0; -function T() { +const G = /* @__PURE__ */ new Map(), tt = []; +let L = !1, V = !0; +function et() { L = !1; for (const [t, e] of G.entries()) try { @@ -1666,43 +1699,46 @@ function T() { s(); typeof t.onRender == "function" && t.onRender(); } catch (s) { - console.error("[Kasper] Error during component update:", s); + X(s, "render", t); } G.clear(); - const i = Z.splice(0); + const i = tt.splice(0); for (const t of i) try { t(); } catch (e) { - console.error("[Kasper] Error in nextTick callback:", e); + X(e, "render"); } } -function $(i, t) { - if (!X) { +function K(i, t) { + if (!V) { t(); return; } - G.has(i) || G.set(i, []), G.get(i).push(t), L || (L = !0, queueMicrotask(T)); + G.has(i) || G.set(i, []), G.get(i).push(t), L || (L = !0, queueMicrotask(et)); +} +function Ht() { + return V; } function M(i) { - const t = X; - X = !1; + const t = V; + V = !1; try { i(); } finally { - X = t; + V = t; } } -function Jt(i) { +function se(i) { if (i) { - Z.push(i), L || (L = !0, queueMicrotask(T)); + tt.push(i), L || (L = !0, queueMicrotask(et)); return; } return new Promise((t) => { - Z.push(t), L || (L = !0, queueMicrotask(T)); + tt.push(t), L || (L = !0, queueMicrotask(et)); }); } -const dt = { +const Et = { esc: ["Escape", "Esc"], escape: ["Escape", "Esc"], space: [" ", "Spacebar"], @@ -1721,9 +1757,9 @@ const dt = { minus: ["-"], equal: ["="] }; -class bt { +class St { constructor(t) { - this.scanner = new wt(), this.parser = new gt(), this.templateParser = new et(), this.interpreter = new Bt(), this.registry = {}, this.mode = "development", this.isRendering = !1, this.registry.router = { component: pt }, t && t.registry && (this.registry = { ...this.registry, ...t.registry }); + this.scanner = new xt(), this.parser = new wt(), this.templateParser = new it(), this.interpreter = new Qt(), this.registry = {}, this.mode = "development", this.isRendering = !1, this.registry.router = { component: mt }, t && t.registry && (this.registry = { ...this.registry, ...t.registry }); } renderComponentInstance(t, e, s, n, a) { a && (t.$slots = a), t.$render = () => { @@ -1775,11 +1811,17 @@ class bt { // so effects set up inside @each always evaluate in their item scope. scopedEffect(t) { const e = this.interpreter.scope; - return tt(() => { + return st(() => { const s = this.interpreter.scope; this.interpreter.scope = e; try { t(); + } catch (n) { + if (Ht()) { + const a = this.interpreter.scope.get("$instance"); + X(n, "render", a); + } else + throw n; } finally { this.interpreter.scope = s; } @@ -1801,7 +1843,7 @@ class bt { } // evaluates expressions and returns the result of the first evaluation execute(t, e) { - const s = this.scanner.scan(t), n = this.parser.parse(s), a = this.interpreter.scope; + const s = this.scanner.scan(t), n = this.parser.parse(s, t), a = this.interpreter.scope; e && (this.interpreter.scope = e); const o = n.map( (c) => this.interpreter.evaluate(c) @@ -1826,7 +1868,7 @@ class bt { e && (e.insert && typeof e.insert == "function" ? e.insert(s) : e.appendChild(s)); const n = this.scopedEffect(() => { const a = this.evaluateTemplateString(t.value), o = this.interpreter.scope.get("$instance"); - o ? $(o, () => { + o ? K(o, () => { s.textContent = a; }) : s.textContent = a; }); @@ -1852,40 +1894,40 @@ class bt { return s || null; } doIf(t, e) { - const s = new j(e, "if"), n = () => { + const s = new H(e, "if"), n = () => { const o = this.interpreter.scope.get("$instance"), c = o ? new b(this.interpreter.scope) : this.interpreter.scope, m = this.interpreter.scope; this.interpreter.scope = c; - const d = []; - if (d.push(!!this.execute(t[0][1].value)), !d[0]) { - for (const p of t.slice(1)) - if (this.findAttr(p[0], ["@elseif"])) { - const u = !!this.execute(p[1].value); - if (d.push(u), u) break; - } else if (this.findAttr(p[0], ["@else"])) { - d.push(!0); + const p = []; + if (p.push(!!this.execute(t[0][1].value)), !p[0]) { + for (const d of t.slice(1)) + if (this.findAttr(d[0], ["@elseif"])) { + const u = !!this.execute(d[1].value); + if (p.push(u), u) break; + } else if (this.findAttr(d[0], ["@else"])) { + p.push(!0); break; } } this.interpreter.scope = m; const l = () => { s.nodes().forEach((u) => this.destroyNode(u)), s.clear(); - const p = this.interpreter.scope; + const d = this.interpreter.scope; this.interpreter.scope = c; try { - if (d[0]) { + if (p[0]) { t[0][0].accept(this, s); return; } - for (let u = 1; u < d.length; u++) - if (d[u]) { + for (let u = 1; u < p.length; u++) + if (p[u]) { t[u][0].accept(this, s); return; } } finally { - this.interpreter.scope = p; + this.interpreter.scope = d; } }; - o ? $(o, l) : l(); + o ? K(o, l) : l(); }; s.start.$kasperRefresh = this.scopedRefresh(n); const a = this.scopedEffect(n); @@ -1896,19 +1938,19 @@ class bt { n ? this.doEachKeyed(t, e, s, n) : this.doEachUnkeyed(t, e, s); } doEachUnkeyed(t, e, s) { - const n = new j(s, "each"), a = this.interpreter.scope, o = () => { - const m = this.scanner.scan(t.value), [d, l, p] = this.interpreter.evaluate( + const n = new H(s, "each"), a = this.interpreter.scope, o = () => { + const m = this.scanner.scan(t.value), [p, l, d] = this.interpreter.evaluate( this.parser.foreach(m) ), u = this.interpreter.scope.get("$instance"), f = () => { n.nodes().forEach((w) => this.destroyNode(w)), n.clear(); let h = 0; - for (const w of p) { - const g = { [d]: w }; + for (const w of d) { + const g = { [p]: w }; l && (g[l] = h), this.interpreter.scope = new b(a, g), this.createElement(e, n), h += 1; } this.interpreter.scope = a; }; - u ? $(u, f) : f(); + u ? K(u, f) : f(); }; n.start.$kasperRefresh = this.scopedRefresh(o); const c = this.scopedEffect(o); @@ -1921,31 +1963,31 @@ class bt { }), (e = t.childNodes) == null || e.forEach((s) => this.triggerRefresh(s)); } doEachKeyed(t, e, s, n) { - const a = new j(s, "each"), o = this.interpreter.scope, c = /* @__PURE__ */ new Map(), m = () => { - const l = this.scanner.scan(t.value), [p, u, f] = this.interpreter.evaluate( + const a = new H(s, "each"), o = this.interpreter.scope, c = /* @__PURE__ */ new Map(), m = () => { + const l = this.scanner.scan(t.value), [d, u, f] = this.interpreter.evaluate( this.parser.foreach(l) ), h = this.interpreter.scope.get("$instance"), w = [], g = /* @__PURE__ */ new Set(); let A = 0; for (const N of f) { - const P = { [p]: N }; + const P = { [d]: N }; u && (P[u] = A), this.interpreter.scope = new b(o, P); const S = this.execute(n.value); this.mode === "development" && g.has(S) && console.warn(`[Kasper] Duplicate key detected in @each: "${S}". Keys must be unique to ensure correct reconciliation.`), g.add(S), w.push({ item: N, idx: A, key: S }), A++; } const y = () => { - var st; + var rt; const N = new Set(w.map((k) => k.key)); - for (const [k, K] of c) - N.has(k) || (this.destroyNode(K), (st = K.parentNode) == null || st.removeChild(K), c.delete(k)); + for (const [k, $] of c) + N.has(k) || (this.destroyNode($), (rt = $.parentNode) == null || rt.removeChild($), c.delete(k)); const P = a.end.parentNode; let S = a.start; - for (const { item: k, idx: K, key: W } of w) { - const it = { [p]: k }; - if (u && (it[u] = K), this.interpreter.scope = new b(o, it), c.has(W)) { + for (const { item: k, idx: $, key: W } of w) { + const nt = { [d]: k }; + if (u && (nt[u] = $), this.interpreter.scope = new b(o, nt), c.has(W)) { const x = c.get(W); S.nextSibling !== x && P.insertBefore(x, S.nextSibling), S = x; - const F = x.$kasperScope; - F && (F.set(p, k), u && F.set(u, K), this.triggerRefresh(x)); + const z = x.$kasperScope; + z && (z.set(d, k), u && z.set(u, $), this.triggerRefresh(x)); } else { const x = this.createElement(e, a); x && (S.nextSibling !== x && P.insertBefore(x, S.nextSibling), S = x, c.set(W, x), x.$kasperScope = this.interpreter.scope); @@ -1953,11 +1995,11 @@ class bt { } this.interpreter.scope = o; }; - h ? $(h, y) : y(); + h ? K(h, y) : y(); }; a.start.$kasperRefresh = this.scopedRefresh(m); - const d = this.scopedEffect(m); - this.trackEffect(a, d); + const p = this.scopedEffect(m); + this.trackEffect(a, p); } createSiblings(t, e) { let s = 0; @@ -1968,13 +2010,13 @@ class bt { if (o.type === "element") { const c = o, m = this.findAttr(c, ["@let"]); m && (a || (a = new b(n), this.interpreter.scope = a), this.execute(m.value)); - const d = this.findAttr(c, ["@if"]), l = this.findAttr(c, ["@elseif"]), p = this.findAttr(c, ["@else"]), u = this.findAttr(c, ["@each"]); - if (this.mode === "development" && [d, l, p, u].filter((h) => h).length > 1 && this.error(E.MULTIPLE_STRUCTURAL_DIRECTIVES, {}, c.name), u) { + const p = this.findAttr(c, ["@if"]), l = this.findAttr(c, ["@elseif"]), d = this.findAttr(c, ["@else"]), u = this.findAttr(c, ["@each"]); + if (this.mode === "development" && [p, l, d, u].filter((h) => h).length > 1 && this.error(E.MULTIPLE_STRUCTURAL_DIRECTIVES, {}, c.name), u) { this.doEach(u, c, e); continue; } - if (d) { - const f = [[c, d]]; + if (p) { + const f = [[c, p]]; for (; s < t.length; ) { const h = t[s]; if (h.type !== "element") break; @@ -1999,19 +2041,19 @@ class bt { var s, n; try { if (t.name === "slot") { - const l = this.findAttr(t, ["@name"]), p = l ? l.value : "default", u = this.interpreter.scope.get("$slots"); - if (u && u[p]) { + const l = this.findAttr(t, ["@name"]), d = l ? l.value : "default", u = this.interpreter.scope.get("$slots"); + if (u && u[d]) { const f = this.interpreter.scope; - u[p].scope && (this.interpreter.scope = u[p].scope), this.createSiblings(u[p], e), this.interpreter.scope = f; + u[d].scope && (this.interpreter.scope = u[d].scope), this.createSiblings(u[d], e), this.interpreter.scope = f; } return; } const a = t.name === "void", o = !!this.registry[t.name], c = a ? e : document.createElement(t.name), m = this.interpreter.scope; if (c && c !== e && this.interpreter.scope.set("$ref", c), o) { let l = {}; - const p = t.attributes.filter( + const d = t.attributes.filter( (h) => h.name.startsWith("@:") - ), u = this.createComponentArgs(p), f = { default: [] }; + ), u = this.createComponentArgs(d), f = { default: [] }; f.default.scope = this.interpreter.scope; for (const h of t.children) { if (h.type === "element") { @@ -2043,7 +2085,7 @@ class bt { args: u, ref: c, transpiler: this - }), this.bindMethods(l), c.$kasperInstance = l, t.name === "router" && l instanceof pt) { + }), this.bindMethods(l), c.$kasperInstance = l, t.name === "router" && l instanceof mt) { const h = new b(m, l); l.setRoutes(this.extractRoutes(t.children, void 0, h)); } @@ -2057,10 +2099,10 @@ class bt { ); for (const f of l) this.createEventListener(c, f); - const p = t.attributes.filter( + const d = t.attributes.filter( (f) => !f.name.startsWith("@") ); - for (const f of p) + for (const f of d) this.evaluate(f, c); const u = t.attributes.filter((f) => { const h = f.name; @@ -2075,7 +2117,7 @@ class bt { const g = this.execute(f.value), A = this.interpreter.scope.get("$instance"), y = () => { c.setAttribute("class", g); }; - A ? $(A, y) : y(); + A ? K(A, y) : y(); }); this.trackEffect(c, w); } else { @@ -2089,17 +2131,17 @@ class bt { } else c.setAttribute(h, g); }; - A ? $(A, y) : y(); + A ? K(A, y) : y(); }); this.trackEffect(c, w); } } } e && !a && (e.insert && typeof e.insert == "function" ? e.insert(c) : e.appendChild(c)); - const d = this.findAttr(t, ["@ref"]); - if (d && !a) { - const l = d.value.trim(), p = this.interpreter.scope.get("$instance"); - p ? p[l] = c : this.interpreter.scope.set(l, c); + const p = this.findAttr(t, ["@ref"]); + if (p && !a) { + const l = p.value.trim(), d = this.interpreter.scope.get("$instance"); + d ? d[l] = c : this.interpreter.scope.set(l, c); } return t.self || (this.createSiblings(t.children, c), this.interpreter.scope = m), c; } catch (a) { @@ -2126,14 +2168,14 @@ class bt { createEventListener(t, e) { const [s, ...n] = e.name.split(":")[1].split("."), a = new b(this.interpreter.scope), o = this.interpreter.scope.get("$instance"), c = {}; o && o.$abortController && (c.signal = o.$abortController.signal), n.includes("once") && (c.once = !0), n.includes("passive") && (c.passive = !0), n.includes("capture") && (c.capture = !0); - const m = ["prevent", "stop", "once", "passive", "capture", "ctrl", "shift", "alt", "meta"], d = n.filter((l) => !m.includes(l.toLowerCase())); + const m = ["prevent", "stop", "once", "passive", "capture", "ctrl", "shift", "alt", "meta"], p = n.filter((l) => !m.includes(l.toLowerCase())); t.addEventListener( s, (l) => { - d.length > 0 && !d.some((u) => { + p.length > 0 && !p.some((u) => { var h; const f = u.toLowerCase(); - return !!(dt[f] && dt[f].includes(l.key) || f === ((h = l.key) == null ? void 0 : h.toLowerCase())); + return !!(Et[f] && Et[f].includes(l.key) || f === ((h = l.key) == null ? void 0 : h.toLowerCase())); }) || n.includes("ctrl") && !l.ctrlKey || n.includes("shift") && !l.shiftKey || n.includes("alt") && !l.altKey || n.includes("meta") && !l.metaKey || (n.includes("prevent") && l.preventDefault(), n.includes("stop") && l.stopPropagation(), a.set("$event", l), this.execute(e.value, a)); }, c @@ -2143,7 +2185,7 @@ class bt { return t && (/\{\{.+\}\}/ms.test(t) ? t.replace(/\{\{([\s\S]+?)\}\}/g, (s, n) => this.evaluateExpression(n)) : t); } evaluateExpression(t) { - const e = this.scanner.scan(t), s = this.parser.parse(e); + const e = this.scanner.scan(t), s = this.parser.parse(e, t); let n = ""; for (const a of s) n += `${this.interpreter.evaluate(a)}`; @@ -2178,20 +2220,20 @@ class bt { this.isRendering = !0; try { this.destroy(o), o.innerHTML = ""; - const p = new b(null, c); - p.set("$instance", c); + const d = new b(null, c); + d.set("$instance", c); const u = this.interpreter.scope; - this.interpreter.scope = p, M(() => { + this.interpreter.scope = d, M(() => { this.createSiblings(m, o), typeof c.onRender == "function" && c.onRender(); }), this.interpreter.scope = u; } finally { this.isRendering = !1; } }; - const d = new b(null, c); - d.set("$instance", c); + const p = new b(null, c); + p.set("$instance", c); const l = this.interpreter.scope; - this.interpreter.scope = d, M(() => { + this.interpreter.scope = p, M(() => { this.createSiblings(a, o); }), this.interpreter.scope = l, typeof c.onMount == "function" && c.onMount(), typeof c.onRender == "function" && c.onRender(); } @@ -2202,15 +2244,15 @@ class bt { if (o.type !== "element") continue; const c = o; if (c.name === "route") { - const m = this.findAttr(c, ["@path"]), d = this.findAttr(c, ["@component"]), l = this.findAttr(c, ["@guard"]); - (!m || !d) && this.error(E.MISSING_REQUIRED_ATTR, { message: " requires @path and @component attributes." }, c.name); - const p = m.value, u = this.execute(d.value), f = l ? this.execute(l.value) : e; - n.push({ path: p, component: u, guard: f }); + const m = this.findAttr(c, ["@path"]), p = this.findAttr(c, ["@component"]), l = this.findAttr(c, ["@guard"]); + (!m || !p) && this.error(E.MISSING_REQUIRED_ATTR, { message: " requires @path and @component attributes." }, c.name); + const d = m.value, u = this.execute(p.value), f = l ? this.execute(l.value) : e; + n.push({ path: d, component: u, guard: f }); } else if (c.name === "guard") { const m = this.findAttr(c, ["@check"]); if (m || this.error(E.MISSING_REQUIRED_ATTR, { message: " requires @check attribute." }, c.name), !m) continue; - const d = this.execute(m.value); - n.push(...this.extractRoutes(c.children, d)); + const p = this.execute(m.value); + n.push(...this.extractRoutes(c.children, p)); } } return s && (this.interpreter.scope = a), n; @@ -2224,17 +2266,17 @@ class bt { } error(t, e, s) { let n = e; - throw typeof e == "string" && (n = { message: e.includes("Runtime Error") ? e.replace("Runtime Error: ", "") : e }), new C(t, n, void 0, void 0, s); + throw typeof e == "string" && (n = { message: e.includes("Runtime Error") ? e.replace("Runtime Error: ", "") : e }), new C(t, n, { tag: s }); } } -function Zt(i) { +function ie(i) { return { lazy: !0, component: () => i().then((t) => Object.values(t)[0]) }; } -function Tt(i) { - const t = new et(); +function re(i) { + const t = new it(); try { const e = t.parse(i); return JSON.stringify(e); @@ -2242,11 +2284,11 @@ function Tt(i) { return JSON.stringify([e instanceof Error ? e.message : String(e)]); } } -function te(i, t, e, s) { - const a = new et().parse(i); - return new bt({ registry: s || {} }).transpile(a, t || {}, e); +function ne(i, t, e, s) { + const a = new it().parse(i); + return new St({ registry: s || {} }).transpile(a, t || {}, e); } -function Wt(i, t) { +function Yt(i, t) { const e = document.createElement(t), s = new i.registry[t].component({ ref: e, transpiler: i, @@ -2258,7 +2300,7 @@ function Wt(i, t) { nodes: i.resolveNodes(t) }; } -function ee(i) { +function ae(i) { const t = typeof i.root == "string" ? document.querySelector(i.root) : i.root; if (!t) throw new C( @@ -2271,28 +2313,29 @@ function ee(i) { E.ENTRY_COMPONENT_NOT_FOUND, { tag: e } ); - const s = new bt({ registry: i.registry }); + i.onError && Ct(i.onError); + const s = new St({ registry: i.registry }); i.mode && (s.mode = i.mode); - const { node: n, instance: a, nodes: o } = Wt(s, e); + const { node: n, instance: a, nodes: o } = Yt(s, e); return t.innerHTML = "", t.appendChild(n), typeof a.onMount == "function" && a.onMount(), s.transpile(o, a, n), typeof a.onRender == "function" && a.onRender(), a; } export { - ee as App, - At as Component, - gt as ExpressionParser, - Bt as Interpreter, - pt as Router, - wt as Scanner, - et as TemplateParser, - bt as Transpiler, - jt as batch, - Nt as computed, - tt as effect, - Tt as execute, - Zt as lazy, - Ht as navigate, - Jt as nextTick, - Ft as signal, - te as transpile, - zt as watch + ae as App, + Pt as Component, + wt as ExpressionParser, + Qt as Interpreter, + mt as Router, + xt as Scanner, + it as TemplateParser, + St as Transpiler, + Tt as batch, + Rt as computed, + st as effect, + re as execute, + ie as lazy, + ee as navigate, + se as nextTick, + Jt as signal, + ne as transpile, + Zt as watch }; diff --git a/dist/types/component.d.ts b/dist/types/component.d.ts index 7f05cb5..d948cce 100644 --- a/dist/types/component.d.ts +++ b/dist/types/component.d.ts @@ -34,6 +34,7 @@ export declare class Component = Record | null | undefined; diff --git a/dist/types/error-handler.d.ts b/dist/types/error-handler.d.ts new file mode 100644 index 0000000..9f2291f --- /dev/null +++ b/dist/types/error-handler.d.ts @@ -0,0 +1,7 @@ +export type ErrorPhase = 'render' | 'watcher'; +export type ErrorHandlerFn = (error: Error, context: { + component?: any; + phase: ErrorPhase; +}) => void; +export declare function setErrorHandler(handler: ErrorHandlerFn | undefined): void; +export declare function handleError(error: unknown, phase: ErrorPhase, component?: any): void; diff --git a/dist/types/expression-parser.d.ts b/dist/types/expression-parser.d.ts index ee0ef52..399fead 100644 --- a/dist/types/expression-parser.d.ts +++ b/dist/types/expression-parser.d.ts @@ -3,7 +3,8 @@ import { Token } from "./types/token"; export declare class ExpressionParser { private current; private tokens; - parse(tokens: Token[]): Expr.Expr[]; + private source; + parse(tokens: Token[], source?: string): Expr.Expr[]; private match; private advance; private peek; diff --git a/dist/types/index.d.ts b/dist/types/index.d.ts index de2ce4c..5027b8b 100644 --- a/dist/types/index.d.ts +++ b/dist/types/index.d.ts @@ -10,3 +10,4 @@ import { signal, effect, computed, batch, watch } from "./signal"; import { nextTick } from "./scheduler"; export { ExpressionParser, Interpreter, Scanner, TemplateParser, Transpiler, signal, effect, computed, batch, watch, nextTick }; export { execute, transpile, bootstrap as App, lazy, Component, navigate, Router }; +export type { ErrorHandlerFn } from "./error-handler"; diff --git a/dist/types/kasper.d.ts b/dist/types/kasper.d.ts index 98c7ec6..6445dd5 100644 --- a/dist/types/kasper.d.ts +++ b/dist/types/kasper.d.ts @@ -1,4 +1,5 @@ import { ComponentClass, ComponentRegistry } from "./component"; +import { ErrorHandlerFn } from "./error-handler"; export declare function lazy(importer: () => Promise>): { component: () => Promise; lazy: true; @@ -12,5 +13,6 @@ export interface KasperConfig { entry?: string; registry: ComponentRegistry; mode?: "development" | "production"; + onError?: ErrorHandlerFn; } export declare function bootstrap(config: KasperConfig): import("./component").Component>; diff --git a/dist/types/scheduler.d.ts b/dist/types/scheduler.d.ts index 3ae74d1..2b0594d 100644 --- a/dist/types/scheduler.d.ts +++ b/dist/types/scheduler.d.ts @@ -5,6 +5,7 @@ export declare function queueUpdate(instance: Component, task: Task): void; * Executes a function with batching disabled. * Used for initial mount and manual renders. */ +export declare function isBatching(): boolean; export declare function flushSync(fn: () => void): void; /** * Returns a promise that resolves after the next framework update cycle. diff --git a/dist/types/types/error.d.ts b/dist/types/types/error.d.ts index 3398112..757296c 100644 --- a/dist/types/types/error.d.ts +++ b/dist/types/types/error.d.ts @@ -29,12 +29,18 @@ export declare const KErrorCode: { }; export type KErrorCodeType = (typeof KErrorCode)[keyof typeof KErrorCode]; export declare const ErrorTemplates: Record string>; +export interface KasperErrorOptions { + line?: number; + col?: number; + tag?: string; + source?: string; +} export declare class KasperError extends Error { code: KErrorCodeType; args: any; line?: number; col?: number; tagName?: string; - constructor(code: KErrorCodeType, args?: any, line?: number, col?: number, tagName?: string); + constructor(code: KErrorCodeType, args?: any, options?: KasperErrorOptions); withTag(tagName: string): this; } diff --git a/docs-web/astro.config.mjs b/docs-web/astro.config.mjs index 4bd89e6..57162d1 100644 --- a/docs-web/astro.config.mjs +++ b/docs-web/astro.config.mjs @@ -30,6 +30,7 @@ export default defineConfig({ { label: 'Pipes', link: '/guides/pipes/' }, { label: 'Routing', link: '/guides/routing/' }, { label: 'Lazy Loading', link: '/guides/lazy-loading/' }, + { label: 'Error Handling', link: '/guides/error-handling/' }, { label: 'AI-Driven Development', link: '/guides/agents/' }, { label: 'Vite Integration', link: '/guides/vite/' } ] diff --git a/docs-web/public/llms.txt b/docs-web/public/llms.txt index cb31490..3268961 100644 --- a/docs-web/public/llms.txt +++ b/docs-web/public/llms.txt @@ -527,6 +527,33 @@ registry: { --- +## Error handling + +Errors during reactive updates are caught by the framework. Configure handlers to surface them: + +```ts +// Global handler — receives all unhandled errors +App({ + onError(error, { component, phase }) { + // phase: 'render' | 'watcher' + Sentry.captureException(error); + }, +}); + +// Component-level — handle locally, optionally show fallback UI +export class MyComponent extends Component { + onError(error: Error, phase: string) { + this.hasError.value = true; + // re-throw to also reach the global handler + } +} +``` + +Propagation order: component `onError` → global `onError` → `console.error`. +Component `onError` suppresses the global handler unless it re-throws. + +--- + ## Key rules - One component per `.kasper` file diff --git a/docs-web/src/content/docs/guides/error-handling.md b/docs-web/src/content/docs/guides/error-handling.md new file mode 100644 index 0000000..337637d --- /dev/null +++ b/docs-web/src/content/docs/guides/error-handling.md @@ -0,0 +1,104 @@ +--- +title: Error Handling +description: Catching and reporting render errors with component and global error handlers. +sidebar: + order: 10 +--- + +By default, errors that occur during a reactive update (signal change triggering a re-render) are caught by the framework to prevent a single component from crashing the whole app. Without error handlers configured those errors are only logged to the console — your application code never sees them. + +Kasper provides two levels of error handling: a **component-level `onError` hook** and a **global `onError` handler** on the app config. + +## Global error handler + +Pass `onError` to `App()` to intercept all unhandled render and watcher errors. Use this for error reporting services like Sentry: + +```ts +import { App } from 'kasper-js'; +import { AppRoot } from './components/AppRoot.kasper'; + +App({ + root: document.body, + entry: 'app-root', + registry: { + 'app-root': { component: AppRoot }, + }, + onError(error, { component, phase }) { + console.error(`[${phase}] in`, component?.constructor?.name, error); + // e.g. Sentry.captureException(error, { extra: { phase } }); + }, +}); +``` + +`phase` is either `'render'` (reactive DOM update) or `'watcher'` (a `watch()` callback threw). + +## Component-level `onError` + +Define `onError` on any component to handle errors locally — for example to show a fallback UI instead of leaving a broken element on screen: + +```html + + + + +``` + +If `onError` handles the error (does not re-throw), the global handler is **not** called. Re-throw if you want both — local recovery AND global reporting. + +## Error propagation order + +``` +Error during render / watcher + │ + ├─ component.onError defined? + │ ├─ yes → call it + │ │ ├─ returns normally → done (global handler skipped) + │ │ └─ throws → fall through with original error + │ └─ no → fall through + │ + ├─ global onError configured? + │ ├─ yes → call it → done + │ └─ no → fall through + │ + └─ console.error (final fallback) +``` + +## TypeScript + +`ErrorHandlerFn` is exported for typing the global handler: + +```ts +import type { ErrorHandlerFn } from 'kasper-js'; + +const handler: ErrorHandlerFn = (error, { component, phase }) => { + // ... +}; +``` + +## What is and isn't caught + +| Scenario | Caught | +|---|---| +| Error in template expression during reactive update | ✓ | +| Error in a `watch()` callback | ✓ | +| Error thrown during initial mount (`App()`) | ✗ — propagates to caller | +| Error in `onMount` / `onDestroy` | ✗ — propagates normally | diff --git a/spec/error-handling.spec.ts b/spec/error-handling.spec.ts new file mode 100644 index 0000000..2d51a4d --- /dev/null +++ b/spec/error-handling.spec.ts @@ -0,0 +1,261 @@ +import { describe, it, expect, vi, afterEach } from "vitest"; +import { Component } from "../src/component"; +import { signal } from "../src/signal"; +import { queueUpdate, nextTick } from "../src/scheduler"; +import { setErrorHandler } from "../src/error-handler"; +import { Transpiler } from "../src/transpiler"; +import { App } from "../src/index"; + +// Reset the global error handler after every test to avoid cross-contamination +afterEach(() => { + setErrorHandler(undefined); + vi.restoreAllMocks(); +}); + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +function makeTranspiler(registry: any = {}) { + return new Transpiler({ registry }); +} + +function render(html: string, transpiler: Transpiler, entity: Record = {}) { + const container = document.createElement("div"); + transpiler.transpile( + (transpiler as any).templateParser.parse(html), + entity, + container + ); + return container; +} + +// --------------------------------------------------------------------------- + +describe("Error handling — global handler", () => { + it("is called with phase='render' when a render task throws", async () => { + const handler = vi.fn(); + setErrorHandler(handler); + + const instance = new Component() as any; + instance.onChanges = () => { throw new Error("render boom"); }; + + queueUpdate(instance, vi.fn()); + await nextTick(); + + expect(handler).toHaveBeenCalledOnce(); + const [err, ctx] = handler.mock.calls[0]; + expect(err.message).toBe("render boom"); + expect(ctx.phase).toBe("render"); + expect(ctx.component).toBe(instance); + }); + + it("is called with phase='watcher' when a watch callback throws", async () => { + const handler = vi.fn(); + setErrorHandler(handler); + + const count = signal(0); + count.onChange(() => { throw new Error("watcher boom"); }); + + count.value = 1; + + expect(handler).toHaveBeenCalledOnce(); + const [err, ctx] = handler.mock.calls[0]; + expect(err.message).toBe("watcher boom"); + expect(ctx.phase).toBe("watcher"); + expect(ctx.component).toBeUndefined(); + }); + + it("receives the Error object even when a non-Error is thrown", async () => { + const handler = vi.fn(); + setErrorHandler(handler); + + const instance = new Component() as any; + instance.onChanges = () => { throw "string error"; }; + + queueUpdate(instance, vi.fn()); + await nextTick(); + + const [err] = handler.mock.calls[0]; + expect(err).toBeInstanceOf(Error); + expect(err.message).toBe("string error"); + }); + + it("falls back to console.error when no handler is registered", async () => { + const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => {}); + + const instance = new Component() as any; + instance.onChanges = () => { throw new Error("unhandled"); }; + + queueUpdate(instance, vi.fn()); + await nextTick(); + + expect(consoleSpy).toHaveBeenCalledOnce(); + expect(consoleSpy.mock.calls[0][0]).toContain("[Kasper]"); + }); + + it("is registered via App() onError config option", async () => { + const handler = vi.fn(); + const root = document.createElement("div"); + + class Broken extends Component { + static template = ""; + } + + App({ + root, + entry: "broken", + registry: { broken: { component: Broken as any } }, + onError: handler, + }); + + const instance = new Component() as any; + instance.onChanges = () => { throw new Error("app-level error"); }; + queueUpdate(instance, vi.fn()); + await nextTick(); + + expect(handler).toHaveBeenCalledOnce(); + expect(handler.mock.calls[0][0].message).toBe("app-level error"); + }); +}); + +// --------------------------------------------------------------------------- + +describe("Error handling — component onError hook", () => { + it("is called before the global handler", async () => { + const order: string[] = []; + setErrorHandler(() => order.push("global")); + + const instance = new Component() as any; + instance.onError = () => order.push("component"); + instance.onChanges = () => { throw new Error("boom"); }; + + queueUpdate(instance, vi.fn()); + await nextTick(); + + expect(order).toEqual(["component"]); + }); + + it("suppresses the global handler when it handles the error normally", async () => { + const globalHandler = vi.fn(); + setErrorHandler(globalHandler); + + const instance = new Component() as any; + instance.onError = vi.fn(); // handles silently + instance.onChanges = () => { throw new Error("boom"); }; + + queueUpdate(instance, vi.fn()); + await nextTick(); + + expect(instance.onError).toHaveBeenCalledOnce(); + expect(globalHandler).not.toHaveBeenCalled(); + }); + + it("reaches the global handler when component onError re-throws", async () => { + const globalHandler = vi.fn(); + setErrorHandler(globalHandler); + + const instance = new Component() as any; + instance.onError = (err: Error) => { throw err; }; + instance.onChanges = () => { throw new Error("rethrown"); }; + + queueUpdate(instance, vi.fn()); + await nextTick(); + + expect(globalHandler).toHaveBeenCalledOnce(); + expect(globalHandler.mock.calls[0][0].message).toBe("rethrown"); + }); + + it("receives the correct error and phase", async () => { + const instance = new Component() as any; + const onError = vi.fn(); + instance.onError = onError; + instance.onChanges = () => { throw new Error("phase-check"); }; + + queueUpdate(instance, vi.fn()); + await nextTick(); + + expect(onError).toHaveBeenCalledWith( + expect.objectContaining({ message: "phase-check" }), + "render" + ); + }); + + it("falls back to console.error when component onError itself throws and no global handler", async () => { + const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => {}); + + const instance = new Component() as any; + instance.onError = () => { throw new Error("handler exploded"); }; + instance.onChanges = () => { throw new Error("original"); }; + + queueUpdate(instance, vi.fn()); + await nextTick(); + + expect(consoleSpy).toHaveBeenCalledOnce(); + }); +}); + +// --------------------------------------------------------------------------- + +describe("Error handling — reactive template errors", () => { + it("calls the global handler when a template expression throws during reactive update", async () => { + const handler = vi.fn(); + setErrorHandler(handler); + + class BrokenComp extends Component { + static template = "{{ data.value.name }}"; + data = signal({ name: "Alice" }); + } + + const transpiler = makeTranspiler({ "broken-comp": { component: BrokenComp } }); + const container = document.createElement("div"); + transpiler.transpile( + (transpiler as any).templateParser.parse(""), + {}, + container + ); + + const comp = (container.querySelector("broken-comp") as any)?.$kasperInstance as BrokenComp; + + // Setting data to null makes data.value.name throw on re-render + comp.data.value = null; + + expect(handler).toHaveBeenCalled(); + expect(handler.mock.calls[0][1].phase).toBe("render"); + }); + + it("component onError can set a fallback signal to show error UI", async () => { + class SafeComp extends Component { + static template = ` +
{{ data.value.name }}
+
Error occurred
+ `; + data = signal({ name: "Alice" }); + broken = signal(false); + + onError() { + this.broken.value = true; + } + } + + const transpiler = makeTranspiler({ "safe-comp": { component: SafeComp } }); + const container = document.createElement("div"); + transpiler.transpile( + (transpiler as any).templateParser.parse(""), + {}, + container + ); + + const comp = (container.querySelector("safe-comp") as any)?.$kasperInstance as SafeComp; + + expect(container.textContent).toContain("Alice"); + expect(container.querySelector(".fallback")).toBeNull(); + + // Trigger an error: set data to null so data.value.name throws + comp.data.value = null; + await nextTick(); + + expect(comp.broken.value).toBe(true); + expect(container.querySelector(".fallback")).not.toBeNull(); + }); +}); diff --git a/spec/error-system.spec.ts b/spec/error-system.spec.ts index 08a1784..597a852 100644 --- a/spec/error-system.spec.ts +++ b/spec/error-system.spec.ts @@ -1,8 +1,68 @@ import { describe, it, expect } from "vitest"; import { App, Component } from "../src/index"; +import { Scanner } from "../src/scanner"; +import { ExpressionParser } from "../src/expression-parser"; import { TemplateParser } from "../src/template-parser"; import { Transpiler } from "../src/transpiler"; +describe("Error message format", () => { + function catchError(fn: () => void): Error { + try { fn(); } catch (e: any) { return e; } + throw new Error("expected an error to be thrown"); + } + + it("scanner: error message contains the source line in the snippet", () => { + const err = catchError(() => new Scanner().scan("let x = @;")); + expect(err.message).toMatchInlineSnapshot(` + "[K002-3] Unexpected character '@' + > | let x = @; + ^ + + See: https://kasperjs.top/reference/errors#k002-3 + " + `); + }); + + it("expression parser: error message contains the source expression in the snippet", () => { + const source = "foo.bar("; + const err = catchError(() => + new ExpressionParser().parse(new Scanner().scan(source), source) + ); + expect(err.message).toMatchInlineSnapshot(` + "[K004-3] Expected expression, unexpected token "" + > | foo.bar( + + See: https://kasperjs.top/reference/errors#k004-3 + " + `); + }); + + it("template parser: error message contains the source markup in the snippet", () => { + const err = catchError(() => new TemplateParser().parse("
\n \n
")); + expect(err.message).toMatchInlineSnapshot(` + "[K003-5] Expected + |
+ > | + |
+ + See: https://kasperjs.top/reference/errors#k003-5 + " + `); + }); + + it("transpiler: error message contains the error code and message, no snippet", () => { + const nodes = new TemplateParser().parse('
'); + const err = catchError(() => new Transpiler().transpile(nodes, {}, document.createElement("div"))); + expect(err.message).toMatchInlineSnapshot(` + "[K003-7] @else must be preceded by an @if or @elseif block. + at
+ + See: https://kasperjs.top/reference/errors#k003-7 + " + `); + }); +}); + describe("Error System (New Checks)", () => { it("K001-2: throws if entry component is missing from registry", () => { const root = document.createElement("div"); @@ -19,7 +79,7 @@ describe("Error System (New Checks)", () => { const parser = new TemplateParser(); const transpiler = new Transpiler(); const container = document.createElement("div"); - + const nodes = parser.parse(''); expect(() => { transpiler.transpile(nodes, {}, container); @@ -30,7 +90,7 @@ describe("Error System (New Checks)", () => { const parser = new TemplateParser(); const transpiler = new Transpiler(); const container = document.createElement("div"); - + const nodes = parser.parse(''); expect(() => { transpiler.transpile(nodes, {}, container); @@ -42,7 +102,7 @@ describe("Error System (New Checks)", () => { const parser = new TemplateParser(); const transpiler = new Transpiler(); const container = document.createElement("div"); - + const nodes = parser.parse('
'); expect(() => { transpiler.transpile(nodes, {}, container); @@ -88,7 +148,7 @@ describe("Error System (New Checks)", () => { const parser = new TemplateParser(); const transpiler = new Transpiler(); const container = document.createElement("div"); - + const nodes = parser.parse('
'); expect(() => { transpiler.transpile(nodes, {}, container); diff --git a/spec/scanner.spec.ts b/spec/scanner.spec.ts index 311adfc..59b12da 100644 --- a/spec/scanner.spec.ts +++ b/spec/scanner.spec.ts @@ -294,8 +294,8 @@ describe("Scanner", () => { expect(() => new Scanner().scan("@")).toThrow("Unexpected character"); }); - it("error message includes line and column", () => { - expect(() => new Scanner().scan("@")).toThrow(/\(\d+:\d+\)/); + it("error message includes a code snippet", () => { + expect(() => new Scanner().scan("@")).toThrow(/>\s+\|/); }); }); diff --git a/spec/scheduler.spec.ts b/spec/scheduler.spec.ts index 77433d3..31818b2 100644 --- a/spec/scheduler.spec.ts +++ b/spec/scheduler.spec.ts @@ -89,7 +89,7 @@ describe("Scheduler", () => { queueUpdate(instance, task); await nextTick(); - expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("Error during component update:"), expect.any(Error)); + expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("[Kasper] Error during render:"), expect.any(Error)); // Even if hook fails, the scheduler should continue (though current implementation might skip tasks for that component) // Actually, my current flush handles each component in a try-catch. diff --git a/spec/template-parser.spec.ts b/spec/template-parser.spec.ts index 421a897..26527b3 100644 --- a/spec/template-parser.spec.ts +++ b/spec/template-parser.spec.ts @@ -331,8 +331,8 @@ describe("TemplateParser", () => { expect(() => new TemplateParser().parse("
")).toThrow(); }); - it("thrown error message includes line and column info", () => { - expect(() => new TemplateParser().parse("
")).toThrow(/\(\d+:\d+\)/); + it("thrown error message includes a code snippet", () => { + expect(() => new TemplateParser().parse("
")).toThrow(/>\s+\|/); }); }); }); diff --git a/spec/types.spec.ts b/spec/types.spec.ts index 2a99842..2b8a552 100644 --- a/spec/types.spec.ts +++ b/spec/types.spec.ts @@ -17,20 +17,19 @@ describe("KasperError", () => { }); it("message includes code and value", () => { - const err = new KasperError("K000" as any, "something failed", 3, 5); - expect(err.message).toContain("[K000] something failed (3:5)"); + const err = new KasperError("K000" as any, "something failed"); + expect(err.message).toContain("[K000] something failed"); expect(err.message).toContain("See: https://kasperjs.top/reference/errors#k000"); }); it("exposes line and col", () => { - const err = new KasperError("K000" as any, "something failed", 3, 5); + const err = new KasperError("K000" as any, "something failed", { line: 3, col: 5 }); expect(err.line).toBe(3); expect(err.col).toBe(5); }); - it("has a stack trace", () => { - expect(new KasperError("K000" as any, "something failed", 3, 5).stack).toBeDefined(); + expect(new KasperError("K000" as any, "something failed").stack).toBeDefined(); }); }); diff --git a/src/component.ts b/src/component.ts index 8e81f50..f1f42a4 100644 --- a/src/component.ts +++ b/src/component.ts @@ -62,6 +62,7 @@ export class Component = Record> onRender() { } onChanges() { } onDestroy() { } + onError?(error: Error, phase: string): void; render() { this.$render?.(); diff --git a/src/error-handler.ts b/src/error-handler.ts new file mode 100644 index 0000000..5e4bfde --- /dev/null +++ b/src/error-handler.ts @@ -0,0 +1,37 @@ +export type ErrorPhase = 'render' | 'watcher'; + +export type ErrorHandlerFn = ( + error: Error, + context: { component?: any; phase: ErrorPhase } +) => void; + +let globalHandler: ErrorHandlerFn | null = null; + +export function setErrorHandler(handler: ErrorHandlerFn | undefined): void { + globalHandler = handler ?? null; +} + +export function handleError(error: unknown, phase: ErrorPhase, component?: any): void { + const err = error instanceof Error ? error : new Error(String(error)); + + // Try component-level onError first + if (component && typeof component.onError === 'function') { + try { + component.onError(err, phase); + return; + } catch (e) { + // onError itself threw — fall through with original error + } + } + + // Try global handler + if (globalHandler) { + try { + globalHandler(err, { component, phase }); + return; + } catch (_) {} + } + + // Final fallback + console.error(`[Kasper] Error during ${phase}:`, err); +} diff --git a/src/expression-parser.ts b/src/expression-parser.ts index 75dad5a..5196535 100644 --- a/src/expression-parser.ts +++ b/src/expression-parser.ts @@ -5,10 +5,12 @@ import { Token, TokenType } from "./types/token"; export class ExpressionParser { private current: number; private tokens: Token[]; + private source: string; - public parse(tokens: Token[]): Expr.Expr[] { + public parse(tokens: Token[], source = ""): Expr.Expr[] { this.current = 0; this.tokens = tokens; + this.source = source; const expressions: Expr.Expr[] = []; while (!this.eof()) { expressions.push(this.expression()); @@ -62,7 +64,7 @@ export class ExpressionParser { } private error(code: KErrorCodeType, token: Token, args: any = {}): any { - throw new KasperError(code, args, token.line, token.col); + throw new KasperError(code, args, { line: token.line, col: token.col, source: this.source }); } private synchronize(): void { diff --git a/src/index.ts b/src/index.ts index fa351e0..76b02cf 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,3 +11,4 @@ import { nextTick } from "./scheduler"; export { ExpressionParser, Interpreter, Scanner, TemplateParser, Transpiler, signal, effect, computed, batch, watch, nextTick }; export { execute, transpile, bootstrap as App, lazy, Component, navigate, Router }; +export type { ErrorHandlerFn } from "./error-handler"; diff --git a/src/interpreter.ts b/src/interpreter.ts index c8ae276..43f4084 100644 --- a/src/interpreter.ts +++ b/src/interpreter.ts @@ -54,7 +54,7 @@ export class Interpreter implements Expr.ExprVisitor { } public error(code: KErrorCodeType, args: any = {}, line?: number, col?: number): void { - throw new KasperError(code, args, line, col); + throw new KasperError(code, args, { line, col }); } public visitVariableExpr(expr: Expr.Variable): any { @@ -127,7 +127,7 @@ export class Interpreter implements Expr.ExprVisitor { private templateParse(source: string): string { const tokens = this.scanner.scan(source); - const expressions = this.parser.parse(tokens); + const expressions = this.parser.parse(tokens, source); let result = ""; for (const expression of expressions) { result += this.evaluate(expression).toString(); diff --git a/src/kasper.ts b/src/kasper.ts index b5556c9..fff12bc 100644 --- a/src/kasper.ts +++ b/src/kasper.ts @@ -2,6 +2,7 @@ import { ComponentClass, ComponentRegistry } from "./component"; import { TemplateParser } from "./template-parser"; import { Transpiler } from "./transpiler"; import { KasperError, KErrorCode } from "./types/error"; +import { setErrorHandler, ErrorHandlerFn } from "./error-handler"; export function lazy( importer: () => Promise> @@ -40,6 +41,7 @@ export interface KasperConfig { entry?: string; registry: ComponentRegistry; mode?: "development" | "production"; + onError?: ErrorHandlerFn; } function createComponent(transpiler: Transpiler, tag: string) { @@ -78,6 +80,10 @@ export function bootstrap(config: KasperConfig) { ); } + if (config.onError) { + setErrorHandler(config.onError); + } + const transpiler = new Transpiler({ registry: config.registry }); if (config.mode) { diff --git a/src/scanner.ts b/src/scanner.ts index 96e2d87..a69d453 100644 --- a/src/scanner.ts +++ b/src/scanner.ts @@ -347,6 +347,6 @@ export class Scanner { } private error(code: KErrorCodeType, args: any = {}): void { - throw new KasperError(code, args, this.line, this.col); + throw new KasperError(code, args, { line: this.line, col: this.col, source: this.source }); } } diff --git a/src/scheduler.ts b/src/scheduler.ts index 8cd7424..40b1c52 100644 --- a/src/scheduler.ts +++ b/src/scheduler.ts @@ -1,4 +1,5 @@ import { Component } from "./component"; +import { handleError } from "./error-handler"; type Task = () => void; @@ -28,7 +29,7 @@ function flush() { instance.onRender(); } } catch (e) { - console.error("[Kasper] Error during component update:", e); + handleError(e, 'render', instance); } } queue.clear(); @@ -39,7 +40,7 @@ function flush() { try { cb(); } catch (e) { - console.error("[Kasper] Error in nextTick callback:", e); + handleError(e, 'render'); } } } @@ -67,6 +68,10 @@ export function queueUpdate(instance: Component, task: Task) { * Executes a function with batching disabled. * Used for initial mount and manual renders. */ +export function isBatching(): boolean { + return batchingEnabled; +} + export function flushSync(fn: () => void) { const prev = batchingEnabled; batchingEnabled = false; diff --git a/src/signal.ts b/src/signal.ts index a87222d..5e0290c 100644 --- a/src/signal.ts +++ b/src/signal.ts @@ -2,6 +2,8 @@ import { KasperError, KErrorCode } from "./types/error"; type Listener = () => void; +import { handleError } from "./error-handler"; + let activeEffect: { fn: Listener; deps: Set } | null = null; const effectStack: any[] = []; @@ -45,7 +47,7 @@ export class Signal { sub(); } for (const watcher of this.watchers) { - try { watcher(newValue, oldValue); } catch (e) { console.error("Watcher error:", e); } + try { watcher(newValue, oldValue); } catch (e) { handleError(e, 'watcher'); } } } } @@ -162,7 +164,7 @@ export function batch(fn: () => void): void { sub(); } for (const watcher of watchers) { - try { watcher(); } catch (e) { console.error("Watcher error:", e); } + try { watcher(); } catch (e) { handleError(e, 'watcher'); } } } } diff --git a/src/template-parser.ts b/src/template-parser.ts index 992be91..d83299c 100644 --- a/src/template-parser.ts +++ b/src/template-parser.ts @@ -69,7 +69,7 @@ export class TemplateParser { } private error(code: KErrorCodeType, args: any = {}): any { - throw new KasperError(code, args, this.line, this.col); + throw new KasperError(code, args, { line: this.line, col: this.col, source: this.source }); } private node(): Node.KNode { diff --git a/src/transpiler.ts b/src/transpiler.ts index 5de7b8d..0b1ec20 100644 --- a/src/transpiler.ts +++ b/src/transpiler.ts @@ -9,6 +9,8 @@ import { Boundary } from "./boundary"; import { TemplateParser } from "./template-parser"; import { queueUpdate, flushSync } from "./scheduler"; import { KasperError, KErrorCode, KErrorCodeType } from "./types/error"; +import { handleError } from "./error-handler"; +import { isBatching } from "./scheduler"; import * as KNode from "./types/nodes"; const KEY_MAP: Record = { @@ -144,6 +146,15 @@ export class Transpiler implements KNode.KNodeVisitor { this.interpreter.scope = scope; try { fn(); + } catch (e) { + // Only route to error handler during reactive re-runs (batching enabled). + // During initial mount (flushSync / batching disabled) errors propagate normally. + if (isBatching()) { + const instance = this.interpreter.scope.get("$instance"); + handleError(e, "render", instance); + } else { + throw e; + } } finally { this.interpreter.scope = prev; } @@ -168,7 +179,7 @@ export class Transpiler implements KNode.KNodeVisitor { // evaluates expressions and returns the result of the first evaluation private execute(source: string, overrideScope?: Scope): any { const tokens = this.scanner.scan(source); - const expressions = this.parser.parse(tokens); + const expressions = this.parser.parse(tokens, source); const restoreScope = this.interpreter.scope; if (overrideScope) { @@ -896,7 +907,7 @@ export class Transpiler implements KNode.KNodeVisitor { private evaluateExpression(source: string): string { const tokens = this.scanner.scan(source); - const expressions = this.parser.parse(tokens); + const expressions = this.parser.parse(tokens, source); let result = ""; for (const expression of expressions) { @@ -1049,7 +1060,7 @@ export class Transpiler implements KNode.KNodeVisitor { finalArgs = { message: cleanMessage }; } - throw new KasperError(code, finalArgs, undefined, undefined, tagName); + throw new KasperError(code, finalArgs, { tag: tagName }); } } diff --git a/src/types/error.ts b/src/types/error.ts index cfd063f..a2e6800 100644 --- a/src/types/error.ts +++ b/src/types/error.ts @@ -46,7 +46,7 @@ export type KErrorCodeType = (typeof KErrorCode)[keyof typeof KErrorCode]; export const ErrorTemplates: Record string> = { "K001-1": (a) => `Root element not found: ${a.root}`, "K001-2": (a) => `Entry component <${a.tag}> not found in registry.`, - + "K002-1": () => 'Unterminated comment, expecting closing "*/"', "K002-2": (a) => `Unterminated string, expecting closing ${a.quote}`, "K002-3": (a) => `Unexpected character '${a.char}'`, @@ -79,14 +79,44 @@ export const ErrorTemplates: Record string> = { "K007-2": (a) => a.message, }; +function codeSnippet(source: string, line: number, col: number, context = 2): string { + const lines = source.split("\n"); + const errorLine = line - 1; // 0-indexed + const start = Math.max(0, errorLine - context); + const end = Math.min(lines.length - 1, errorLine + context); + + const result: string[] = [""]; + for (let i = start; i <= end; i++) { + const indicator = i === errorLine ? ">" : " "; + result.push(` ${indicator} | ${lines[i]}`); + if (i === errorLine && col > 0) { + // prefix: " > | " (6) + (col - 1) spaces + const pointer = " ".repeat(6 + col - 1) + "^"; + result.push(pointer); + } + } + return result.join("\n"); +} + +export interface KasperErrorOptions { + line?: number; + col?: number; + tag?: string; + source?: string; +} + export class KasperError extends Error { + public line?: number; + public col?: number; + public tagName?: string; + constructor( public code: KErrorCodeType, public args: any = {}, - public line?: number, - public col?: number, - public tagName?: string + options: KasperErrorOptions = {} ) { + const { line, col, tag, source } = options; + // Detect environment const isDev = typeof process !== "undefined" @@ -94,18 +124,21 @@ export class KasperError extends Error { : (import.meta as any).env?.MODE !== "production"; const template = ErrorTemplates[code]; - const message = template - ? template(args) + const message = template + ? template(args) : (typeof args === 'string' ? args : "Unknown error"); - - const location = line !== undefined ? ` (${line}:${col})` : ""; - const tagInfo = tagName ? `\n at <${tagName}>` : ""; + + const tagInfo = tag ? `\n at <${tag}>` : ""; + const snippet = line !== undefined && source ? codeSnippet(source, line, col ?? 0) : ""; const link = isDev - ? `\n\nSee: https://kasperjs.top/reference/errors#${code.toLowerCase().replace(".", "")}` + ? `\n\nSee: https://kasperjs.top/reference/errors#${code.toLowerCase().replace(".", "")}\n` : ""; - super(`[${code}] ${message}${location}${tagInfo}${link}`); + super(`[${code}] ${message}${tagInfo}${snippet}${link}`); this.name = "KasperError"; + this.line = line; + this.col = col; + this.tagName = tag; } public withTag(tagName: string): this {