/* THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getOwnPropSymbols = Object.getOwnPropertySymbols; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]); if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) { if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]); } return a; }; var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[Object.keys(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __export = (target, all) => { __markAsModule(target); for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __reExport = (target, module2, desc) => { if (module2 && typeof module2 === "object" || typeof module2 === "function") { for (let key of __getOwnPropNames(module2)) if (!__hasOwnProp.call(target, key) && key !== "default") __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable }); } return target; }; var __toModule = (module2) => { return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2); }; var __async = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { step(generator.next(value)); } catch (e) { reject(e); } }; var rejected = (value) => { try { step(generator.throw(value)); } catch (e) { reject(e); } }; var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); step((generator = generator.apply(__this, __arguments)).next()); }); }; // node_modules/bail/index.js var require_bail = __commonJS({ "node_modules/bail/index.js"(exports, module2) { "use strict"; module2.exports = bail; function bail(err) { if (err) { throw err; } } } }); // node_modules/is-buffer/index.js var require_is_buffer = __commonJS({ "node_modules/is-buffer/index.js"(exports, module2) { module2.exports = function isBuffer(obj) { return obj != null && obj.constructor != null && typeof obj.constructor.isBuffer === "function" && obj.constructor.isBuffer(obj); }; } }); // node_modules/extend/index.js var require_extend = __commonJS({ "node_modules/extend/index.js"(exports, module2) { "use strict"; var hasOwn = Object.prototype.hasOwnProperty; var toStr = Object.prototype.toString; var defineProperty = Object.defineProperty; var gOPD = Object.getOwnPropertyDescriptor; var isArray = function isArray2(arr) { if (typeof Array.isArray === "function") { return Array.isArray(arr); } return toStr.call(arr) === "[object Array]"; }; var isPlainObject = function isPlainObject2(obj) { if (!obj || toStr.call(obj) !== "[object Object]") { return false; } var hasOwnConstructor = hasOwn.call(obj, "constructor"); var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, "isPrototypeOf"); if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) { return false; } var key; for (key in obj) { } return typeof key === "undefined" || hasOwn.call(obj, key); }; var setProperty = function setProperty2(target, options) { if (defineProperty && options.name === "__proto__") { defineProperty(target, options.name, { enumerable: true, configurable: true, value: options.newValue, writable: true }); } else { target[options.name] = options.newValue; } }; var getProperty = function getProperty2(obj, name) { if (name === "__proto__") { if (!hasOwn.call(obj, name)) { return void 0; } else if (gOPD) { return gOPD(obj, name).value; } } return obj[name]; }; module2.exports = function extend() { var options, name, src, copy, copyIsArray, clone; var target = arguments[0]; var i = 1; var length = arguments.length; var deep = false; if (typeof target === "boolean") { deep = target; target = arguments[1] || {}; i = 2; } if (target == null || typeof target !== "object" && typeof target !== "function") { target = {}; } for (; i < length; ++i) { options = arguments[i]; if (options != null) { for (name in options) { src = getProperty(target, name); copy = getProperty(options, name); if (target !== copy) { if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) { if (copyIsArray) { copyIsArray = false; clone = src && isArray(src) ? src : []; } else { clone = src && isPlainObject(src) ? src : {}; } setProperty(target, { name, newValue: extend(deep, clone, copy) }); } else if (typeof copy !== "undefined") { setProperty(target, { name, newValue: copy }); } } } } } return target; }; } }); // node_modules/is-plain-obj/index.js var require_is_plain_obj = __commonJS({ "node_modules/is-plain-obj/index.js"(exports, module2) { "use strict"; module2.exports = (value) => { if (Object.prototype.toString.call(value) !== "[object Object]") { return false; } const prototype = Object.getPrototypeOf(value); return prototype === null || prototype === Object.prototype; }; } }); // node_modules/trough/wrap.js var require_wrap = __commonJS({ "node_modules/trough/wrap.js"(exports, module2) { "use strict"; var slice = [].slice; module2.exports = wrap; function wrap(fn, callback) { var invoked; return wrapped; function wrapped() { var params = slice.call(arguments, 0); var callback2 = fn.length > params.length; var result; if (callback2) { params.push(done); } try { result = fn.apply(null, params); } catch (error) { if (callback2 && invoked) { throw error; } return done(error); } if (!callback2) { if (result && typeof result.then === "function") { result.then(then, done); } else if (result instanceof Error) { done(result); } else { then(result); } } } function done() { if (!invoked) { invoked = true; callback.apply(null, arguments); } } function then(value) { done(null, value); } } } }); // node_modules/trough/index.js var require_trough = __commonJS({ "node_modules/trough/index.js"(exports, module2) { "use strict"; var wrap = require_wrap(); module2.exports = trough; trough.wrap = wrap; var slice = [].slice; function trough() { var fns = []; var middleware = {}; middleware.run = run; middleware.use = use; return middleware; function run() { var index = -1; var input = slice.call(arguments, 0, -1); var done = arguments[arguments.length - 1]; if (typeof done !== "function") { throw new Error("Expected function as last argument, not " + done); } next.apply(null, [null].concat(input)); function next(err) { var fn = fns[++index]; var params = slice.call(arguments, 0); var values = params.slice(1); var length = input.length; var pos = -1; if (err) { done(err); return; } while (++pos < length) { if (values[pos] === null || values[pos] === void 0) { values[pos] = input[pos]; } } input = values; if (fn) { wrap(fn, next).apply(null, input); } else { done.apply(null, [null].concat(input)); } } } function use(fn) { if (typeof fn !== "function") { throw new Error("Expected `fn` to be a function, not " + fn); } fns.push(fn); return middleware; } } } }); // node_modules/unist-util-stringify-position/index.js var require_unist_util_stringify_position = __commonJS({ "node_modules/unist-util-stringify-position/index.js"(exports, module2) { "use strict"; var own = {}.hasOwnProperty; module2.exports = stringify4; function stringify4(value) { if (!value || typeof value !== "object") { return ""; } if (own.call(value, "position") || own.call(value, "type")) { return position(value.position); } if (own.call(value, "start") || own.call(value, "end")) { return position(value); } if (own.call(value, "line") || own.call(value, "column")) { return point(value); } return ""; } function point(point2) { if (!point2 || typeof point2 !== "object") { point2 = {}; } return index(point2.line) + ":" + index(point2.column); } function position(pos) { if (!pos || typeof pos !== "object") { pos = {}; } return point(pos.start) + "-" + point(pos.end); } function index(value) { return value && typeof value === "number" ? value : 1; } } }); // node_modules/vfile-message/index.js var require_vfile_message = __commonJS({ "node_modules/vfile-message/index.js"(exports, module2) { "use strict"; var stringify4 = require_unist_util_stringify_position(); module2.exports = VMessage; function VMessagePrototype() { } VMessagePrototype.prototype = Error.prototype; VMessage.prototype = new VMessagePrototype(); var proto = VMessage.prototype; proto.file = ""; proto.name = ""; proto.reason = ""; proto.message = ""; proto.stack = ""; proto.fatal = null; proto.column = null; proto.line = null; function VMessage(reason, position, origin) { var parts; var range; var location; if (typeof position === "string") { origin = position; position = null; } parts = parseOrigin(origin); range = stringify4(position) || "1:1"; location = { start: { line: null, column: null }, end: { line: null, column: null } }; if (position && position.position) { position = position.position; } if (position) { if (position.start) { location = position; position = position.start; } else { location.start = position; } } if (reason.stack) { this.stack = reason.stack; reason = reason.message; } this.message = reason; this.name = range; this.reason = reason; this.line = position ? position.line : null; this.column = position ? position.column : null; this.location = location; this.source = parts[0]; this.ruleId = parts[1]; } function parseOrigin(origin) { var result = [null, null]; var index; if (typeof origin === "string") { index = origin.indexOf(":"); if (index === -1) { result[1] = origin; } else { result[0] = origin.slice(0, index); result[1] = origin.slice(index + 1); } } return result; } } }); // node_modules/vfile/lib/minpath.browser.js var require_minpath_browser = __commonJS({ "node_modules/vfile/lib/minpath.browser.js"(exports) { "use strict"; exports.basename = basename; exports.dirname = dirname; exports.extname = extname; exports.join = join2; exports.sep = "/"; function basename(path, ext) { var start = 0; var end = -1; var index; var firstNonSlashEnd; var seenNonSlash; var extIndex; if (ext !== void 0 && typeof ext !== "string") { throw new TypeError('"ext" argument must be a string'); } assertPath(path); index = path.length; if (ext === void 0 || !ext.length || ext.length > path.length) { while (index--) { if (path.charCodeAt(index) === 47) { if (seenNonSlash) { start = index + 1; break; } } else if (end < 0) { seenNonSlash = true; end = index + 1; } } return end < 0 ? "" : path.slice(start, end); } if (ext === path) { return ""; } firstNonSlashEnd = -1; extIndex = ext.length - 1; while (index--) { if (path.charCodeAt(index) === 47) { if (seenNonSlash) { start = index + 1; break; } } else { if (firstNonSlashEnd < 0) { seenNonSlash = true; firstNonSlashEnd = index + 1; } if (extIndex > -1) { if (path.charCodeAt(index) === ext.charCodeAt(extIndex--)) { if (extIndex < 0) { end = index; } } else { extIndex = -1; end = firstNonSlashEnd; } } } } if (start === end) { end = firstNonSlashEnd; } else if (end < 0) { end = path.length; } return path.slice(start, end); } function dirname(path) { var end; var unmatchedSlash; var index; assertPath(path); if (!path.length) { return "."; } end = -1; index = path.length; while (--index) { if (path.charCodeAt(index) === 47) { if (unmatchedSlash) { end = index; break; } } else if (!unmatchedSlash) { unmatchedSlash = true; } } return end < 0 ? path.charCodeAt(0) === 47 ? "/" : "." : end === 1 && path.charCodeAt(0) === 47 ? "//" : path.slice(0, end); } function extname(path) { var startDot = -1; var startPart = 0; var end = -1; var preDotState = 0; var unmatchedSlash; var code; var index; assertPath(path); index = path.length; while (index--) { code = path.charCodeAt(index); if (code === 47) { if (unmatchedSlash) { startPart = index + 1; break; } continue; } if (end < 0) { unmatchedSlash = true; end = index + 1; } if (code === 46) { if (startDot < 0) { startDot = index; } else if (preDotState !== 1) { preDotState = 1; } } else if (startDot > -1) { preDotState = -1; } } if (startDot < 0 || end < 0 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) { return ""; } return path.slice(startDot, end); } function join2() { var index = -1; var joined; while (++index < arguments.length) { assertPath(arguments[index]); if (arguments[index]) { joined = joined === void 0 ? arguments[index] : joined + "/" + arguments[index]; } } return joined === void 0 ? "." : normalize(joined); } function normalize(path) { var absolute; var value; assertPath(path); absolute = path.charCodeAt(0) === 47; value = normalizeString(path, !absolute); if (!value.length && !absolute) { value = "."; } if (value.length && path.charCodeAt(path.length - 1) === 47) { value += "/"; } return absolute ? "/" + value : value; } function normalizeString(path, allowAboveRoot) { var result = ""; var lastSegmentLength = 0; var lastSlash = -1; var dots = 0; var index = -1; var code; var lastSlashIndex; while (++index <= path.length) { if (index < path.length) { code = path.charCodeAt(index); } else if (code === 47) { break; } else { code = 47; } if (code === 47) { if (lastSlash === index - 1 || dots === 1) { } else if (lastSlash !== index - 1 && dots === 2) { if (result.length < 2 || lastSegmentLength !== 2 || result.charCodeAt(result.length - 1) !== 46 || result.charCodeAt(result.length - 2) !== 46) { if (result.length > 2) { lastSlashIndex = result.lastIndexOf("/"); if (lastSlashIndex !== result.length - 1) { if (lastSlashIndex < 0) { result = ""; lastSegmentLength = 0; } else { result = result.slice(0, lastSlashIndex); lastSegmentLength = result.length - 1 - result.lastIndexOf("/"); } lastSlash = index; dots = 0; continue; } } else if (result.length) { result = ""; lastSegmentLength = 0; lastSlash = index; dots = 0; continue; } } if (allowAboveRoot) { result = result.length ? result + "/.." : ".."; lastSegmentLength = 2; } } else { if (result.length) { result += "/" + path.slice(lastSlash + 1, index); } else { result = path.slice(lastSlash + 1, index); } lastSegmentLength = index - lastSlash - 1; } lastSlash = index; dots = 0; } else if (code === 46 && dots > -1) { dots++; } else { dots = -1; } } return result; } function assertPath(path) { if (typeof path !== "string") { throw new TypeError("Path must be a string. Received " + JSON.stringify(path)); } } } }); // node_modules/vfile/lib/minproc.browser.js var require_minproc_browser = __commonJS({ "node_modules/vfile/lib/minproc.browser.js"(exports) { "use strict"; exports.cwd = cwd; function cwd() { return "/"; } } }); // node_modules/vfile/lib/core.js var require_core = __commonJS({ "node_modules/vfile/lib/core.js"(exports, module2) { "use strict"; var p = require_minpath_browser(); var proc = require_minproc_browser(); var buffer = require_is_buffer(); module2.exports = VFile; var own = {}.hasOwnProperty; var order = ["history", "path", "basename", "stem", "extname", "dirname"]; VFile.prototype.toString = toString; Object.defineProperty(VFile.prototype, "path", { get: getPath, set: setPath }); Object.defineProperty(VFile.prototype, "dirname", { get: getDirname, set: setDirname }); Object.defineProperty(VFile.prototype, "basename", { get: getBasename, set: setBasename }); Object.defineProperty(VFile.prototype, "extname", { get: getExtname, set: setExtname }); Object.defineProperty(VFile.prototype, "stem", { get: getStem, set: setStem }); function VFile(options) { var prop; var index; if (!options) { options = {}; } else if (typeof options === "string" || buffer(options)) { options = { contents: options }; } else if ("message" in options && "messages" in options) { return options; } if (!(this instanceof VFile)) { return new VFile(options); } this.data = {}; this.messages = []; this.history = []; this.cwd = proc.cwd(); index = -1; while (++index < order.length) { prop = order[index]; if (own.call(options, prop)) { this[prop] = options[prop]; } } for (prop in options) { if (order.indexOf(prop) < 0) { this[prop] = options[prop]; } } } function getPath() { return this.history[this.history.length - 1]; } function setPath(path) { assertNonEmpty(path, "path"); if (this.path !== path) { this.history.push(path); } } function getDirname() { return typeof this.path === "string" ? p.dirname(this.path) : void 0; } function setDirname(dirname) { assertPath(this.path, "dirname"); this.path = p.join(dirname || "", this.basename); } function getBasename() { return typeof this.path === "string" ? p.basename(this.path) : void 0; } function setBasename(basename) { assertNonEmpty(basename, "basename"); assertPart(basename, "basename"); this.path = p.join(this.dirname || "", basename); } function getExtname() { return typeof this.path === "string" ? p.extname(this.path) : void 0; } function setExtname(extname) { assertPart(extname, "extname"); assertPath(this.path, "extname"); if (extname) { if (extname.charCodeAt(0) !== 46) { throw new Error("`extname` must start with `.`"); } if (extname.indexOf(".", 1) > -1) { throw new Error("`extname` cannot contain multiple dots"); } } this.path = p.join(this.dirname, this.stem + (extname || "")); } function getStem() { return typeof this.path === "string" ? p.basename(this.path, this.extname) : void 0; } function setStem(stem) { assertNonEmpty(stem, "stem"); assertPart(stem, "stem"); this.path = p.join(this.dirname || "", stem + (this.extname || "")); } function toString(encoding) { return (this.contents || "").toString(encoding); } function assertPart(part, name) { if (part && part.indexOf(p.sep) > -1) { throw new Error("`" + name + "` cannot be a path: did not expect `" + p.sep + "`"); } } function assertNonEmpty(part, name) { if (!part) { throw new Error("`" + name + "` cannot be empty"); } } function assertPath(path, name) { if (!path) { throw new Error("Setting `" + name + "` requires `path` to be set too"); } } } }); // node_modules/vfile/lib/index.js var require_lib = __commonJS({ "node_modules/vfile/lib/index.js"(exports, module2) { "use strict"; var VMessage = require_vfile_message(); var VFile = require_core(); module2.exports = VFile; VFile.prototype.message = message; VFile.prototype.info = info; VFile.prototype.fail = fail; function message(reason, position, origin) { var message2 = new VMessage(reason, position, origin); if (this.path) { message2.name = this.path + ":" + message2.name; message2.file = this.path; } message2.fatal = false; this.messages.push(message2); return message2; } function fail() { var message2 = this.message.apply(this, arguments); message2.fatal = true; throw message2; } function info() { var message2 = this.message.apply(this, arguments); message2.fatal = null; return message2; } } }); // node_modules/vfile/index.js var require_vfile = __commonJS({ "node_modules/vfile/index.js"(exports, module2) { "use strict"; module2.exports = require_lib(); } }); // node_modules/unified/index.js var require_unified = __commonJS({ "node_modules/unified/index.js"(exports, module2) { "use strict"; var bail = require_bail(); var buffer = require_is_buffer(); var extend = require_extend(); var plain = require_is_plain_obj(); var trough = require_trough(); var vfile = require_vfile(); module2.exports = unified().freeze(); var slice = [].slice; var own = {}.hasOwnProperty; var pipeline = trough().use(pipelineParse).use(pipelineRun).use(pipelineStringify); function pipelineParse(p, ctx) { ctx.tree = p.parse(ctx.file); } function pipelineRun(p, ctx, next) { p.run(ctx.tree, ctx.file, done); function done(error, tree, file) { if (error) { next(error); } else { ctx.tree = tree; ctx.file = file; next(); } } } function pipelineStringify(p, ctx) { var result = p.stringify(ctx.tree, ctx.file); if (result === void 0 || result === null) { } else if (typeof result === "string" || buffer(result)) { if ("value" in ctx.file) { ctx.file.value = result; } ctx.file.contents = result; } else { ctx.file.result = result; } } function unified() { var attachers = []; var transformers = trough(); var namespace = {}; var freezeIndex = -1; var frozen; processor.data = data; processor.freeze = freeze; processor.attachers = attachers; processor.use = use; processor.parse = parse3; processor.stringify = stringify4; processor.run = run; processor.runSync = runSync; processor.process = process2; processor.processSync = processSync; return processor; function processor() { var destination = unified(); var index = -1; while (++index < attachers.length) { destination.use.apply(null, attachers[index]); } destination.data(extend(true, {}, namespace)); return destination; } function freeze() { var values; var transformer; if (frozen) { return processor; } while (++freezeIndex < attachers.length) { values = attachers[freezeIndex]; if (values[1] === false) { continue; } if (values[1] === true) { values[1] = void 0; } transformer = values[0].apply(processor, values.slice(1)); if (typeof transformer === "function") { transformers.use(transformer); } } frozen = true; freezeIndex = Infinity; return processor; } function data(key, value) { if (typeof key === "string") { if (arguments.length === 2) { assertUnfrozen("data", frozen); namespace[key] = value; return processor; } return own.call(namespace, key) && namespace[key] || null; } if (key) { assertUnfrozen("data", frozen); namespace = key; return processor; } return namespace; } function use(value) { var settings; assertUnfrozen("use", frozen); if (value === null || value === void 0) { } else if (typeof value === "function") { addPlugin.apply(null, arguments); } else if (typeof value === "object") { if ("length" in value) { addList(value); } else { addPreset(value); } } else { throw new Error("Expected usable value, not `" + value + "`"); } if (settings) { namespace.settings = extend(namespace.settings || {}, settings); } return processor; function addPreset(result) { addList(result.plugins); if (result.settings) { settings = extend(settings || {}, result.settings); } } function add(value2) { if (typeof value2 === "function") { addPlugin(value2); } else if (typeof value2 === "object") { if ("length" in value2) { addPlugin.apply(null, value2); } else { addPreset(value2); } } else { throw new Error("Expected usable value, not `" + value2 + "`"); } } function addList(plugins) { var index = -1; if (plugins === null || plugins === void 0) { } else if (typeof plugins === "object" && "length" in plugins) { while (++index < plugins.length) { add(plugins[index]); } } else { throw new Error("Expected a list of plugins, not `" + plugins + "`"); } } function addPlugin(plugin, value2) { var entry = find(plugin); if (entry) { if (plain(entry[1]) && plain(value2)) { value2 = extend(true, entry[1], value2); } entry[1] = value2; } else { attachers.push(slice.call(arguments)); } } } function find(plugin) { var index = -1; while (++index < attachers.length) { if (attachers[index][0] === plugin) { return attachers[index]; } } } function parse3(doc) { var file = vfile(doc); var Parser2; freeze(); Parser2 = processor.Parser; assertParser("parse", Parser2); if (newable(Parser2, "parse")) { return new Parser2(String(file), file).parse(); } return Parser2(String(file), file); } function run(node, file, cb) { assertNode(node); freeze(); if (!cb && typeof file === "function") { cb = file; file = null; } if (!cb) { return new Promise(executor); } executor(null, cb); function executor(resolve, reject) { transformers.run(node, vfile(file), done); function done(error, tree, file2) { tree = tree || node; if (error) { reject(error); } else if (resolve) { resolve(tree); } else { cb(null, tree, file2); } } } } function runSync(node, file) { var result; var complete; run(node, file, done); assertDone("runSync", "run", complete); return result; function done(error, tree) { complete = true; result = tree; bail(error); } } function stringify4(node, doc) { var file = vfile(doc); var Compiler; freeze(); Compiler = processor.Compiler; assertCompiler("stringify", Compiler); assertNode(node); if (newable(Compiler, "compile")) { return new Compiler(node, file).compile(); } return Compiler(node, file); } function process2(doc, cb) { freeze(); assertParser("process", processor.Parser); assertCompiler("process", processor.Compiler); if (!cb) { return new Promise(executor); } executor(null, cb); function executor(resolve, reject) { var file = vfile(doc); pipeline.run(processor, { file }, done); function done(error) { if (error) { reject(error); } else if (resolve) { resolve(file); } else { cb(null, file); } } } } function processSync(doc) { var file; var complete; freeze(); assertParser("processSync", processor.Parser); assertCompiler("processSync", processor.Compiler); file = vfile(doc); process2(file, done); assertDone("processSync", "process", complete); return file; function done(error) { complete = true; bail(error); } } } function newable(value, name) { return typeof value === "function" && value.prototype && (keys(value.prototype) || name in value.prototype); } function keys(value) { var key; for (key in value) { return true; } return false; } function assertParser(name, Parser2) { if (typeof Parser2 !== "function") { throw new Error("Cannot `" + name + "` without `Parser`"); } } function assertCompiler(name, Compiler) { if (typeof Compiler !== "function") { throw new Error("Cannot `" + name + "` without `Compiler`"); } } function assertUnfrozen(name, frozen) { if (frozen) { throw new Error("Cannot invoke `" + name + "` on a frozen processor.\nCreate a new processor first, by invoking it: use `processor()` instead of `processor`."); } } function assertNode(node) { if (!node || typeof node.type !== "string") { throw new Error("Expected node, got `" + node + "`"); } } function assertDone(name, asyncName, complete) { if (!complete) { throw new Error("`" + name + "` finished async. Use `" + asyncName + "` instead"); } } } }); // node_modules/mdast-util-to-string/index.js var require_mdast_util_to_string = __commonJS({ "node_modules/mdast-util-to-string/index.js"(exports, module2) { "use strict"; module2.exports = toString; function toString(node) { return node && (node.value || node.alt || node.title || "children" in node && all(node.children) || "length" in node && all(node)) || ""; } function all(values) { var result = []; var index = -1; while (++index < values.length) { result[index] = toString(values[index]); } return result.join(""); } } }); // node_modules/micromark/dist/constant/assign.js var require_assign = __commonJS({ "node_modules/micromark/dist/constant/assign.js"(exports, module2) { "use strict"; var assign = Object.assign; module2.exports = assign; } }); // node_modules/micromark/dist/constant/has-own-property.js var require_has_own_property = __commonJS({ "node_modules/micromark/dist/constant/has-own-property.js"(exports, module2) { "use strict"; var own = {}.hasOwnProperty; module2.exports = own; } }); // node_modules/micromark/dist/util/normalize-identifier.js var require_normalize_identifier = __commonJS({ "node_modules/micromark/dist/util/normalize-identifier.js"(exports, module2) { "use strict"; function normalizeIdentifier(value) { return value.replace(/[\t\n\r ]+/g, " ").replace(/^ | $/g, "").toLowerCase().toUpperCase(); } module2.exports = normalizeIdentifier; } }); // node_modules/micromark/dist/constant/from-char-code.js var require_from_char_code = __commonJS({ "node_modules/micromark/dist/constant/from-char-code.js"(exports, module2) { "use strict"; var fromCharCode = String.fromCharCode; module2.exports = fromCharCode; } }); // node_modules/micromark/dist/util/safe-from-int.js var require_safe_from_int = __commonJS({ "node_modules/micromark/dist/util/safe-from-int.js"(exports, module2) { "use strict"; var fromCharCode = require_from_char_code(); function safeFromInt(value, base) { var code = parseInt(value, base); if (code < 9 || code === 11 || code > 13 && code < 32 || code > 126 && code < 160 || code > 55295 && code < 57344 || code > 64975 && code < 65008 || (code & 65535) === 65535 || (code & 65535) === 65534 || code > 1114111) { return "\uFFFD"; } return fromCharCode(code); } module2.exports = safeFromInt; } }); // node_modules/micromark/dist/character/markdown-line-ending.js var require_markdown_line_ending = __commonJS({ "node_modules/micromark/dist/character/markdown-line-ending.js"(exports, module2) { "use strict"; function markdownLineEnding(code) { return code < -2; } module2.exports = markdownLineEnding; } }); // node_modules/micromark/dist/character/markdown-space.js var require_markdown_space = __commonJS({ "node_modules/micromark/dist/character/markdown-space.js"(exports, module2) { "use strict"; function markdownSpace(code) { return code === -2 || code === -1 || code === 32; } module2.exports = markdownSpace; } }); // node_modules/micromark/dist/tokenize/factory-space.js var require_factory_space = __commonJS({ "node_modules/micromark/dist/tokenize/factory-space.js"(exports, module2) { "use strict"; var markdownSpace = require_markdown_space(); function spaceFactory(effects, ok, type, max) { var limit = max ? max - 1 : Infinity; var size = 0; return start; function start(code) { if (markdownSpace(code)) { effects.enter(type); return prefix(code); } return ok(code); } function prefix(code) { if (markdownSpace(code) && size++ < limit) { effects.consume(code); return prefix; } effects.exit(type); return ok(code); } } module2.exports = spaceFactory; } }); // node_modules/micromark/dist/initialize/content.js var require_content = __commonJS({ "node_modules/micromark/dist/initialize/content.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var markdownLineEnding = require_markdown_line_ending(); var factorySpace = require_factory_space(); var tokenize = initializeContent; function initializeContent(effects) { var contentStart = effects.attempt(this.parser.constructs.contentInitial, afterContentStartConstruct, paragraphInitial); var previous; return contentStart; function afterContentStartConstruct(code) { if (code === null) { effects.consume(code); return; } effects.enter("lineEnding"); effects.consume(code); effects.exit("lineEnding"); return factorySpace(effects, contentStart, "linePrefix"); } function paragraphInitial(code) { effects.enter("paragraph"); return lineStart(code); } function lineStart(code) { var token = effects.enter("chunkText", { contentType: "text", previous }); if (previous) { previous.next = token; } previous = token; return data(code); } function data(code) { if (code === null) { effects.exit("chunkText"); effects.exit("paragraph"); effects.consume(code); return; } if (markdownLineEnding(code)) { effects.consume(code); effects.exit("chunkText"); return lineStart; } effects.consume(code); return data; } } exports.tokenize = tokenize; } }); // node_modules/micromark/dist/tokenize/partial-blank-line.js var require_partial_blank_line = __commonJS({ "node_modules/micromark/dist/tokenize/partial-blank-line.js"(exports, module2) { "use strict"; var markdownLineEnding = require_markdown_line_ending(); var factorySpace = require_factory_space(); var partialBlankLine = { tokenize: tokenizePartialBlankLine, partial: true }; function tokenizePartialBlankLine(effects, ok, nok) { return factorySpace(effects, afterWhitespace, "linePrefix"); function afterWhitespace(code) { return code === null || markdownLineEnding(code) ? ok(code) : nok(code); } } module2.exports = partialBlankLine; } }); // node_modules/micromark/dist/initialize/document.js var require_document = __commonJS({ "node_modules/micromark/dist/initialize/document.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var markdownLineEnding = require_markdown_line_ending(); var factorySpace = require_factory_space(); var partialBlankLine = require_partial_blank_line(); var tokenize = initializeDocument; var containerConstruct = { tokenize: tokenizeContainer }; var lazyFlowConstruct = { tokenize: tokenizeLazyFlow }; function initializeDocument(effects) { var self = this; var stack = []; var continued = 0; var inspectConstruct = { tokenize: tokenizeInspect, partial: true }; var inspectResult; var childFlow; var childToken; return start; function start(code) { if (continued < stack.length) { self.containerState = stack[continued][1]; return effects.attempt(stack[continued][0].continuation, documentContinue, documentContinued)(code); } return documentContinued(code); } function documentContinue(code) { continued++; return start(code); } function documentContinued(code) { if (inspectResult && inspectResult.flowContinue) { return flowStart(code); } self.interrupt = childFlow && childFlow.currentConstruct && childFlow.currentConstruct.interruptible; self.containerState = {}; return effects.attempt(containerConstruct, containerContinue, flowStart)(code); } function containerContinue(code) { stack.push([self.currentConstruct, self.containerState]); self.containerState = void 0; return documentContinued(code); } function flowStart(code) { if (code === null) { exitContainers(0, true); effects.consume(code); return; } childFlow = childFlow || self.parser.flow(self.now()); effects.enter("chunkFlow", { contentType: "flow", previous: childToken, _tokenizer: childFlow }); return flowContinue(code); } function flowContinue(code) { if (code === null) { continueFlow(effects.exit("chunkFlow")); return flowStart(code); } if (markdownLineEnding(code)) { effects.consume(code); continueFlow(effects.exit("chunkFlow")); return effects.check(inspectConstruct, documentAfterPeek); } effects.consume(code); return flowContinue; } function documentAfterPeek(code) { exitContainers(inspectResult.continued, inspectResult && inspectResult.flowEnd); continued = 0; return start(code); } function continueFlow(token) { if (childToken) childToken.next = token; childToken = token; childFlow.lazy = inspectResult && inspectResult.lazy; childFlow.defineSkip(token.start); childFlow.write(self.sliceStream(token)); } function exitContainers(size, end) { var index = stack.length; if (childFlow && end) { childFlow.write([null]); childToken = childFlow = void 0; } while (index-- > size) { self.containerState = stack[index][1]; stack[index][0].exit.call(self, effects); } stack.length = size; } function tokenizeInspect(effects2, ok) { var subcontinued = 0; inspectResult = {}; return inspectStart; function inspectStart(code) { if (subcontinued < stack.length) { self.containerState = stack[subcontinued][1]; return effects2.attempt(stack[subcontinued][0].continuation, inspectContinue, inspectLess)(code); } if (childFlow.currentConstruct && childFlow.currentConstruct.concrete) { inspectResult.flowContinue = true; return inspectDone(code); } self.interrupt = childFlow.currentConstruct && childFlow.currentConstruct.interruptible; self.containerState = {}; return effects2.attempt(containerConstruct, inspectFlowEnd, inspectDone)(code); } function inspectContinue(code) { subcontinued++; return self.containerState._closeFlow ? inspectFlowEnd(code) : inspectStart(code); } function inspectLess(code) { if (childFlow.currentConstruct && childFlow.currentConstruct.lazy) { self.containerState = {}; return effects2.attempt(containerConstruct, inspectFlowEnd, effects2.attempt(lazyFlowConstruct, inspectFlowEnd, effects2.check(partialBlankLine, inspectFlowEnd, inspectLazy)))(code); } return inspectFlowEnd(code); } function inspectLazy(code) { subcontinued = stack.length; inspectResult.lazy = true; inspectResult.flowContinue = true; return inspectDone(code); } function inspectFlowEnd(code) { inspectResult.flowEnd = true; return inspectDone(code); } function inspectDone(code) { inspectResult.continued = subcontinued; self.interrupt = self.containerState = void 0; return ok(code); } } } function tokenizeContainer(effects, ok, nok) { return factorySpace(effects, effects.attempt(this.parser.constructs.document, ok, nok), "linePrefix", this.parser.constructs.disable.null.indexOf("codeIndented") > -1 ? void 0 : 4); } function tokenizeLazyFlow(effects, ok, nok) { return factorySpace(effects, effects.lazy(this.parser.constructs.flow, ok, nok), "linePrefix", this.parser.constructs.disable.null.indexOf("codeIndented") > -1 ? void 0 : 4); } exports.tokenize = tokenize; } }); // node_modules/micromark/dist/util/size-chunks.js var require_size_chunks = __commonJS({ "node_modules/micromark/dist/util/size-chunks.js"(exports, module2) { "use strict"; function sizeChunks(chunks) { var index = -1; var size = 0; while (++index < chunks.length) { size += typeof chunks[index] === "string" ? chunks[index].length : 1; } return size; } module2.exports = sizeChunks; } }); // node_modules/micromark/dist/util/prefix-size.js var require_prefix_size = __commonJS({ "node_modules/micromark/dist/util/prefix-size.js"(exports, module2) { "use strict"; var sizeChunks = require_size_chunks(); function prefixSize(events, type) { var tail = events[events.length - 1]; if (!tail || tail[1].type !== type) return 0; return sizeChunks(tail[2].sliceStream(tail[1])); } module2.exports = prefixSize; } }); // node_modules/micromark/dist/constant/splice.js var require_splice = __commonJS({ "node_modules/micromark/dist/constant/splice.js"(exports, module2) { "use strict"; var splice = [].splice; module2.exports = splice; } }); // node_modules/micromark/dist/util/chunked-splice.js var require_chunked_splice = __commonJS({ "node_modules/micromark/dist/util/chunked-splice.js"(exports, module2) { "use strict"; var splice = require_splice(); function chunkedSplice(list, start, remove, items) { var end = list.length; var chunkStart = 0; var parameters; if (start < 0) { start = -start > end ? 0 : end + start; } else { start = start > end ? end : start; } remove = remove > 0 ? remove : 0; if (items.length < 1e4) { parameters = Array.from(items); parameters.unshift(start, remove); splice.apply(list, parameters); } else { if (remove) splice.apply(list, [start, remove]); while (chunkStart < items.length) { parameters = items.slice(chunkStart, chunkStart + 1e4); parameters.unshift(start, 0); splice.apply(list, parameters); chunkStart += 1e4; start += 1e4; } } } module2.exports = chunkedSplice; } }); // node_modules/micromark/dist/util/shallow.js var require_shallow = __commonJS({ "node_modules/micromark/dist/util/shallow.js"(exports, module2) { "use strict"; var assign = require_assign(); function shallow(object) { return assign({}, object); } module2.exports = shallow; } }); // node_modules/micromark/dist/util/subtokenize.js var require_subtokenize = __commonJS({ "node_modules/micromark/dist/util/subtokenize.js"(exports, module2) { "use strict"; var assign = require_assign(); var chunkedSplice = require_chunked_splice(); var shallow = require_shallow(); function subtokenize(events) { var jumps = {}; var index = -1; var event; var lineIndex; var otherIndex; var otherEvent; var parameters; var subevents; var more; while (++index < events.length) { while (index in jumps) { index = jumps[index]; } event = events[index]; if (index && event[1].type === "chunkFlow" && events[index - 1][1].type === "listItemPrefix") { subevents = event[1]._tokenizer.events; otherIndex = 0; if (otherIndex < subevents.length && subevents[otherIndex][1].type === "lineEndingBlank") { otherIndex += 2; } if (otherIndex < subevents.length && subevents[otherIndex][1].type === "content") { while (++otherIndex < subevents.length) { if (subevents[otherIndex][1].type === "content") { break; } if (subevents[otherIndex][1].type === "chunkText") { subevents[otherIndex][1].isInFirstContentOfListItem = true; otherIndex++; } } } } if (event[0] === "enter") { if (event[1].contentType) { assign(jumps, subcontent(events, index)); index = jumps[index]; more = true; } } else if (event[1]._container || event[1]._movePreviousLineEndings) { otherIndex = index; lineIndex = void 0; while (otherIndex--) { otherEvent = events[otherIndex]; if (otherEvent[1].type === "lineEnding" || otherEvent[1].type === "lineEndingBlank") { if (otherEvent[0] === "enter") { if (lineIndex) { events[lineIndex][1].type = "lineEndingBlank"; } otherEvent[1].type = "lineEnding"; lineIndex = otherIndex; } } else { break; } } if (lineIndex) { event[1].end = shallow(events[lineIndex][1].start); parameters = events.slice(lineIndex, index); parameters.unshift(event); chunkedSplice(events, lineIndex, index - lineIndex + 1, parameters); } } } return !more; } function subcontent(events, eventIndex) { var token = events[eventIndex][1]; var context = events[eventIndex][2]; var startPosition = eventIndex - 1; var startPositions = []; var tokenizer = token._tokenizer || context.parser[token.contentType](token.start); var childEvents = tokenizer.events; var jumps = []; var gaps = {}; var stream; var previous; var index; var entered; var end; var adjust; while (token) { while (events[++startPosition][1] !== token) { } startPositions.push(startPosition); if (!token._tokenizer) { stream = context.sliceStream(token); if (!token.next) { stream.push(null); } if (previous) { tokenizer.defineSkip(token.start); } if (token.isInFirstContentOfListItem) { tokenizer._gfmTasklistFirstContentOfListItem = true; } tokenizer.write(stream); if (token.isInFirstContentOfListItem) { tokenizer._gfmTasklistFirstContentOfListItem = void 0; } } previous = token; token = token.next; } token = previous; index = childEvents.length; while (index--) { if (childEvents[index][0] === "enter") { entered = true; } else if (entered && childEvents[index][1].type === childEvents[index - 1][1].type && childEvents[index][1].start.line !== childEvents[index][1].end.line) { add(childEvents.slice(index + 1, end)); token._tokenizer = token.next = void 0; token = token.previous; end = index + 1; } } tokenizer.events = token._tokenizer = token.next = void 0; add(childEvents.slice(0, end)); index = -1; adjust = 0; while (++index < jumps.length) { gaps[adjust + jumps[index][0]] = adjust + jumps[index][1]; adjust += jumps[index][1] - jumps[index][0] - 1; } return gaps; function add(slice) { var start = startPositions.pop(); jumps.unshift([start, start + slice.length - 1]); chunkedSplice(events, start, 2, slice); } } module2.exports = subtokenize; } }); // node_modules/micromark/dist/tokenize/content.js var require_content2 = __commonJS({ "node_modules/micromark/dist/tokenize/content.js"(exports, module2) { "use strict"; var markdownLineEnding = require_markdown_line_ending(); var prefixSize = require_prefix_size(); var subtokenize = require_subtokenize(); var factorySpace = require_factory_space(); var content = { tokenize: tokenizeContent, resolve: resolveContent, interruptible: true, lazy: true }; var continuationConstruct = { tokenize: tokenizeContinuation, partial: true }; function resolveContent(events) { subtokenize(events); return events; } function tokenizeContent(effects, ok) { var previous; return start; function start(code) { effects.enter("content"); previous = effects.enter("chunkContent", { contentType: "content" }); return data(code); } function data(code) { if (code === null) { return contentEnd(code); } if (markdownLineEnding(code)) { return effects.check(continuationConstruct, contentContinue, contentEnd)(code); } effects.consume(code); return data; } function contentEnd(code) { effects.exit("chunkContent"); effects.exit("content"); return ok(code); } function contentContinue(code) { effects.consume(code); effects.exit("chunkContent"); previous = previous.next = effects.enter("chunkContent", { contentType: "content", previous }); return data; } } function tokenizeContinuation(effects, ok, nok) { var self = this; return startLookahead; function startLookahead(code) { effects.enter("lineEnding"); effects.consume(code); effects.exit("lineEnding"); return factorySpace(effects, prefixed, "linePrefix"); } function prefixed(code) { if (code === null || markdownLineEnding(code)) { return nok(code); } if (self.parser.constructs.disable.null.indexOf("codeIndented") > -1 || prefixSize(self.events, "linePrefix") < 4) { return effects.interrupt(self.parser.constructs.flow, nok, ok)(code); } return ok(code); } } module2.exports = content; } }); // node_modules/micromark/dist/initialize/flow.js var require_flow = __commonJS({ "node_modules/micromark/dist/initialize/flow.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var content = require_content2(); var factorySpace = require_factory_space(); var partialBlankLine = require_partial_blank_line(); var tokenize = initializeFlow; function initializeFlow(effects) { var self = this; var initial = effects.attempt(partialBlankLine, atBlankEnding, effects.attempt(this.parser.constructs.flowInitial, afterConstruct, factorySpace(effects, effects.attempt(this.parser.constructs.flow, afterConstruct, effects.attempt(content, afterConstruct)), "linePrefix"))); return initial; function atBlankEnding(code) { if (code === null) { effects.consume(code); return; } effects.enter("lineEndingBlank"); effects.consume(code); effects.exit("lineEndingBlank"); self.currentConstruct = void 0; return initial; } function afterConstruct(code) { if (code === null) { effects.consume(code); return; } effects.enter("lineEnding"); effects.consume(code); effects.exit("lineEnding"); self.currentConstruct = void 0; return initial; } } exports.tokenize = tokenize; } }); // node_modules/micromark/dist/initialize/text.js var require_text = __commonJS({ "node_modules/micromark/dist/initialize/text.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var assign = require_assign(); var shallow = require_shallow(); var text = initializeFactory("text"); var string2 = initializeFactory("string"); var resolver = { resolveAll: createResolver() }; function initializeFactory(field) { return { tokenize: initializeText, resolveAll: createResolver(field === "text" ? resolveAllLineSuffixes : void 0) }; function initializeText(effects) { var self = this; var constructs = this.parser.constructs[field]; var text2 = effects.attempt(constructs, start, notText); return start; function start(code) { return atBreak(code) ? text2(code) : notText(code); } function notText(code) { if (code === null) { effects.consume(code); return; } effects.enter("data"); effects.consume(code); return data; } function data(code) { if (atBreak(code)) { effects.exit("data"); return text2(code); } effects.consume(code); return data; } function atBreak(code) { var list = constructs[code]; var index = -1; if (code === null) { return true; } if (list) { while (++index < list.length) { if (!list[index].previous || list[index].previous.call(self, self.previous)) { return true; } } } } } } function createResolver(extraResolver) { return resolveAllText; function resolveAllText(events, context) { var index = -1; var enter; while (++index <= events.length) { if (enter === void 0) { if (events[index] && events[index][1].type === "data") { enter = index; index++; } } else if (!events[index] || events[index][1].type !== "data") { if (index !== enter + 2) { events[enter][1].end = events[index - 1][1].end; events.splice(enter + 2, index - enter - 2); index = enter + 2; } enter = void 0; } } return extraResolver ? extraResolver(events, context) : events; } } function resolveAllLineSuffixes(events, context) { var eventIndex = -1; var chunks; var data; var chunk; var index; var bufferIndex; var size; var tabs; var token; while (++eventIndex <= events.length) { if ((eventIndex === events.length || events[eventIndex][1].type === "lineEnding") && events[eventIndex - 1][1].type === "data") { data = events[eventIndex - 1][1]; chunks = context.sliceStream(data); index = chunks.length; bufferIndex = -1; size = 0; tabs = void 0; while (index--) { chunk = chunks[index]; if (typeof chunk === "string") { bufferIndex = chunk.length; while (chunk.charCodeAt(bufferIndex - 1) === 32) { size++; bufferIndex--; } if (bufferIndex) break; bufferIndex = -1; } else if (chunk === -2) { tabs = true; size++; } else if (chunk === -1) ; else { index++; break; } } if (size) { token = { type: eventIndex === events.length || tabs || size < 2 ? "lineSuffix" : "hardBreakTrailing", start: { line: data.end.line, column: data.end.column - size, offset: data.end.offset - size, _index: data.start._index + index, _bufferIndex: index ? bufferIndex : data.start._bufferIndex + bufferIndex }, end: shallow(data.end) }; data.end = shallow(token.start); if (data.start.offset === data.end.offset) { assign(data, token); } else { events.splice(eventIndex, 0, ["enter", token, context], ["exit", token, context]); eventIndex += 2; } } eventIndex++; } } return events; } exports.resolver = resolver; exports.string = string2; exports.text = text; } }); // node_modules/micromark/dist/util/miniflat.js var require_miniflat = __commonJS({ "node_modules/micromark/dist/util/miniflat.js"(exports, module2) { "use strict"; function miniflat(value) { return value === null || value === void 0 ? [] : "length" in value ? value : [value]; } module2.exports = miniflat; } }); // node_modules/micromark/dist/util/combine-extensions.js var require_combine_extensions = __commonJS({ "node_modules/micromark/dist/util/combine-extensions.js"(exports, module2) { "use strict"; var hasOwnProperty = require_has_own_property(); var chunkedSplice = require_chunked_splice(); var miniflat = require_miniflat(); function combineExtensions(extensions) { var all = {}; var index = -1; while (++index < extensions.length) { extension(all, extensions[index]); } return all; } function extension(all, extension2) { var hook; var left; var right; var code; for (hook in extension2) { left = hasOwnProperty.call(all, hook) ? all[hook] : all[hook] = {}; right = extension2[hook]; for (code in right) { left[code] = constructs(miniflat(right[code]), hasOwnProperty.call(left, code) ? left[code] : []); } } } function constructs(list, existing) { var index = -1; var before = []; while (++index < list.length) { ; (list[index].add === "after" ? existing : before).push(list[index]); } chunkedSplice(existing, 0, 0, before); return existing; } module2.exports = combineExtensions; } }); // node_modules/micromark/dist/util/chunked-push.js var require_chunked_push = __commonJS({ "node_modules/micromark/dist/util/chunked-push.js"(exports, module2) { "use strict"; var chunkedSplice = require_chunked_splice(); function chunkedPush(list, items) { if (list.length) { chunkedSplice(list, list.length, 0, items); return list; } return items; } module2.exports = chunkedPush; } }); // node_modules/micromark/dist/util/resolve-all.js var require_resolve_all = __commonJS({ "node_modules/micromark/dist/util/resolve-all.js"(exports, module2) { "use strict"; function resolveAll(constructs, events, context) { var called = []; var index = -1; var resolve; while (++index < constructs.length) { resolve = constructs[index].resolveAll; if (resolve && called.indexOf(resolve) < 0) { events = resolve(events, context); called.push(resolve); } } return events; } module2.exports = resolveAll; } }); // node_modules/micromark/dist/util/serialize-chunks.js var require_serialize_chunks = __commonJS({ "node_modules/micromark/dist/util/serialize-chunks.js"(exports, module2) { "use strict"; var fromCharCode = require_from_char_code(); function serializeChunks(chunks) { var index = -1; var result = []; var chunk; var value; var atTab; while (++index < chunks.length) { chunk = chunks[index]; if (typeof chunk === "string") { value = chunk; } else if (chunk === -5) { value = "\r"; } else if (chunk === -4) { value = "\n"; } else if (chunk === -3) { value = "\r\n"; } else if (chunk === -2) { value = " "; } else if (chunk === -1) { if (atTab) continue; value = " "; } else { value = fromCharCode(chunk); } atTab = chunk === -2; result.push(value); } return result.join(""); } module2.exports = serializeChunks; } }); // node_modules/micromark/dist/util/slice-chunks.js var require_slice_chunks = __commonJS({ "node_modules/micromark/dist/util/slice-chunks.js"(exports, module2) { "use strict"; function sliceChunks(chunks, token) { var startIndex = token.start._index; var startBufferIndex = token.start._bufferIndex; var endIndex = token.end._index; var endBufferIndex = token.end._bufferIndex; var view; if (startIndex === endIndex) { view = [chunks[startIndex].slice(startBufferIndex, endBufferIndex)]; } else { view = chunks.slice(startIndex, endIndex); if (startBufferIndex > -1) { view[0] = view[0].slice(startBufferIndex); } if (endBufferIndex > 0) { view.push(chunks[endIndex].slice(0, endBufferIndex)); } } return view; } module2.exports = sliceChunks; } }); // node_modules/micromark/dist/util/create-tokenizer.js var require_create_tokenizer = __commonJS({ "node_modules/micromark/dist/util/create-tokenizer.js"(exports, module2) { "use strict"; var assign = require_assign(); var markdownLineEnding = require_markdown_line_ending(); var chunkedPush = require_chunked_push(); var chunkedSplice = require_chunked_splice(); var miniflat = require_miniflat(); var resolveAll = require_resolve_all(); var serializeChunks = require_serialize_chunks(); var shallow = require_shallow(); var sliceChunks = require_slice_chunks(); function createTokenizer(parser, initialize, from) { var point = from ? shallow(from) : { line: 1, column: 1, offset: 0 }; var columnStart = {}; var resolveAllConstructs = []; var chunks = []; var stack = []; var effects = { consume, enter, exit, attempt: constructFactory(onsuccessfulconstruct), check: constructFactory(onsuccessfulcheck), interrupt: constructFactory(onsuccessfulcheck, { interrupt: true }), lazy: constructFactory(onsuccessfulcheck, { lazy: true }) }; var context = { previous: null, events: [], parser, sliceStream, sliceSerialize, now, defineSkip: skip, write }; var state = initialize.tokenize.call(context, effects); if (initialize.resolveAll) { resolveAllConstructs.push(initialize); } point._index = 0; point._bufferIndex = -1; return context; function write(slice) { chunks = chunkedPush(chunks, slice); main(); if (chunks[chunks.length - 1] !== null) { return []; } addResult(initialize, 0); context.events = resolveAll(resolveAllConstructs, context.events, context); return context.events; } function sliceSerialize(token) { return serializeChunks(sliceStream(token)); } function sliceStream(token) { return sliceChunks(chunks, token); } function now() { return shallow(point); } function skip(value) { columnStart[value.line] = value.column; accountForPotentialSkip(); } function main() { var chunkIndex; var chunk; while (point._index < chunks.length) { chunk = chunks[point._index]; if (typeof chunk === "string") { chunkIndex = point._index; if (point._bufferIndex < 0) { point._bufferIndex = 0; } while (point._index === chunkIndex && point._bufferIndex < chunk.length) { go(chunk.charCodeAt(point._bufferIndex)); } } else { go(chunk); } } } function go(code) { state = state(code); } function consume(code) { if (markdownLineEnding(code)) { point.line++; point.column = 1; point.offset += code === -3 ? 2 : 1; accountForPotentialSkip(); } else if (code !== -1) { point.column++; point.offset++; } if (point._bufferIndex < 0) { point._index++; } else { point._bufferIndex++; if (point._bufferIndex === chunks[point._index].length) { point._bufferIndex = -1; point._index++; } } context.previous = code; } function enter(type, fields) { var token = fields || {}; token.type = type; token.start = now(); context.events.push(["enter", token, context]); stack.push(token); return token; } function exit(type) { var token = stack.pop(); token.end = now(); context.events.push(["exit", token, context]); return token; } function onsuccessfulconstruct(construct, info) { addResult(construct, info.from); } function onsuccessfulcheck(construct, info) { info.restore(); } function constructFactory(onreturn, fields) { return hook; function hook(constructs, returnState, bogusState) { var listOfConstructs; var constructIndex; var currentConstruct; var info; return constructs.tokenize || "length" in constructs ? handleListOfConstructs(miniflat(constructs)) : handleMapOfConstructs; function handleMapOfConstructs(code) { if (code in constructs || null in constructs) { return handleListOfConstructs(constructs.null ? miniflat(constructs[code]).concat(miniflat(constructs.null)) : constructs[code])(code); } return bogusState(code); } function handleListOfConstructs(list) { listOfConstructs = list; constructIndex = 0; return handleConstruct(list[constructIndex]); } function handleConstruct(construct) { return start; function start(code) { info = store(); currentConstruct = construct; if (!construct.partial) { context.currentConstruct = construct; } if (construct.name && context.parser.constructs.disable.null.indexOf(construct.name) > -1) { return nok(); } return construct.tokenize.call(fields ? assign({}, context, fields) : context, effects, ok, nok)(code); } } function ok(code) { onreturn(currentConstruct, info); return returnState; } function nok(code) { info.restore(); if (++constructIndex < listOfConstructs.length) { return handleConstruct(listOfConstructs[constructIndex]); } return bogusState; } } } function addResult(construct, from2) { if (construct.resolveAll && resolveAllConstructs.indexOf(construct) < 0) { resolveAllConstructs.push(construct); } if (construct.resolve) { chunkedSplice(context.events, from2, context.events.length - from2, construct.resolve(context.events.slice(from2), context)); } if (construct.resolveTo) { context.events = construct.resolveTo(context.events, context); } } function store() { var startPoint = now(); var startPrevious = context.previous; var startCurrentConstruct = context.currentConstruct; var startEventsIndex = context.events.length; var startStack = Array.from(stack); return { restore, from: startEventsIndex }; function restore() { point = startPoint; context.previous = startPrevious; context.currentConstruct = startCurrentConstruct; context.events.length = startEventsIndex; stack = startStack; accountForPotentialSkip(); } } function accountForPotentialSkip() { if (point.line in columnStart && point.column < 2) { point.column = columnStart[point.line]; point.offset += columnStart[point.line] - 1; } } } module2.exports = createTokenizer; } }); // node_modules/micromark/dist/character/markdown-line-ending-or-space.js var require_markdown_line_ending_or_space = __commonJS({ "node_modules/micromark/dist/character/markdown-line-ending-or-space.js"(exports, module2) { "use strict"; function markdownLineEndingOrSpace(code) { return code < 0 || code === 32; } module2.exports = markdownLineEndingOrSpace; } }); // node_modules/micromark/dist/constant/unicode-punctuation-regex.js var require_unicode_punctuation_regex = __commonJS({ "node_modules/micromark/dist/constant/unicode-punctuation-regex.js"(exports, module2) { "use strict"; var unicodePunctuation = /[!-\/:-@\[-`\{-~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u2E52\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]/; module2.exports = unicodePunctuation; } }); // node_modules/micromark/dist/util/regex-check.js var require_regex_check = __commonJS({ "node_modules/micromark/dist/util/regex-check.js"(exports, module2) { "use strict"; var fromCharCode = require_from_char_code(); function regexCheck(regex) { return check; function check(code) { return regex.test(fromCharCode(code)); } } module2.exports = regexCheck; } }); // node_modules/micromark/dist/character/unicode-punctuation.js var require_unicode_punctuation = __commonJS({ "node_modules/micromark/dist/character/unicode-punctuation.js"(exports, module2) { "use strict"; var unicodePunctuationRegex = require_unicode_punctuation_regex(); var regexCheck = require_regex_check(); var unicodePunctuation = regexCheck(unicodePunctuationRegex); module2.exports = unicodePunctuation; } }); // node_modules/micromark/dist/character/unicode-whitespace.js var require_unicode_whitespace = __commonJS({ "node_modules/micromark/dist/character/unicode-whitespace.js"(exports, module2) { "use strict"; var regexCheck = require_regex_check(); var unicodeWhitespace = regexCheck(/\s/); module2.exports = unicodeWhitespace; } }); // node_modules/micromark/dist/util/classify-character.js var require_classify_character = __commonJS({ "node_modules/micromark/dist/util/classify-character.js"(exports, module2) { "use strict"; var markdownLineEndingOrSpace = require_markdown_line_ending_or_space(); var unicodePunctuation = require_unicode_punctuation(); var unicodeWhitespace = require_unicode_whitespace(); function classifyCharacter(code) { if (code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) { return 1; } if (unicodePunctuation(code)) { return 2; } } module2.exports = classifyCharacter; } }); // node_modules/micromark/dist/util/move-point.js var require_move_point = __commonJS({ "node_modules/micromark/dist/util/move-point.js"(exports, module2) { "use strict"; function movePoint(point, offset) { point.column += offset; point.offset += offset; point._bufferIndex += offset; return point; } module2.exports = movePoint; } }); // node_modules/micromark/dist/tokenize/attention.js var require_attention = __commonJS({ "node_modules/micromark/dist/tokenize/attention.js"(exports, module2) { "use strict"; var chunkedPush = require_chunked_push(); var chunkedSplice = require_chunked_splice(); var classifyCharacter = require_classify_character(); var movePoint = require_move_point(); var resolveAll = require_resolve_all(); var shallow = require_shallow(); var attention = { name: "attention", tokenize: tokenizeAttention, resolveAll: resolveAllAttention }; function resolveAllAttention(events, context) { var index = -1; var open; var group; var text; var openingSequence; var closingSequence; var use; var nextEvents; var offset; while (++index < events.length) { if (events[index][0] === "enter" && events[index][1].type === "attentionSequence" && events[index][1]._close) { open = index; while (open--) { if (events[open][0] === "exit" && events[open][1].type === "attentionSequence" && events[open][1]._open && context.sliceSerialize(events[open][1]).charCodeAt(0) === context.sliceSerialize(events[index][1]).charCodeAt(0)) { if ((events[open][1]._close || events[index][1]._open) && (events[index][1].end.offset - events[index][1].start.offset) % 3 && !((events[open][1].end.offset - events[open][1].start.offset + events[index][1].end.offset - events[index][1].start.offset) % 3)) { continue; } use = events[open][1].end.offset - events[open][1].start.offset > 1 && events[index][1].end.offset - events[index][1].start.offset > 1 ? 2 : 1; openingSequence = { type: use > 1 ? "strongSequence" : "emphasisSequence", start: movePoint(shallow(events[open][1].end), -use), end: shallow(events[open][1].end) }; closingSequence = { type: use > 1 ? "strongSequence" : "emphasisSequence", start: shallow(events[index][1].start), end: movePoint(shallow(events[index][1].start), use) }; text = { type: use > 1 ? "strongText" : "emphasisText", start: shallow(events[open][1].end), end: shallow(events[index][1].start) }; group = { type: use > 1 ? "strong" : "emphasis", start: shallow(openingSequence.start), end: shallow(closingSequence.end) }; events[open][1].end = shallow(openingSequence.start); events[index][1].start = shallow(closingSequence.end); nextEvents = []; if (events[open][1].end.offset - events[open][1].start.offset) { nextEvents = chunkedPush(nextEvents, [ ["enter", events[open][1], context], ["exit", events[open][1], context] ]); } nextEvents = chunkedPush(nextEvents, [ ["enter", group, context], ["enter", openingSequence, context], ["exit", openingSequence, context], ["enter", text, context] ]); nextEvents = chunkedPush(nextEvents, resolveAll(context.parser.constructs.insideSpan.null, events.slice(open + 1, index), context)); nextEvents = chunkedPush(nextEvents, [ ["exit", text, context], ["enter", closingSequence, context], ["exit", closingSequence, context], ["exit", group, context] ]); if (events[index][1].end.offset - events[index][1].start.offset) { offset = 2; nextEvents = chunkedPush(nextEvents, [ ["enter", events[index][1], context], ["exit", events[index][1], context] ]); } else { offset = 0; } chunkedSplice(events, open - 1, index - open + 3, nextEvents); index = open + nextEvents.length - offset - 2; break; } } } } index = -1; while (++index < events.length) { if (events[index][1].type === "attentionSequence") { events[index][1].type = "data"; } } return events; } function tokenizeAttention(effects, ok) { var before = classifyCharacter(this.previous); var marker; return start; function start(code) { effects.enter("attentionSequence"); marker = code; return sequence(code); } function sequence(code) { var token; var after; var open; var close; if (code === marker) { effects.consume(code); return sequence; } token = effects.exit("attentionSequence"); after = classifyCharacter(code); open = !after || after === 2 && before; close = !before || before === 2 && after; token._open = marker === 42 ? open : open && (before || !close); token._close = marker === 42 ? close : close && (after || !open); return ok(code); } } module2.exports = attention; } }); // node_modules/micromark/dist/character/ascii-alpha.js var require_ascii_alpha = __commonJS({ "node_modules/micromark/dist/character/ascii-alpha.js"(exports, module2) { "use strict"; var regexCheck = require_regex_check(); var asciiAlpha = regexCheck(/[A-Za-z]/); module2.exports = asciiAlpha; } }); // node_modules/micromark/dist/character/ascii-alphanumeric.js var require_ascii_alphanumeric = __commonJS({ "node_modules/micromark/dist/character/ascii-alphanumeric.js"(exports, module2) { "use strict"; var regexCheck = require_regex_check(); var asciiAlphanumeric = regexCheck(/[\dA-Za-z]/); module2.exports = asciiAlphanumeric; } }); // node_modules/micromark/dist/character/ascii-atext.js var require_ascii_atext = __commonJS({ "node_modules/micromark/dist/character/ascii-atext.js"(exports, module2) { "use strict"; var regexCheck = require_regex_check(); var asciiAtext = regexCheck(/[#-'*+\--9=?A-Z^-~]/); module2.exports = asciiAtext; } }); // node_modules/micromark/dist/character/ascii-control.js var require_ascii_control = __commonJS({ "node_modules/micromark/dist/character/ascii-control.js"(exports, module2) { "use strict"; function asciiControl(code) { return code < 32 || code === 127; } module2.exports = asciiControl; } }); // node_modules/micromark/dist/tokenize/autolink.js var require_autolink = __commonJS({ "node_modules/micromark/dist/tokenize/autolink.js"(exports, module2) { "use strict"; var asciiAlpha = require_ascii_alpha(); var asciiAlphanumeric = require_ascii_alphanumeric(); var asciiAtext = require_ascii_atext(); var asciiControl = require_ascii_control(); var autolink = { name: "autolink", tokenize: tokenizeAutolink }; function tokenizeAutolink(effects, ok, nok) { var size = 1; return start; function start(code) { effects.enter("autolink"); effects.enter("autolinkMarker"); effects.consume(code); effects.exit("autolinkMarker"); effects.enter("autolinkProtocol"); return open; } function open(code) { if (asciiAlpha(code)) { effects.consume(code); return schemeOrEmailAtext; } return asciiAtext(code) ? emailAtext(code) : nok(code); } function schemeOrEmailAtext(code) { return code === 43 || code === 45 || code === 46 || asciiAlphanumeric(code) ? schemeInsideOrEmailAtext(code) : emailAtext(code); } function schemeInsideOrEmailAtext(code) { if (code === 58) { effects.consume(code); return urlInside; } if ((code === 43 || code === 45 || code === 46 || asciiAlphanumeric(code)) && size++ < 32) { effects.consume(code); return schemeInsideOrEmailAtext; } return emailAtext(code); } function urlInside(code) { if (code === 62) { effects.exit("autolinkProtocol"); return end(code); } if (code === 32 || code === 60 || asciiControl(code)) { return nok(code); } effects.consume(code); return urlInside; } function emailAtext(code) { if (code === 64) { effects.consume(code); size = 0; return emailAtSignOrDot; } if (asciiAtext(code)) { effects.consume(code); return emailAtext; } return nok(code); } function emailAtSignOrDot(code) { return asciiAlphanumeric(code) ? emailLabel(code) : nok(code); } function emailLabel(code) { if (code === 46) { effects.consume(code); size = 0; return emailAtSignOrDot; } if (code === 62) { effects.exit("autolinkProtocol").type = "autolinkEmail"; return end(code); } return emailValue(code); } function emailValue(code) { if ((code === 45 || asciiAlphanumeric(code)) && size++ < 63) { effects.consume(code); return code === 45 ? emailValue : emailLabel; } return nok(code); } function end(code) { effects.enter("autolinkMarker"); effects.consume(code); effects.exit("autolinkMarker"); effects.exit("autolink"); return ok; } } module2.exports = autolink; } }); // node_modules/micromark/dist/tokenize/block-quote.js var require_block_quote = __commonJS({ "node_modules/micromark/dist/tokenize/block-quote.js"(exports, module2) { "use strict"; var markdownSpace = require_markdown_space(); var factorySpace = require_factory_space(); var blockQuote = { name: "blockQuote", tokenize: tokenizeBlockQuoteStart, continuation: { tokenize: tokenizeBlockQuoteContinuation }, exit }; function tokenizeBlockQuoteStart(effects, ok, nok) { var self = this; return start; function start(code) { if (code === 62) { if (!self.containerState.open) { effects.enter("blockQuote", { _container: true }); self.containerState.open = true; } effects.enter("blockQuotePrefix"); effects.enter("blockQuoteMarker"); effects.consume(code); effects.exit("blockQuoteMarker"); return after; } return nok(code); } function after(code) { if (markdownSpace(code)) { effects.enter("blockQuotePrefixWhitespace"); effects.consume(code); effects.exit("blockQuotePrefixWhitespace"); effects.exit("blockQuotePrefix"); return ok; } effects.exit("blockQuotePrefix"); return ok(code); } } function tokenizeBlockQuoteContinuation(effects, ok, nok) { return factorySpace(effects, effects.attempt(blockQuote, ok, nok), "linePrefix", this.parser.constructs.disable.null.indexOf("codeIndented") > -1 ? void 0 : 4); } function exit(effects) { effects.exit("blockQuote"); } module2.exports = blockQuote; } }); // node_modules/micromark/dist/character/ascii-punctuation.js var require_ascii_punctuation = __commonJS({ "node_modules/micromark/dist/character/ascii-punctuation.js"(exports, module2) { "use strict"; var regexCheck = require_regex_check(); var asciiPunctuation = regexCheck(/[!-/:-@[-`{-~]/); module2.exports = asciiPunctuation; } }); // node_modules/micromark/dist/tokenize/character-escape.js var require_character_escape = __commonJS({ "node_modules/micromark/dist/tokenize/character-escape.js"(exports, module2) { "use strict"; var asciiPunctuation = require_ascii_punctuation(); var characterEscape = { name: "characterEscape", tokenize: tokenizeCharacterEscape }; function tokenizeCharacterEscape(effects, ok, nok) { return start; function start(code) { effects.enter("characterEscape"); effects.enter("escapeMarker"); effects.consume(code); effects.exit("escapeMarker"); return open; } function open(code) { if (asciiPunctuation(code)) { effects.enter("characterEscapeValue"); effects.consume(code); effects.exit("characterEscapeValue"); effects.exit("characterEscape"); return ok; } return nok(code); } } module2.exports = characterEscape; } }); // node_modules/parse-entities/decode-entity.browser.js var require_decode_entity_browser = __commonJS({ "node_modules/parse-entities/decode-entity.browser.js"(exports, module2) { "use strict"; var el; var semicolon = 59; module2.exports = decodeEntity; function decodeEntity(characters) { var entity = "&" + characters + ";"; var char; el = el || document.createElement("i"); el.innerHTML = entity; char = el.textContent; if (char.charCodeAt(char.length - 1) === semicolon && characters !== "semi") { return false; } return char === entity ? false : char; } } }); // node_modules/micromark/dist/character/ascii-digit.js var require_ascii_digit = __commonJS({ "node_modules/micromark/dist/character/ascii-digit.js"(exports, module2) { "use strict"; var regexCheck = require_regex_check(); var asciiDigit = regexCheck(/\d/); module2.exports = asciiDigit; } }); // node_modules/micromark/dist/character/ascii-hex-digit.js var require_ascii_hex_digit = __commonJS({ "node_modules/micromark/dist/character/ascii-hex-digit.js"(exports, module2) { "use strict"; var regexCheck = require_regex_check(); var asciiHexDigit = regexCheck(/[\dA-Fa-f]/); module2.exports = asciiHexDigit; } }); // node_modules/micromark/dist/tokenize/character-reference.js var require_character_reference = __commonJS({ "node_modules/micromark/dist/tokenize/character-reference.js"(exports, module2) { "use strict"; var decodeEntity = require_decode_entity_browser(); var asciiAlphanumeric = require_ascii_alphanumeric(); var asciiDigit = require_ascii_digit(); var asciiHexDigit = require_ascii_hex_digit(); function _interopDefaultLegacy(e) { return e && typeof e === "object" && "default" in e ? e : { default: e }; } var decodeEntity__default = /* @__PURE__ */ _interopDefaultLegacy(decodeEntity); var characterReference = { name: "characterReference", tokenize: tokenizeCharacterReference }; function tokenizeCharacterReference(effects, ok, nok) { var self = this; var size = 0; var max; var test; return start; function start(code) { effects.enter("characterReference"); effects.enter("characterReferenceMarker"); effects.consume(code); effects.exit("characterReferenceMarker"); return open; } function open(code) { if (code === 35) { effects.enter("characterReferenceMarkerNumeric"); effects.consume(code); effects.exit("characterReferenceMarkerNumeric"); return numeric; } effects.enter("characterReferenceValue"); max = 31; test = asciiAlphanumeric; return value(code); } function numeric(code) { if (code === 88 || code === 120) { effects.enter("characterReferenceMarkerHexadecimal"); effects.consume(code); effects.exit("characterReferenceMarkerHexadecimal"); effects.enter("characterReferenceValue"); max = 6; test = asciiHexDigit; return value; } effects.enter("characterReferenceValue"); max = 7; test = asciiDigit; return value(code); } function value(code) { var token; if (code === 59 && size) { token = effects.exit("characterReferenceValue"); if (test === asciiAlphanumeric && !decodeEntity__default["default"](self.sliceSerialize(token))) { return nok(code); } effects.enter("characterReferenceMarker"); effects.consume(code); effects.exit("characterReferenceMarker"); effects.exit("characterReference"); return ok; } if (test(code) && size++ < max) { effects.consume(code); return value; } return nok(code); } } module2.exports = characterReference; } }); // node_modules/micromark/dist/tokenize/code-fenced.js var require_code_fenced = __commonJS({ "node_modules/micromark/dist/tokenize/code-fenced.js"(exports, module2) { "use strict"; var markdownLineEnding = require_markdown_line_ending(); var markdownLineEndingOrSpace = require_markdown_line_ending_or_space(); var prefixSize = require_prefix_size(); var factorySpace = require_factory_space(); var codeFenced = { name: "codeFenced", tokenize: tokenizeCodeFenced, concrete: true }; function tokenizeCodeFenced(effects, ok, nok) { var self = this; var closingFenceConstruct = { tokenize: tokenizeClosingFence, partial: true }; var initialPrefix = prefixSize(this.events, "linePrefix"); var sizeOpen = 0; var marker; return start; function start(code) { effects.enter("codeFenced"); effects.enter("codeFencedFence"); effects.enter("codeFencedFenceSequence"); marker = code; return sequenceOpen(code); } function sequenceOpen(code) { if (code === marker) { effects.consume(code); sizeOpen++; return sequenceOpen; } effects.exit("codeFencedFenceSequence"); return sizeOpen < 3 ? nok(code) : factorySpace(effects, infoOpen, "whitespace")(code); } function infoOpen(code) { if (code === null || markdownLineEnding(code)) { return openAfter(code); } effects.enter("codeFencedFenceInfo"); effects.enter("chunkString", { contentType: "string" }); return info(code); } function info(code) { if (code === null || markdownLineEndingOrSpace(code)) { effects.exit("chunkString"); effects.exit("codeFencedFenceInfo"); return factorySpace(effects, infoAfter, "whitespace")(code); } if (code === 96 && code === marker) return nok(code); effects.consume(code); return info; } function infoAfter(code) { if (code === null || markdownLineEnding(code)) { return openAfter(code); } effects.enter("codeFencedFenceMeta"); effects.enter("chunkString", { contentType: "string" }); return meta(code); } function meta(code) { if (code === null || markdownLineEnding(code)) { effects.exit("chunkString"); effects.exit("codeFencedFenceMeta"); return openAfter(code); } if (code === 96 && code === marker) return nok(code); effects.consume(code); return meta; } function openAfter(code) { effects.exit("codeFencedFence"); return self.interrupt ? ok(code) : content(code); } function content(code) { if (code === null) { return after(code); } if (markdownLineEnding(code)) { effects.enter("lineEnding"); effects.consume(code); effects.exit("lineEnding"); return effects.attempt(closingFenceConstruct, after, initialPrefix ? factorySpace(effects, content, "linePrefix", initialPrefix + 1) : content); } effects.enter("codeFlowValue"); return contentContinue(code); } function contentContinue(code) { if (code === null || markdownLineEnding(code)) { effects.exit("codeFlowValue"); return content(code); } effects.consume(code); return contentContinue; } function after(code) { effects.exit("codeFenced"); return ok(code); } function tokenizeClosingFence(effects2, ok2, nok2) { var size = 0; return factorySpace(effects2, closingSequenceStart, "linePrefix", this.parser.constructs.disable.null.indexOf("codeIndented") > -1 ? void 0 : 4); function closingSequenceStart(code) { effects2.enter("codeFencedFence"); effects2.enter("codeFencedFenceSequence"); return closingSequence(code); } function closingSequence(code) { if (code === marker) { effects2.consume(code); size++; return closingSequence; } if (size < sizeOpen) return nok2(code); effects2.exit("codeFencedFenceSequence"); return factorySpace(effects2, closingSequenceEnd, "whitespace")(code); } function closingSequenceEnd(code) { if (code === null || markdownLineEnding(code)) { effects2.exit("codeFencedFence"); return ok2(code); } return nok2(code); } } } module2.exports = codeFenced; } }); // node_modules/micromark/dist/tokenize/code-indented.js var require_code_indented = __commonJS({ "node_modules/micromark/dist/tokenize/code-indented.js"(exports, module2) { "use strict"; var markdownLineEnding = require_markdown_line_ending(); var chunkedSplice = require_chunked_splice(); var prefixSize = require_prefix_size(); var factorySpace = require_factory_space(); var codeIndented = { name: "codeIndented", tokenize: tokenizeCodeIndented, resolve: resolveCodeIndented }; var indentedContentConstruct = { tokenize: tokenizeIndentedContent, partial: true }; function resolveCodeIndented(events, context) { var code = { type: "codeIndented", start: events[0][1].start, end: events[events.length - 1][1].end }; chunkedSplice(events, 0, 0, [["enter", code, context]]); chunkedSplice(events, events.length, 0, [["exit", code, context]]); return events; } function tokenizeCodeIndented(effects, ok, nok) { return effects.attempt(indentedContentConstruct, afterPrefix, nok); function afterPrefix(code) { if (code === null) { return ok(code); } if (markdownLineEnding(code)) { return effects.attempt(indentedContentConstruct, afterPrefix, ok)(code); } effects.enter("codeFlowValue"); return content(code); } function content(code) { if (code === null || markdownLineEnding(code)) { effects.exit("codeFlowValue"); return afterPrefix(code); } effects.consume(code); return content; } } function tokenizeIndentedContent(effects, ok, nok) { var self = this; return factorySpace(effects, afterPrefix, "linePrefix", 4 + 1); function afterPrefix(code) { if (markdownLineEnding(code)) { effects.enter("lineEnding"); effects.consume(code); effects.exit("lineEnding"); return factorySpace(effects, afterPrefix, "linePrefix", 4 + 1); } return prefixSize(self.events, "linePrefix") < 4 ? nok(code) : ok(code); } } module2.exports = codeIndented; } }); // node_modules/micromark/dist/tokenize/code-text.js var require_code_text = __commonJS({ "node_modules/micromark/dist/tokenize/code-text.js"(exports, module2) { "use strict"; var markdownLineEnding = require_markdown_line_ending(); var codeText = { name: "codeText", tokenize: tokenizeCodeText, resolve: resolveCodeText, previous }; function resolveCodeText(events) { var tailExitIndex = events.length - 4; var headEnterIndex = 3; var index; var enter; if ((events[headEnterIndex][1].type === "lineEnding" || events[headEnterIndex][1].type === "space") && (events[tailExitIndex][1].type === "lineEnding" || events[tailExitIndex][1].type === "space")) { index = headEnterIndex; while (++index < tailExitIndex) { if (events[index][1].type === "codeTextData") { events[tailExitIndex][1].type = events[headEnterIndex][1].type = "codeTextPadding"; headEnterIndex += 2; tailExitIndex -= 2; break; } } } index = headEnterIndex - 1; tailExitIndex++; while (++index <= tailExitIndex) { if (enter === void 0) { if (index !== tailExitIndex && events[index][1].type !== "lineEnding") { enter = index; } } else if (index === tailExitIndex || events[index][1].type === "lineEnding") { events[enter][1].type = "codeTextData"; if (index !== enter + 2) { events[enter][1].end = events[index - 1][1].end; events.splice(enter + 2, index - enter - 2); tailExitIndex -= index - enter - 2; index = enter + 2; } enter = void 0; } } return events; } function previous(code) { return code !== 96 || this.events[this.events.length - 1][1].type === "characterEscape"; } function tokenizeCodeText(effects, ok, nok) { var sizeOpen = 0; var size; var token; return start; function start(code) { effects.enter("codeText"); effects.enter("codeTextSequence"); return openingSequence(code); } function openingSequence(code) { if (code === 96) { effects.consume(code); sizeOpen++; return openingSequence; } effects.exit("codeTextSequence"); return gap(code); } function gap(code) { if (code === null) { return nok(code); } if (code === 96) { token = effects.enter("codeTextSequence"); size = 0; return closingSequence(code); } if (code === 32) { effects.enter("space"); effects.consume(code); effects.exit("space"); return gap; } if (markdownLineEnding(code)) { effects.enter("lineEnding"); effects.consume(code); effects.exit("lineEnding"); return gap; } effects.enter("codeTextData"); return data(code); } function data(code) { if (code === null || code === 32 || code === 96 || markdownLineEnding(code)) { effects.exit("codeTextData"); return gap(code); } effects.consume(code); return data; } function closingSequence(code) { if (code === 96) { effects.consume(code); size++; return closingSequence; } if (size === sizeOpen) { effects.exit("codeTextSequence"); effects.exit("codeText"); return ok(code); } token.type = "codeTextData"; return data(code); } } module2.exports = codeText; } }); // node_modules/micromark/dist/tokenize/factory-destination.js var require_factory_destination = __commonJS({ "node_modules/micromark/dist/tokenize/factory-destination.js"(exports, module2) { "use strict"; var asciiControl = require_ascii_control(); var markdownLineEndingOrSpace = require_markdown_line_ending_or_space(); var markdownLineEnding = require_markdown_line_ending(); function destinationFactory(effects, ok, nok, type, literalType, literalMarkerType, rawType, stringType, max) { var limit = max || Infinity; var balance = 0; return start; function start(code) { if (code === 60) { effects.enter(type); effects.enter(literalType); effects.enter(literalMarkerType); effects.consume(code); effects.exit(literalMarkerType); return destinationEnclosedBefore; } if (asciiControl(code) || code === 41) { return nok(code); } effects.enter(type); effects.enter(rawType); effects.enter(stringType); effects.enter("chunkString", { contentType: "string" }); return destinationRaw(code); } function destinationEnclosedBefore(code) { if (code === 62) { effects.enter(literalMarkerType); effects.consume(code); effects.exit(literalMarkerType); effects.exit(literalType); effects.exit(type); return ok; } effects.enter(stringType); effects.enter("chunkString", { contentType: "string" }); return destinationEnclosed(code); } function destinationEnclosed(code) { if (code === 62) { effects.exit("chunkString"); effects.exit(stringType); return destinationEnclosedBefore(code); } if (code === null || code === 60 || markdownLineEnding(code)) { return nok(code); } effects.consume(code); return code === 92 ? destinationEnclosedEscape : destinationEnclosed; } function destinationEnclosedEscape(code) { if (code === 60 || code === 62 || code === 92) { effects.consume(code); return destinationEnclosed; } return destinationEnclosed(code); } function destinationRaw(code) { if (code === 40) { if (++balance > limit) return nok(code); effects.consume(code); return destinationRaw; } if (code === 41) { if (!balance--) { effects.exit("chunkString"); effects.exit(stringType); effects.exit(rawType); effects.exit(type); return ok(code); } effects.consume(code); return destinationRaw; } if (code === null || markdownLineEndingOrSpace(code)) { if (balance) return nok(code); effects.exit("chunkString"); effects.exit(stringType); effects.exit(rawType); effects.exit(type); return ok(code); } if (asciiControl(code)) return nok(code); effects.consume(code); return code === 92 ? destinationRawEscape : destinationRaw; } function destinationRawEscape(code) { if (code === 40 || code === 41 || code === 92) { effects.consume(code); return destinationRaw; } return destinationRaw(code); } } module2.exports = destinationFactory; } }); // node_modules/micromark/dist/tokenize/factory-label.js var require_factory_label = __commonJS({ "node_modules/micromark/dist/tokenize/factory-label.js"(exports, module2) { "use strict"; var markdownLineEnding = require_markdown_line_ending(); var markdownSpace = require_markdown_space(); function labelFactory(effects, ok, nok, type, markerType, stringType) { var self = this; var size = 0; var data; return start; function start(code) { effects.enter(type); effects.enter(markerType); effects.consume(code); effects.exit(markerType); effects.enter(stringType); return atBreak; } function atBreak(code) { if (code === null || code === 91 || code === 93 && !data || code === 94 && !size && "_hiddenFootnoteSupport" in self.parser.constructs || size > 999) { return nok(code); } if (code === 93) { effects.exit(stringType); effects.enter(markerType); effects.consume(code); effects.exit(markerType); effects.exit(type); return ok; } if (markdownLineEnding(code)) { effects.enter("lineEnding"); effects.consume(code); effects.exit("lineEnding"); return atBreak; } effects.enter("chunkString", { contentType: "string" }); return label(code); } function label(code) { if (code === null || code === 91 || code === 93 || markdownLineEnding(code) || size++ > 999) { effects.exit("chunkString"); return atBreak(code); } effects.consume(code); data = data || !markdownSpace(code); return code === 92 ? labelEscape : label; } function labelEscape(code) { if (code === 91 || code === 92 || code === 93) { effects.consume(code); size++; return label; } return label(code); } } module2.exports = labelFactory; } }); // node_modules/micromark/dist/tokenize/factory-whitespace.js var require_factory_whitespace = __commonJS({ "node_modules/micromark/dist/tokenize/factory-whitespace.js"(exports, module2) { "use strict"; var markdownLineEnding = require_markdown_line_ending(); var markdownSpace = require_markdown_space(); var factorySpace = require_factory_space(); function whitespaceFactory(effects, ok) { var seen; return start; function start(code) { if (markdownLineEnding(code)) { effects.enter("lineEnding"); effects.consume(code); effects.exit("lineEnding"); seen = true; return start; } if (markdownSpace(code)) { return factorySpace(effects, start, seen ? "linePrefix" : "lineSuffix")(code); } return ok(code); } } module2.exports = whitespaceFactory; } }); // node_modules/micromark/dist/tokenize/factory-title.js var require_factory_title = __commonJS({ "node_modules/micromark/dist/tokenize/factory-title.js"(exports, module2) { "use strict"; var markdownLineEnding = require_markdown_line_ending(); var factorySpace = require_factory_space(); function titleFactory(effects, ok, nok, type, markerType, stringType) { var marker; return start; function start(code) { effects.enter(type); effects.enter(markerType); effects.consume(code); effects.exit(markerType); marker = code === 40 ? 41 : code; return atFirstTitleBreak; } function atFirstTitleBreak(code) { if (code === marker) { effects.enter(markerType); effects.consume(code); effects.exit(markerType); effects.exit(type); return ok; } effects.enter(stringType); return atTitleBreak(code); } function atTitleBreak(code) { if (code === marker) { effects.exit(stringType); return atFirstTitleBreak(marker); } if (code === null) { return nok(code); } if (markdownLineEnding(code)) { effects.enter("lineEnding"); effects.consume(code); effects.exit("lineEnding"); return factorySpace(effects, atTitleBreak, "linePrefix"); } effects.enter("chunkString", { contentType: "string" }); return title(code); } function title(code) { if (code === marker || code === null || markdownLineEnding(code)) { effects.exit("chunkString"); return atTitleBreak(code); } effects.consume(code); return code === 92 ? titleEscape : title; } function titleEscape(code) { if (code === marker || code === 92) { effects.consume(code); return title; } return title(code); } } module2.exports = titleFactory; } }); // node_modules/micromark/dist/tokenize/definition.js var require_definition = __commonJS({ "node_modules/micromark/dist/tokenize/definition.js"(exports, module2) { "use strict"; var markdownLineEnding = require_markdown_line_ending(); var markdownLineEndingOrSpace = require_markdown_line_ending_or_space(); var normalizeIdentifier = require_normalize_identifier(); var factoryDestination = require_factory_destination(); var factoryLabel = require_factory_label(); var factorySpace = require_factory_space(); var factoryWhitespace = require_factory_whitespace(); var factoryTitle = require_factory_title(); var definition = { name: "definition", tokenize: tokenizeDefinition }; var titleConstruct = { tokenize: tokenizeTitle, partial: true }; function tokenizeDefinition(effects, ok, nok) { var self = this; var identifier; return start; function start(code) { effects.enter("definition"); return factoryLabel.call(self, effects, labelAfter, nok, "definitionLabel", "definitionLabelMarker", "definitionLabelString")(code); } function labelAfter(code) { identifier = normalizeIdentifier(self.sliceSerialize(self.events[self.events.length - 1][1]).slice(1, -1)); if (code === 58) { effects.enter("definitionMarker"); effects.consume(code); effects.exit("definitionMarker"); return factoryWhitespace(effects, factoryDestination(effects, effects.attempt(titleConstruct, factorySpace(effects, after, "whitespace"), factorySpace(effects, after, "whitespace")), nok, "definitionDestination", "definitionDestinationLiteral", "definitionDestinationLiteralMarker", "definitionDestinationRaw", "definitionDestinationString")); } return nok(code); } function after(code) { if (code === null || markdownLineEnding(code)) { effects.exit("definition"); if (self.parser.defined.indexOf(identifier) < 0) { self.parser.defined.push(identifier); } return ok(code); } return nok(code); } } function tokenizeTitle(effects, ok, nok) { return start; function start(code) { return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, before)(code) : nok(code); } function before(code) { if (code === 34 || code === 39 || code === 40) { return factoryTitle(effects, factorySpace(effects, after, "whitespace"), nok, "definitionTitle", "definitionTitleMarker", "definitionTitleString")(code); } return nok(code); } function after(code) { return code === null || markdownLineEnding(code) ? ok(code) : nok(code); } } module2.exports = definition; } }); // node_modules/micromark/dist/tokenize/hard-break-escape.js var require_hard_break_escape = __commonJS({ "node_modules/micromark/dist/tokenize/hard-break-escape.js"(exports, module2) { "use strict"; var markdownLineEnding = require_markdown_line_ending(); var hardBreakEscape = { name: "hardBreakEscape", tokenize: tokenizeHardBreakEscape }; function tokenizeHardBreakEscape(effects, ok, nok) { return start; function start(code) { effects.enter("hardBreakEscape"); effects.enter("escapeMarker"); effects.consume(code); return open; } function open(code) { if (markdownLineEnding(code)) { effects.exit("escapeMarker"); effects.exit("hardBreakEscape"); return ok(code); } return nok(code); } } module2.exports = hardBreakEscape; } }); // node_modules/micromark/dist/tokenize/heading-atx.js var require_heading_atx = __commonJS({ "node_modules/micromark/dist/tokenize/heading-atx.js"(exports, module2) { "use strict"; var markdownLineEnding = require_markdown_line_ending(); var markdownLineEndingOrSpace = require_markdown_line_ending_or_space(); var markdownSpace = require_markdown_space(); var chunkedSplice = require_chunked_splice(); var factorySpace = require_factory_space(); var headingAtx = { name: "headingAtx", tokenize: tokenizeHeadingAtx, resolve: resolveHeadingAtx }; function resolveHeadingAtx(events, context) { var contentEnd = events.length - 2; var contentStart = 3; var content; var text; if (events[contentStart][1].type === "whitespace") { contentStart += 2; } if (contentEnd - 2 > contentStart && events[contentEnd][1].type === "whitespace") { contentEnd -= 2; } if (events[contentEnd][1].type === "atxHeadingSequence" && (contentStart === contentEnd - 1 || contentEnd - 4 > contentStart && events[contentEnd - 2][1].type === "whitespace")) { contentEnd -= contentStart + 1 === contentEnd ? 2 : 4; } if (contentEnd > contentStart) { content = { type: "atxHeadingText", start: events[contentStart][1].start, end: events[contentEnd][1].end }; text = { type: "chunkText", start: events[contentStart][1].start, end: events[contentEnd][1].end, contentType: "text" }; chunkedSplice(events, contentStart, contentEnd - contentStart + 1, [ ["enter", content, context], ["enter", text, context], ["exit", text, context], ["exit", content, context] ]); } return events; } function tokenizeHeadingAtx(effects, ok, nok) { var self = this; var size = 0; return start; function start(code) { effects.enter("atxHeading"); effects.enter("atxHeadingSequence"); return fenceOpenInside(code); } function fenceOpenInside(code) { if (code === 35 && size++ < 6) { effects.consume(code); return fenceOpenInside; } if (code === null || markdownLineEndingOrSpace(code)) { effects.exit("atxHeadingSequence"); return self.interrupt ? ok(code) : headingBreak(code); } return nok(code); } function headingBreak(code) { if (code === 35) { effects.enter("atxHeadingSequence"); return sequence(code); } if (code === null || markdownLineEnding(code)) { effects.exit("atxHeading"); return ok(code); } if (markdownSpace(code)) { return factorySpace(effects, headingBreak, "whitespace")(code); } effects.enter("atxHeadingText"); return data(code); } function sequence(code) { if (code === 35) { effects.consume(code); return sequence; } effects.exit("atxHeadingSequence"); return headingBreak(code); } function data(code) { if (code === null || code === 35 || markdownLineEndingOrSpace(code)) { effects.exit("atxHeadingText"); return headingBreak(code); } effects.consume(code); return data; } } module2.exports = headingAtx; } }); // node_modules/micromark/dist/constant/html-block-names.js var require_html_block_names = __commonJS({ "node_modules/micromark/dist/constant/html-block-names.js"(exports, module2) { "use strict"; var basics = [ "address", "article", "aside", "base", "basefont", "blockquote", "body", "caption", "center", "col", "colgroup", "dd", "details", "dialog", "dir", "div", "dl", "dt", "fieldset", "figcaption", "figure", "footer", "form", "frame", "frameset", "h1", "h2", "h3", "h4", "h5", "h6", "head", "header", "hr", "html", "iframe", "legend", "li", "link", "main", "menu", "menuitem", "nav", "noframes", "ol", "optgroup", "option", "p", "param", "section", "source", "summary", "table", "tbody", "td", "tfoot", "th", "thead", "title", "tr", "track", "ul" ]; module2.exports = basics; } }); // node_modules/micromark/dist/constant/html-raw-names.js var require_html_raw_names = __commonJS({ "node_modules/micromark/dist/constant/html-raw-names.js"(exports, module2) { "use strict"; var raws = ["pre", "script", "style", "textarea"]; module2.exports = raws; } }); // node_modules/micromark/dist/tokenize/html-flow.js var require_html_flow = __commonJS({ "node_modules/micromark/dist/tokenize/html-flow.js"(exports, module2) { "use strict"; var asciiAlpha = require_ascii_alpha(); var asciiAlphanumeric = require_ascii_alphanumeric(); var markdownLineEnding = require_markdown_line_ending(); var markdownLineEndingOrSpace = require_markdown_line_ending_or_space(); var markdownSpace = require_markdown_space(); var fromCharCode = require_from_char_code(); var htmlBlockNames = require_html_block_names(); var htmlRawNames = require_html_raw_names(); var partialBlankLine = require_partial_blank_line(); var htmlFlow = { name: "htmlFlow", tokenize: tokenizeHtmlFlow, resolveTo: resolveToHtmlFlow, concrete: true }; var nextBlankConstruct = { tokenize: tokenizeNextBlank, partial: true }; function resolveToHtmlFlow(events) { var index = events.length; while (index--) { if (events[index][0] === "enter" && events[index][1].type === "htmlFlow") { break; } } if (index > 1 && events[index - 2][1].type === "linePrefix") { events[index][1].start = events[index - 2][1].start; events[index + 1][1].start = events[index - 2][1].start; events.splice(index - 2, 2); } return events; } function tokenizeHtmlFlow(effects, ok, nok) { var self = this; var kind; var startTag; var buffer; var index; var marker; return start; function start(code) { effects.enter("htmlFlow"); effects.enter("htmlFlowData"); effects.consume(code); return open; } function open(code) { if (code === 33) { effects.consume(code); return declarationStart; } if (code === 47) { effects.consume(code); return tagCloseStart; } if (code === 63) { effects.consume(code); kind = 3; return self.interrupt ? ok : continuationDeclarationInside; } if (asciiAlpha(code)) { effects.consume(code); buffer = fromCharCode(code); startTag = true; return tagName; } return nok(code); } function declarationStart(code) { if (code === 45) { effects.consume(code); kind = 2; return commentOpenInside; } if (code === 91) { effects.consume(code); kind = 5; buffer = "CDATA["; index = 0; return cdataOpenInside; } if (asciiAlpha(code)) { effects.consume(code); kind = 4; return self.interrupt ? ok : continuationDeclarationInside; } return nok(code); } function commentOpenInside(code) { if (code === 45) { effects.consume(code); return self.interrupt ? ok : continuationDeclarationInside; } return nok(code); } function cdataOpenInside(code) { if (code === buffer.charCodeAt(index++)) { effects.consume(code); return index === buffer.length ? self.interrupt ? ok : continuation : cdataOpenInside; } return nok(code); } function tagCloseStart(code) { if (asciiAlpha(code)) { effects.consume(code); buffer = fromCharCode(code); return tagName; } return nok(code); } function tagName(code) { if (code === null || code === 47 || code === 62 || markdownLineEndingOrSpace(code)) { if (code !== 47 && startTag && htmlRawNames.indexOf(buffer.toLowerCase()) > -1) { kind = 1; return self.interrupt ? ok(code) : continuation(code); } if (htmlBlockNames.indexOf(buffer.toLowerCase()) > -1) { kind = 6; if (code === 47) { effects.consume(code); return basicSelfClosing; } return self.interrupt ? ok(code) : continuation(code); } kind = 7; return self.interrupt ? nok(code) : startTag ? completeAttributeNameBefore(code) : completeClosingTagAfter(code); } if (code === 45 || asciiAlphanumeric(code)) { effects.consume(code); buffer += fromCharCode(code); return tagName; } return nok(code); } function basicSelfClosing(code) { if (code === 62) { effects.consume(code); return self.interrupt ? ok : continuation; } return nok(code); } function completeClosingTagAfter(code) { if (markdownSpace(code)) { effects.consume(code); return completeClosingTagAfter; } return completeEnd(code); } function completeAttributeNameBefore(code) { if (code === 47) { effects.consume(code); return completeEnd; } if (code === 58 || code === 95 || asciiAlpha(code)) { effects.consume(code); return completeAttributeName; } if (markdownSpace(code)) { effects.consume(code); return completeAttributeNameBefore; } return completeEnd(code); } function completeAttributeName(code) { if (code === 45 || code === 46 || code === 58 || code === 95 || asciiAlphanumeric(code)) { effects.consume(code); return completeAttributeName; } return completeAttributeNameAfter(code); } function completeAttributeNameAfter(code) { if (code === 61) { effects.consume(code); return completeAttributeValueBefore; } if (markdownSpace(code)) { effects.consume(code); return completeAttributeNameAfter; } return completeAttributeNameBefore(code); } function completeAttributeValueBefore(code) { if (code === null || code === 60 || code === 61 || code === 62 || code === 96) { return nok(code); } if (code === 34 || code === 39) { effects.consume(code); marker = code; return completeAttributeValueQuoted; } if (markdownSpace(code)) { effects.consume(code); return completeAttributeValueBefore; } marker = void 0; return completeAttributeValueUnquoted(code); } function completeAttributeValueQuoted(code) { if (code === marker) { effects.consume(code); return completeAttributeValueQuotedAfter; } if (code === null || markdownLineEnding(code)) { return nok(code); } effects.consume(code); return completeAttributeValueQuoted; } function completeAttributeValueUnquoted(code) { if (code === null || code === 34 || code === 39 || code === 60 || code === 61 || code === 62 || code === 96 || markdownLineEndingOrSpace(code)) { return completeAttributeNameAfter(code); } effects.consume(code); return completeAttributeValueUnquoted; } function completeAttributeValueQuotedAfter(code) { if (code === 47 || code === 62 || markdownSpace(code)) { return completeAttributeNameBefore(code); } return nok(code); } function completeEnd(code) { if (code === 62) { effects.consume(code); return completeAfter; } return nok(code); } function completeAfter(code) { if (markdownSpace(code)) { effects.consume(code); return completeAfter; } return code === null || markdownLineEnding(code) ? continuation(code) : nok(code); } function continuation(code) { if (code === 45 && kind === 2) { effects.consume(code); return continuationCommentInside; } if (code === 60 && kind === 1) { effects.consume(code); return continuationRawTagOpen; } if (code === 62 && kind === 4) { effects.consume(code); return continuationClose; } if (code === 63 && kind === 3) { effects.consume(code); return continuationDeclarationInside; } if (code === 93 && kind === 5) { effects.consume(code); return continuationCharacterDataInside; } if (markdownLineEnding(code) && (kind === 6 || kind === 7)) { return effects.check(nextBlankConstruct, continuationClose, continuationAtLineEnding)(code); } if (code === null || markdownLineEnding(code)) { return continuationAtLineEnding(code); } effects.consume(code); return continuation; } function continuationAtLineEnding(code) { effects.exit("htmlFlowData"); return htmlContinueStart(code); } function htmlContinueStart(code) { if (code === null) { return done(code); } if (markdownLineEnding(code)) { effects.enter("lineEnding"); effects.consume(code); effects.exit("lineEnding"); return htmlContinueStart; } effects.enter("htmlFlowData"); return continuation(code); } function continuationCommentInside(code) { if (code === 45) { effects.consume(code); return continuationDeclarationInside; } return continuation(code); } function continuationRawTagOpen(code) { if (code === 47) { effects.consume(code); buffer = ""; return continuationRawEndTag; } return continuation(code); } function continuationRawEndTag(code) { if (code === 62 && htmlRawNames.indexOf(buffer.toLowerCase()) > -1) { effects.consume(code); return continuationClose; } if (asciiAlpha(code) && buffer.length < 8) { effects.consume(code); buffer += fromCharCode(code); return continuationRawEndTag; } return continuation(code); } function continuationCharacterDataInside(code) { if (code === 93) { effects.consume(code); return continuationDeclarationInside; } return continuation(code); } function continuationDeclarationInside(code) { if (code === 62) { effects.consume(code); return continuationClose; } return continuation(code); } function continuationClose(code) { if (code === null || markdownLineEnding(code)) { effects.exit("htmlFlowData"); return done(code); } effects.consume(code); return continuationClose; } function done(code) { effects.exit("htmlFlow"); return ok(code); } } function tokenizeNextBlank(effects, ok, nok) { return start; function start(code) { effects.exit("htmlFlowData"); effects.enter("lineEndingBlank"); effects.consume(code); effects.exit("lineEndingBlank"); return effects.attempt(partialBlankLine, ok, nok); } } module2.exports = htmlFlow; } }); // node_modules/micromark/dist/tokenize/html-text.js var require_html_text = __commonJS({ "node_modules/micromark/dist/tokenize/html-text.js"(exports, module2) { "use strict"; var asciiAlpha = require_ascii_alpha(); var asciiAlphanumeric = require_ascii_alphanumeric(); var markdownLineEnding = require_markdown_line_ending(); var markdownLineEndingOrSpace = require_markdown_line_ending_or_space(); var markdownSpace = require_markdown_space(); var factorySpace = require_factory_space(); var htmlText = { name: "htmlText", tokenize: tokenizeHtmlText }; function tokenizeHtmlText(effects, ok, nok) { var self = this; var marker; var buffer; var index; var returnState; return start; function start(code) { effects.enter("htmlText"); effects.enter("htmlTextData"); effects.consume(code); return open; } function open(code) { if (code === 33) { effects.consume(code); return declarationOpen; } if (code === 47) { effects.consume(code); return tagCloseStart; } if (code === 63) { effects.consume(code); return instruction; } if (asciiAlpha(code)) { effects.consume(code); return tagOpen; } return nok(code); } function declarationOpen(code) { if (code === 45) { effects.consume(code); return commentOpen; } if (code === 91) { effects.consume(code); buffer = "CDATA["; index = 0; return cdataOpen; } if (asciiAlpha(code)) { effects.consume(code); return declaration; } return nok(code); } function commentOpen(code) { if (code === 45) { effects.consume(code); return commentStart; } return nok(code); } function commentStart(code) { if (code === null || code === 62) { return nok(code); } if (code === 45) { effects.consume(code); return commentStartDash; } return comment(code); } function commentStartDash(code) { if (code === null || code === 62) { return nok(code); } return comment(code); } function comment(code) { if (code === null) { return nok(code); } if (code === 45) { effects.consume(code); return commentClose; } if (markdownLineEnding(code)) { returnState = comment; return atLineEnding(code); } effects.consume(code); return comment; } function commentClose(code) { if (code === 45) { effects.consume(code); return end; } return comment(code); } function cdataOpen(code) { if (code === buffer.charCodeAt(index++)) { effects.consume(code); return index === buffer.length ? cdata : cdataOpen; } return nok(code); } function cdata(code) { if (code === null) { return nok(code); } if (code === 93) { effects.consume(code); return cdataClose; } if (markdownLineEnding(code)) { returnState = cdata; return atLineEnding(code); } effects.consume(code); return cdata; } function cdataClose(code) { if (code === 93) { effects.consume(code); return cdataEnd; } return cdata(code); } function cdataEnd(code) { if (code === 62) { return end(code); } if (code === 93) { effects.consume(code); return cdataEnd; } return cdata(code); } function declaration(code) { if (code === null || code === 62) { return end(code); } if (markdownLineEnding(code)) { returnState = declaration; return atLineEnding(code); } effects.consume(code); return declaration; } function instruction(code) { if (code === null) { return nok(code); } if (code === 63) { effects.consume(code); return instructionClose; } if (markdownLineEnding(code)) { returnState = instruction; return atLineEnding(code); } effects.consume(code); return instruction; } function instructionClose(code) { return code === 62 ? end(code) : instruction(code); } function tagCloseStart(code) { if (asciiAlpha(code)) { effects.consume(code); return tagClose; } return nok(code); } function tagClose(code) { if (code === 45 || asciiAlphanumeric(code)) { effects.consume(code); return tagClose; } return tagCloseBetween(code); } function tagCloseBetween(code) { if (markdownLineEnding(code)) { returnState = tagCloseBetween; return atLineEnding(code); } if (markdownSpace(code)) { effects.consume(code); return tagCloseBetween; } return end(code); } function tagOpen(code) { if (code === 45 || asciiAlphanumeric(code)) { effects.consume(code); return tagOpen; } if (code === 47 || code === 62 || markdownLineEndingOrSpace(code)) { return tagOpenBetween(code); } return nok(code); } function tagOpenBetween(code) { if (code === 47) { effects.consume(code); return end; } if (code === 58 || code === 95 || asciiAlpha(code)) { effects.consume(code); return tagOpenAttributeName; } if (markdownLineEnding(code)) { returnState = tagOpenBetween; return atLineEnding(code); } if (markdownSpace(code)) { effects.consume(code); return tagOpenBetween; } return end(code); } function tagOpenAttributeName(code) { if (code === 45 || code === 46 || code === 58 || code === 95 || asciiAlphanumeric(code)) { effects.consume(code); return tagOpenAttributeName; } return tagOpenAttributeNameAfter(code); } function tagOpenAttributeNameAfter(code) { if (code === 61) { effects.consume(code); return tagOpenAttributeValueBefore; } if (markdownLineEnding(code)) { returnState = tagOpenAttributeNameAfter; return atLineEnding(code); } if (markdownSpace(code)) { effects.consume(code); return tagOpenAttributeNameAfter; } return tagOpenBetween(code); } function tagOpenAttributeValueBefore(code) { if (code === null || code === 60 || code === 61 || code === 62 || code === 96) { return nok(code); } if (code === 34 || code === 39) { effects.consume(code); marker = code; return tagOpenAttributeValueQuoted; } if (markdownLineEnding(code)) { returnState = tagOpenAttributeValueBefore; return atLineEnding(code); } if (markdownSpace(code)) { effects.consume(code); return tagOpenAttributeValueBefore; } effects.consume(code); marker = void 0; return tagOpenAttributeValueUnquoted; } function tagOpenAttributeValueQuoted(code) { if (code === marker) { effects.consume(code); return tagOpenAttributeValueQuotedAfter; } if (code === null) { return nok(code); } if (markdownLineEnding(code)) { returnState = tagOpenAttributeValueQuoted; return atLineEnding(code); } effects.consume(code); return tagOpenAttributeValueQuoted; } function tagOpenAttributeValueQuotedAfter(code) { if (code === 62 || code === 47 || markdownLineEndingOrSpace(code)) { return tagOpenBetween(code); } return nok(code); } function tagOpenAttributeValueUnquoted(code) { if (code === null || code === 34 || code === 39 || code === 60 || code === 61 || code === 96) { return nok(code); } if (code === 62 || markdownLineEndingOrSpace(code)) { return tagOpenBetween(code); } effects.consume(code); return tagOpenAttributeValueUnquoted; } function atLineEnding(code) { effects.exit("htmlTextData"); effects.enter("lineEnding"); effects.consume(code); effects.exit("lineEnding"); return factorySpace(effects, afterPrefix, "linePrefix", self.parser.constructs.disable.null.indexOf("codeIndented") > -1 ? void 0 : 4); } function afterPrefix(code) { effects.enter("htmlTextData"); return returnState(code); } function end(code) { if (code === 62) { effects.consume(code); effects.exit("htmlTextData"); effects.exit("htmlText"); return ok; } return nok(code); } } module2.exports = htmlText; } }); // node_modules/micromark/dist/tokenize/label-end.js var require_label_end = __commonJS({ "node_modules/micromark/dist/tokenize/label-end.js"(exports, module2) { "use strict"; var markdownLineEndingOrSpace = require_markdown_line_ending_or_space(); var chunkedPush = require_chunked_push(); var chunkedSplice = require_chunked_splice(); var normalizeIdentifier = require_normalize_identifier(); var resolveAll = require_resolve_all(); var shallow = require_shallow(); var factoryDestination = require_factory_destination(); var factoryLabel = require_factory_label(); var factoryTitle = require_factory_title(); var factoryWhitespace = require_factory_whitespace(); var labelEnd = { name: "labelEnd", tokenize: tokenizeLabelEnd, resolveTo: resolveToLabelEnd, resolveAll: resolveAllLabelEnd }; var resourceConstruct = { tokenize: tokenizeResource }; var fullReferenceConstruct = { tokenize: tokenizeFullReference }; var collapsedReferenceConstruct = { tokenize: tokenizeCollapsedReference }; function resolveAllLabelEnd(events) { var index = -1; var token; while (++index < events.length) { token = events[index][1]; if (!token._used && (token.type === "labelImage" || token.type === "labelLink" || token.type === "labelEnd")) { events.splice(index + 1, token.type === "labelImage" ? 4 : 2); token.type = "data"; index++; } } return events; } function resolveToLabelEnd(events, context) { var index = events.length; var offset = 0; var group; var label; var text; var token; var open; var close; var media; while (index--) { token = events[index][1]; if (open) { if (token.type === "link" || token.type === "labelLink" && token._inactive) { break; } if (events[index][0] === "enter" && token.type === "labelLink") { token._inactive = true; } } else if (close) { if (events[index][0] === "enter" && (token.type === "labelImage" || token.type === "labelLink") && !token._balanced) { open = index; if (token.type !== "labelLink") { offset = 2; break; } } } else if (token.type === "labelEnd") { close = index; } } group = { type: events[open][1].type === "labelLink" ? "link" : "image", start: shallow(events[open][1].start), end: shallow(events[events.length - 1][1].end) }; label = { type: "label", start: shallow(events[open][1].start), end: shallow(events[close][1].end) }; text = { type: "labelText", start: shallow(events[open + offset + 2][1].end), end: shallow(events[close - 2][1].start) }; media = [ ["enter", group, context], ["enter", label, context] ]; media = chunkedPush(media, events.slice(open + 1, open + offset + 3)); media = chunkedPush(media, [["enter", text, context]]); media = chunkedPush(media, resolveAll(context.parser.constructs.insideSpan.null, events.slice(open + offset + 4, close - 3), context)); media = chunkedPush(media, [ ["exit", text, context], events[close - 2], events[close - 1], ["exit", label, context] ]); media = chunkedPush(media, events.slice(close + 1)); media = chunkedPush(media, [["exit", group, context]]); chunkedSplice(events, open, events.length, media); return events; } function tokenizeLabelEnd(effects, ok, nok) { var self = this; var index = self.events.length; var labelStart; var defined; while (index--) { if ((self.events[index][1].type === "labelImage" || self.events[index][1].type === "labelLink") && !self.events[index][1]._balanced) { labelStart = self.events[index][1]; break; } } return start; function start(code) { if (!labelStart) { return nok(code); } if (labelStart._inactive) return balanced(code); defined = self.parser.defined.indexOf(normalizeIdentifier(self.sliceSerialize({ start: labelStart.end, end: self.now() }))) > -1; effects.enter("labelEnd"); effects.enter("labelMarker"); effects.consume(code); effects.exit("labelMarker"); effects.exit("labelEnd"); return afterLabelEnd; } function afterLabelEnd(code) { if (code === 40) { return effects.attempt(resourceConstruct, ok, defined ? ok : balanced)(code); } if (code === 91) { return effects.attempt(fullReferenceConstruct, ok, defined ? effects.attempt(collapsedReferenceConstruct, ok, balanced) : balanced)(code); } return defined ? ok(code) : balanced(code); } function balanced(code) { labelStart._balanced = true; return nok(code); } } function tokenizeResource(effects, ok, nok) { return start; function start(code) { effects.enter("resource"); effects.enter("resourceMarker"); effects.consume(code); effects.exit("resourceMarker"); return factoryWhitespace(effects, open); } function open(code) { if (code === 41) { return end(code); } return factoryDestination(effects, destinationAfter, nok, "resourceDestination", "resourceDestinationLiteral", "resourceDestinationLiteralMarker", "resourceDestinationRaw", "resourceDestinationString", 3)(code); } function destinationAfter(code) { return markdownLineEndingOrSpace(code) ? factoryWhitespace(effects, between)(code) : end(code); } function between(code) { if (code === 34 || code === 39 || code === 40) { return factoryTitle(effects, factoryWhitespace(effects, end), nok, "resourceTitle", "resourceTitleMarker", "resourceTitleString")(code); } return end(code); } function end(code) { if (code === 41) { effects.enter("resourceMarker"); effects.consume(code); effects.exit("resourceMarker"); effects.exit("resource"); return ok; } return nok(code); } } function tokenizeFullReference(effects, ok, nok) { var self = this; return start; function start(code) { return factoryLabel.call(self, effects, afterLabel, nok, "reference", "referenceMarker", "referenceString")(code); } function afterLabel(code) { return self.parser.defined.indexOf(normalizeIdentifier(self.sliceSerialize(self.events[self.events.length - 1][1]).slice(1, -1))) < 0 ? nok(code) : ok(code); } } function tokenizeCollapsedReference(effects, ok, nok) { return start; function start(code) { effects.enter("reference"); effects.enter("referenceMarker"); effects.consume(code); effects.exit("referenceMarker"); return open; } function open(code) { if (code === 93) { effects.enter("referenceMarker"); effects.consume(code); effects.exit("referenceMarker"); effects.exit("reference"); return ok; } return nok(code); } } module2.exports = labelEnd; } }); // node_modules/micromark/dist/tokenize/label-start-image.js var require_label_start_image = __commonJS({ "node_modules/micromark/dist/tokenize/label-start-image.js"(exports, module2) { "use strict"; var labelEnd = require_label_end(); var labelStartImage = { name: "labelStartImage", tokenize: tokenizeLabelStartImage, resolveAll: labelEnd.resolveAll }; function tokenizeLabelStartImage(effects, ok, nok) { var self = this; return start; function start(code) { effects.enter("labelImage"); effects.enter("labelImageMarker"); effects.consume(code); effects.exit("labelImageMarker"); return open; } function open(code) { if (code === 91) { effects.enter("labelMarker"); effects.consume(code); effects.exit("labelMarker"); effects.exit("labelImage"); return after; } return nok(code); } function after(code) { return code === 94 && "_hiddenFootnoteSupport" in self.parser.constructs ? nok(code) : ok(code); } } module2.exports = labelStartImage; } }); // node_modules/micromark/dist/tokenize/label-start-link.js var require_label_start_link = __commonJS({ "node_modules/micromark/dist/tokenize/label-start-link.js"(exports, module2) { "use strict"; var labelEnd = require_label_end(); var labelStartLink = { name: "labelStartLink", tokenize: tokenizeLabelStartLink, resolveAll: labelEnd.resolveAll }; function tokenizeLabelStartLink(effects, ok, nok) { var self = this; return start; function start(code) { effects.enter("labelLink"); effects.enter("labelMarker"); effects.consume(code); effects.exit("labelMarker"); effects.exit("labelLink"); return after; } function after(code) { return code === 94 && "_hiddenFootnoteSupport" in self.parser.constructs ? nok(code) : ok(code); } } module2.exports = labelStartLink; } }); // node_modules/micromark/dist/tokenize/line-ending.js var require_line_ending = __commonJS({ "node_modules/micromark/dist/tokenize/line-ending.js"(exports, module2) { "use strict"; var factorySpace = require_factory_space(); var lineEnding = { name: "lineEnding", tokenize: tokenizeLineEnding }; function tokenizeLineEnding(effects, ok) { return start; function start(code) { effects.enter("lineEnding"); effects.consume(code); effects.exit("lineEnding"); return factorySpace(effects, ok, "linePrefix"); } } module2.exports = lineEnding; } }); // node_modules/micromark/dist/tokenize/thematic-break.js var require_thematic_break = __commonJS({ "node_modules/micromark/dist/tokenize/thematic-break.js"(exports, module2) { "use strict"; var markdownLineEnding = require_markdown_line_ending(); var markdownSpace = require_markdown_space(); var factorySpace = require_factory_space(); var thematicBreak = { name: "thematicBreak", tokenize: tokenizeThematicBreak }; function tokenizeThematicBreak(effects, ok, nok) { var size = 0; var marker; return start; function start(code) { effects.enter("thematicBreak"); marker = code; return atBreak(code); } function atBreak(code) { if (code === marker) { effects.enter("thematicBreakSequence"); return sequence(code); } if (markdownSpace(code)) { return factorySpace(effects, atBreak, "whitespace")(code); } if (size < 3 || code !== null && !markdownLineEnding(code)) { return nok(code); } effects.exit("thematicBreak"); return ok(code); } function sequence(code) { if (code === marker) { effects.consume(code); size++; return sequence; } effects.exit("thematicBreakSequence"); return atBreak(code); } } module2.exports = thematicBreak; } }); // node_modules/micromark/dist/tokenize/list.js var require_list = __commonJS({ "node_modules/micromark/dist/tokenize/list.js"(exports, module2) { "use strict"; var asciiDigit = require_ascii_digit(); var markdownSpace = require_markdown_space(); var prefixSize = require_prefix_size(); var sizeChunks = require_size_chunks(); var factorySpace = require_factory_space(); var partialBlankLine = require_partial_blank_line(); var thematicBreak = require_thematic_break(); var list = { name: "list", tokenize: tokenizeListStart, continuation: { tokenize: tokenizeListContinuation }, exit: tokenizeListEnd }; var listItemPrefixWhitespaceConstruct = { tokenize: tokenizeListItemPrefixWhitespace, partial: true }; var indentConstruct = { tokenize: tokenizeIndent, partial: true }; function tokenizeListStart(effects, ok, nok) { var self = this; var initialSize = prefixSize(self.events, "linePrefix"); var size = 0; return start; function start(code) { var kind = self.containerState.type || (code === 42 || code === 43 || code === 45 ? "listUnordered" : "listOrdered"); if (kind === "listUnordered" ? !self.containerState.marker || code === self.containerState.marker : asciiDigit(code)) { if (!self.containerState.type) { self.containerState.type = kind; effects.enter(kind, { _container: true }); } if (kind === "listUnordered") { effects.enter("listItemPrefix"); return code === 42 || code === 45 ? effects.check(thematicBreak, nok, atMarker)(code) : atMarker(code); } if (!self.interrupt || code === 49) { effects.enter("listItemPrefix"); effects.enter("listItemValue"); return inside(code); } } return nok(code); } function inside(code) { if (asciiDigit(code) && ++size < 10) { effects.consume(code); return inside; } if ((!self.interrupt || size < 2) && (self.containerState.marker ? code === self.containerState.marker : code === 41 || code === 46)) { effects.exit("listItemValue"); return atMarker(code); } return nok(code); } function atMarker(code) { effects.enter("listItemMarker"); effects.consume(code); effects.exit("listItemMarker"); self.containerState.marker = self.containerState.marker || code; return effects.check(partialBlankLine, self.interrupt ? nok : onBlank, effects.attempt(listItemPrefixWhitespaceConstruct, endOfPrefix, otherPrefix)); } function onBlank(code) { self.containerState.initialBlankLine = true; initialSize++; return endOfPrefix(code); } function otherPrefix(code) { if (markdownSpace(code)) { effects.enter("listItemPrefixWhitespace"); effects.consume(code); effects.exit("listItemPrefixWhitespace"); return endOfPrefix; } return nok(code); } function endOfPrefix(code) { self.containerState.size = initialSize + sizeChunks(self.sliceStream(effects.exit("listItemPrefix"))); return ok(code); } } function tokenizeListContinuation(effects, ok, nok) { var self = this; self.containerState._closeFlow = void 0; return effects.check(partialBlankLine, onBlank, notBlank); function onBlank(code) { self.containerState.furtherBlankLines = self.containerState.furtherBlankLines || self.containerState.initialBlankLine; return factorySpace(effects, ok, "listItemIndent", self.containerState.size + 1)(code); } function notBlank(code) { if (self.containerState.furtherBlankLines || !markdownSpace(code)) { self.containerState.furtherBlankLines = self.containerState.initialBlankLine = void 0; return notInCurrentItem(code); } self.containerState.furtherBlankLines = self.containerState.initialBlankLine = void 0; return effects.attempt(indentConstruct, ok, notInCurrentItem)(code); } function notInCurrentItem(code) { self.containerState._closeFlow = true; self.interrupt = void 0; return factorySpace(effects, effects.attempt(list, ok, nok), "linePrefix", self.parser.constructs.disable.null.indexOf("codeIndented") > -1 ? void 0 : 4)(code); } } function tokenizeIndent(effects, ok, nok) { var self = this; return factorySpace(effects, afterPrefix, "listItemIndent", self.containerState.size + 1); function afterPrefix(code) { return prefixSize(self.events, "listItemIndent") === self.containerState.size ? ok(code) : nok(code); } } function tokenizeListEnd(effects) { effects.exit(this.containerState.type); } function tokenizeListItemPrefixWhitespace(effects, ok, nok) { var self = this; return factorySpace(effects, afterPrefix, "listItemPrefixWhitespace", self.parser.constructs.disable.null.indexOf("codeIndented") > -1 ? void 0 : 4 + 1); function afterPrefix(code) { return markdownSpace(code) || !prefixSize(self.events, "listItemPrefixWhitespace") ? nok(code) : ok(code); } } module2.exports = list; } }); // node_modules/micromark/dist/tokenize/setext-underline.js var require_setext_underline = __commonJS({ "node_modules/micromark/dist/tokenize/setext-underline.js"(exports, module2) { "use strict"; var markdownLineEnding = require_markdown_line_ending(); var shallow = require_shallow(); var factorySpace = require_factory_space(); var setextUnderline = { name: "setextUnderline", tokenize: tokenizeSetextUnderline, resolveTo: resolveToSetextUnderline }; function resolveToSetextUnderline(events, context) { var index = events.length; var content; var text; var definition; var heading; while (index--) { if (events[index][0] === "enter") { if (events[index][1].type === "content") { content = index; break; } if (events[index][1].type === "paragraph") { text = index; } } else { if (events[index][1].type === "content") { events.splice(index, 1); } if (!definition && events[index][1].type === "definition") { definition = index; } } } heading = { type: "setextHeading", start: shallow(events[text][1].start), end: shallow(events[events.length - 1][1].end) }; events[text][1].type = "setextHeadingText"; if (definition) { events.splice(text, 0, ["enter", heading, context]); events.splice(definition + 1, 0, ["exit", events[content][1], context]); events[content][1].end = shallow(events[definition][1].end); } else { events[content][1] = heading; } events.push(["exit", heading, context]); return events; } function tokenizeSetextUnderline(effects, ok, nok) { var self = this; var index = self.events.length; var marker; var paragraph; while (index--) { if (self.events[index][1].type !== "lineEnding" && self.events[index][1].type !== "linePrefix" && self.events[index][1].type !== "content") { paragraph = self.events[index][1].type === "paragraph"; break; } } return start; function start(code) { if (!self.lazy && (self.interrupt || paragraph)) { effects.enter("setextHeadingLine"); effects.enter("setextHeadingLineSequence"); marker = code; return closingSequence(code); } return nok(code); } function closingSequence(code) { if (code === marker) { effects.consume(code); return closingSequence; } effects.exit("setextHeadingLineSequence"); return factorySpace(effects, closingSequenceEnd, "lineSuffix")(code); } function closingSequenceEnd(code) { if (code === null || markdownLineEnding(code)) { effects.exit("setextHeadingLine"); return ok(code); } return nok(code); } } module2.exports = setextUnderline; } }); // node_modules/micromark/dist/constructs.js var require_constructs = __commonJS({ "node_modules/micromark/dist/constructs.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var text$1 = require_text(); var attention = require_attention(); var autolink = require_autolink(); var blockQuote = require_block_quote(); var characterEscape = require_character_escape(); var characterReference = require_character_reference(); var codeFenced = require_code_fenced(); var codeIndented = require_code_indented(); var codeText = require_code_text(); var definition = require_definition(); var hardBreakEscape = require_hard_break_escape(); var headingAtx = require_heading_atx(); var htmlFlow = require_html_flow(); var htmlText = require_html_text(); var labelEnd = require_label_end(); var labelStartImage = require_label_start_image(); var labelStartLink = require_label_start_link(); var lineEnding = require_line_ending(); var list = require_list(); var setextUnderline = require_setext_underline(); var thematicBreak = require_thematic_break(); var document2 = { 42: list, 43: list, 45: list, 48: list, 49: list, 50: list, 51: list, 52: list, 53: list, 54: list, 55: list, 56: list, 57: list, 62: blockQuote }; var contentInitial = { 91: definition }; var flowInitial = { "-2": codeIndented, "-1": codeIndented, 32: codeIndented }; var flow = { 35: headingAtx, 42: thematicBreak, 45: [setextUnderline, thematicBreak], 60: htmlFlow, 61: setextUnderline, 95: thematicBreak, 96: codeFenced, 126: codeFenced }; var string2 = { 38: characterReference, 92: characterEscape }; var text = { "-5": lineEnding, "-4": lineEnding, "-3": lineEnding, 33: labelStartImage, 38: characterReference, 42: attention, 60: [autolink, htmlText], 91: labelStartLink, 92: [hardBreakEscape, characterEscape], 93: labelEnd, 95: attention, 96: codeText }; var insideSpan = { null: [attention, text$1.resolver] }; var disable = { null: [] }; exports.contentInitial = contentInitial; exports.disable = disable; exports.document = document2; exports.flow = flow; exports.flowInitial = flowInitial; exports.insideSpan = insideSpan; exports.string = string2; exports.text = text; } }); // node_modules/micromark/dist/parse.js var require_parse = __commonJS({ "node_modules/micromark/dist/parse.js"(exports, module2) { "use strict"; var content = require_content(); var document2 = require_document(); var flow = require_flow(); var text = require_text(); var combineExtensions = require_combine_extensions(); var createTokenizer = require_create_tokenizer(); var miniflat = require_miniflat(); var constructs = require_constructs(); function parse3(options) { var settings = options || {}; var parser = { defined: [], constructs: combineExtensions([constructs].concat(miniflat(settings.extensions))), content: create(content), document: create(document2), flow: create(flow), string: create(text.string), text: create(text.text) }; return parser; function create(initializer) { return creator; function creator(from) { return createTokenizer(parser, initializer, from); } } } module2.exports = parse3; } }); // node_modules/micromark/dist/preprocess.js var require_preprocess = __commonJS({ "node_modules/micromark/dist/preprocess.js"(exports, module2) { "use strict"; var search = /[\0\t\n\r]/g; function preprocess() { var start = true; var column = 1; var buffer = ""; var atCarriageReturn; return preprocessor; function preprocessor(value, encoding, end) { var chunks = []; var match; var next; var startPosition; var endPosition; var code; value = buffer + value.toString(encoding); startPosition = 0; buffer = ""; if (start) { if (value.charCodeAt(0) === 65279) { startPosition++; } start = void 0; } while (startPosition < value.length) { search.lastIndex = startPosition; match = search.exec(value); endPosition = match ? match.index : value.length; code = value.charCodeAt(endPosition); if (!match) { buffer = value.slice(startPosition); break; } if (code === 10 && startPosition === endPosition && atCarriageReturn) { chunks.push(-3); atCarriageReturn = void 0; } else { if (atCarriageReturn) { chunks.push(-5); atCarriageReturn = void 0; } if (startPosition < endPosition) { chunks.push(value.slice(startPosition, endPosition)); column += endPosition - startPosition; } if (code === 0) { chunks.push(65533); column++; } else if (code === 9) { next = Math.ceil(column / 4) * 4; chunks.push(-2); while (column++ < next) chunks.push(-1); } else if (code === 10) { chunks.push(-4); column = 1; } else { atCarriageReturn = true; column = 1; } } startPosition = endPosition + 1; } if (end) { if (atCarriageReturn) chunks.push(-5); if (buffer) chunks.push(buffer); chunks.push(null); } return chunks; } } module2.exports = preprocess; } }); // node_modules/micromark/dist/postprocess.js var require_postprocess = __commonJS({ "node_modules/micromark/dist/postprocess.js"(exports, module2) { "use strict"; var subtokenize = require_subtokenize(); function postprocess(events) { while (!subtokenize(events)) { } return events; } module2.exports = postprocess; } }); // node_modules/mdast-util-from-markdown/dist/index.js var require_dist = __commonJS({ "node_modules/mdast-util-from-markdown/dist/index.js"(exports, module2) { "use strict"; module2.exports = fromMarkdown; var toString = require_mdast_util_to_string(); var assign = require_assign(); var own = require_has_own_property(); var normalizeIdentifier = require_normalize_identifier(); var safeFromInt = require_safe_from_int(); var parser = require_parse(); var preprocessor = require_preprocess(); var postprocess = require_postprocess(); var decode = require_decode_entity_browser(); var stringifyPosition = require_unist_util_stringify_position(); function fromMarkdown(value, encoding, options) { if (typeof encoding !== "string") { options = encoding; encoding = void 0; } return compiler(options)(postprocess(parser(options).document().write(preprocessor()(value, encoding, true)))); } function compiler(options) { var settings = options || {}; var config = configure({ transforms: [], canContainEols: [ "emphasis", "fragment", "heading", "paragraph", "strong" ], enter: { autolink: opener(link), autolinkProtocol: onenterdata, autolinkEmail: onenterdata, atxHeading: opener(heading), blockQuote: opener(blockQuote), characterEscape: onenterdata, characterReference: onenterdata, codeFenced: opener(codeFlow), codeFencedFenceInfo: buffer, codeFencedFenceMeta: buffer, codeIndented: opener(codeFlow, buffer), codeText: opener(codeText, buffer), codeTextData: onenterdata, data: onenterdata, codeFlowValue: onenterdata, definition: opener(definition), definitionDestinationString: buffer, definitionLabelString: buffer, definitionTitleString: buffer, emphasis: opener(emphasis), hardBreakEscape: opener(hardBreak), hardBreakTrailing: opener(hardBreak), htmlFlow: opener(html, buffer), htmlFlowData: onenterdata, htmlText: opener(html, buffer), htmlTextData: onenterdata, image: opener(image), label: buffer, link: opener(link), listItem: opener(listItem), listItemValue: onenterlistitemvalue, listOrdered: opener(list, onenterlistordered), listUnordered: opener(list), paragraph: opener(paragraph), reference: onenterreference, referenceString: buffer, resourceDestinationString: buffer, resourceTitleString: buffer, setextHeading: opener(heading), strong: opener(strong), thematicBreak: opener(thematicBreak) }, exit: { atxHeading: closer(), atxHeadingSequence: onexitatxheadingsequence, autolink: closer(), autolinkEmail: onexitautolinkemail, autolinkProtocol: onexitautolinkprotocol, blockQuote: closer(), characterEscapeValue: onexitdata, characterReferenceMarkerHexadecimal: onexitcharacterreferencemarker, characterReferenceMarkerNumeric: onexitcharacterreferencemarker, characterReferenceValue: onexitcharacterreferencevalue, codeFenced: closer(onexitcodefenced), codeFencedFence: onexitcodefencedfence, codeFencedFenceInfo: onexitcodefencedfenceinfo, codeFencedFenceMeta: onexitcodefencedfencemeta, codeFlowValue: onexitdata, codeIndented: closer(onexitcodeindented), codeText: closer(onexitcodetext), codeTextData: onexitdata, data: onexitdata, definition: closer(), definitionDestinationString: onexitdefinitiondestinationstring, definitionLabelString: onexitdefinitionlabelstring, definitionTitleString: onexitdefinitiontitlestring, emphasis: closer(), hardBreakEscape: closer(onexithardbreak), hardBreakTrailing: closer(onexithardbreak), htmlFlow: closer(onexithtmlflow), htmlFlowData: onexitdata, htmlText: closer(onexithtmltext), htmlTextData: onexitdata, image: closer(onexitimage), label: onexitlabel, labelText: onexitlabeltext, lineEnding: onexitlineending, link: closer(onexitlink), listItem: closer(), listOrdered: closer(), listUnordered: closer(), paragraph: closer(), referenceString: onexitreferencestring, resourceDestinationString: onexitresourcedestinationstring, resourceTitleString: onexitresourcetitlestring, resource: onexitresource, setextHeading: closer(onexitsetextheading), setextHeadingLineSequence: onexitsetextheadinglinesequence, setextHeadingText: onexitsetextheadingtext, strong: closer(), thematicBreak: closer() } }, settings.mdastExtensions || []); var data = {}; return compile; function compile(events) { var tree = { type: "root", children: [] }; var stack = [tree]; var tokenStack = []; var listStack = []; var index = -1; var handler; var listStart; var context = { stack, tokenStack, config, enter, exit, buffer, resume, setData, getData }; while (++index < events.length) { if (events[index][1].type === "listOrdered" || events[index][1].type === "listUnordered") { if (events[index][0] === "enter") { listStack.push(index); } else { listStart = listStack.pop(index); index = prepareList(events, listStart, index); } } } index = -1; while (++index < events.length) { handler = config[events[index][0]]; if (own.call(handler, events[index][1].type)) { handler[events[index][1].type].call(assign({ sliceSerialize: events[index][2].sliceSerialize }, context), events[index][1]); } } if (tokenStack.length) { throw new Error("Cannot close document, a token (`" + tokenStack[tokenStack.length - 1].type + "`, " + stringifyPosition({ start: tokenStack[tokenStack.length - 1].start, end: tokenStack[tokenStack.length - 1].end }) + ") is still open"); } tree.position = { start: point(events.length ? events[0][1].start : { line: 1, column: 1, offset: 0 }), end: point(events.length ? events[events.length - 2][1].end : { line: 1, column: 1, offset: 0 }) }; index = -1; while (++index < config.transforms.length) { tree = config.transforms[index](tree) || tree; } return tree; } function prepareList(events, start, length) { var index = start - 1; var containerBalance = -1; var listSpread = false; var listItem2; var tailIndex; var lineIndex; var tailEvent; var event; var firstBlankLineIndex; var atMarker; while (++index <= length) { event = events[index]; if (event[1].type === "listUnordered" || event[1].type === "listOrdered" || event[1].type === "blockQuote") { if (event[0] === "enter") { containerBalance++; } else { containerBalance--; } atMarker = void 0; } else if (event[1].type === "lineEndingBlank") { if (event[0] === "enter") { if (listItem2 && !atMarker && !containerBalance && !firstBlankLineIndex) { firstBlankLineIndex = index; } atMarker = void 0; } } else if (event[1].type === "linePrefix" || event[1].type === "listItemValue" || event[1].type === "listItemMarker" || event[1].type === "listItemPrefix" || event[1].type === "listItemPrefixWhitespace") { } else { atMarker = void 0; } if (!containerBalance && event[0] === "enter" && event[1].type === "listItemPrefix" || containerBalance === -1 && event[0] === "exit" && (event[1].type === "listUnordered" || event[1].type === "listOrdered")) { if (listItem2) { tailIndex = index; lineIndex = void 0; while (tailIndex--) { tailEvent = events[tailIndex]; if (tailEvent[1].type === "lineEnding" || tailEvent[1].type === "lineEndingBlank") { if (tailEvent[0] === "exit") continue; if (lineIndex) { events[lineIndex][1].type = "lineEndingBlank"; listSpread = true; } tailEvent[1].type = "lineEnding"; lineIndex = tailIndex; } else if (tailEvent[1].type === "linePrefix" || tailEvent[1].type === "blockQuotePrefix" || tailEvent[1].type === "blockQuotePrefixWhitespace" || tailEvent[1].type === "blockQuoteMarker" || tailEvent[1].type === "listItemIndent") { } else { break; } } if (firstBlankLineIndex && (!lineIndex || firstBlankLineIndex < lineIndex)) { listItem2._spread = true; } listItem2.end = point(lineIndex ? events[lineIndex][1].start : event[1].end); events.splice(lineIndex || index, 0, ["exit", listItem2, event[2]]); index++; length++; } if (event[1].type === "listItemPrefix") { listItem2 = { type: "listItem", _spread: false, start: point(event[1].start) }; events.splice(index, 0, ["enter", listItem2, event[2]]); index++; length++; firstBlankLineIndex = void 0; atMarker = true; } } } events[start][1]._spread = listSpread; return length; } function setData(key, value) { data[key] = value; } function getData(key) { return data[key]; } function point(d) { return { line: d.line, column: d.column, offset: d.offset }; } function opener(create, and) { return open; function open(token) { enter.call(this, create(token), token); if (and) and.call(this, token); } } function buffer() { this.stack.push({ type: "fragment", children: [] }); } function enter(node, token) { this.stack[this.stack.length - 1].children.push(node); this.stack.push(node); this.tokenStack.push(token); node.position = { start: point(token.start) }; return node; } function closer(and) { return close; function close(token) { if (and) and.call(this, token); exit.call(this, token); } } function exit(token) { var node = this.stack.pop(); var open = this.tokenStack.pop(); if (!open) { throw new Error("Cannot close `" + token.type + "` (" + stringifyPosition({ start: token.start, end: token.end }) + "): it\u2019s not open"); } else if (open.type !== token.type) { throw new Error("Cannot close `" + token.type + "` (" + stringifyPosition({ start: token.start, end: token.end }) + "): a different token (`" + open.type + "`, " + stringifyPosition({ start: open.start, end: open.end }) + ") is open"); } node.position.end = point(token.end); return node; } function resume() { return toString(this.stack.pop()); } function onenterlistordered() { setData("expectingFirstListItemValue", true); } function onenterlistitemvalue(token) { if (getData("expectingFirstListItemValue")) { this.stack[this.stack.length - 2].start = parseInt(this.sliceSerialize(token), 10); setData("expectingFirstListItemValue"); } } function onexitcodefencedfenceinfo() { var data2 = this.resume(); this.stack[this.stack.length - 1].lang = data2; } function onexitcodefencedfencemeta() { var data2 = this.resume(); this.stack[this.stack.length - 1].meta = data2; } function onexitcodefencedfence() { if (getData("flowCodeInside")) return; this.buffer(); setData("flowCodeInside", true); } function onexitcodefenced() { var data2 = this.resume(); this.stack[this.stack.length - 1].value = data2.replace(/^(\r?\n|\r)|(\r?\n|\r)$/g, ""); setData("flowCodeInside"); } function onexitcodeindented() { var data2 = this.resume(); this.stack[this.stack.length - 1].value = data2; } function onexitdefinitionlabelstring(token) { var label = this.resume(); this.stack[this.stack.length - 1].label = label; this.stack[this.stack.length - 1].identifier = normalizeIdentifier(this.sliceSerialize(token)).toLowerCase(); } function onexitdefinitiontitlestring() { var data2 = this.resume(); this.stack[this.stack.length - 1].title = data2; } function onexitdefinitiondestinationstring() { var data2 = this.resume(); this.stack[this.stack.length - 1].url = data2; } function onexitatxheadingsequence(token) { if (!this.stack[this.stack.length - 1].depth) { this.stack[this.stack.length - 1].depth = this.sliceSerialize(token).length; } } function onexitsetextheadingtext() { setData("setextHeadingSlurpLineEnding", true); } function onexitsetextheadinglinesequence(token) { this.stack[this.stack.length - 1].depth = this.sliceSerialize(token).charCodeAt(0) === 61 ? 1 : 2; } function onexitsetextheading() { setData("setextHeadingSlurpLineEnding"); } function onenterdata(token) { var siblings = this.stack[this.stack.length - 1].children; var tail = siblings[siblings.length - 1]; if (!tail || tail.type !== "text") { tail = text(); tail.position = { start: point(token.start) }; this.stack[this.stack.length - 1].children.push(tail); } this.stack.push(tail); } function onexitdata(token) { var tail = this.stack.pop(); tail.value += this.sliceSerialize(token); tail.position.end = point(token.end); } function onexitlineending(token) { var context = this.stack[this.stack.length - 1]; if (getData("atHardBreak")) { context.children[context.children.length - 1].position.end = point(token.end); setData("atHardBreak"); return; } if (!getData("setextHeadingSlurpLineEnding") && config.canContainEols.indexOf(context.type) > -1) { onenterdata.call(this, token); onexitdata.call(this, token); } } function onexithardbreak() { setData("atHardBreak", true); } function onexithtmlflow() { var data2 = this.resume(); this.stack[this.stack.length - 1].value = data2; } function onexithtmltext() { var data2 = this.resume(); this.stack[this.stack.length - 1].value = data2; } function onexitcodetext() { var data2 = this.resume(); this.stack[this.stack.length - 1].value = data2; } function onexitlink() { var context = this.stack[this.stack.length - 1]; if (getData("inReference")) { context.type += "Reference"; context.referenceType = getData("referenceType") || "shortcut"; delete context.url; delete context.title; } else { delete context.identifier; delete context.label; delete context.referenceType; } setData("referenceType"); } function onexitimage() { var context = this.stack[this.stack.length - 1]; if (getData("inReference")) { context.type += "Reference"; context.referenceType = getData("referenceType") || "shortcut"; delete context.url; delete context.title; } else { delete context.identifier; delete context.label; delete context.referenceType; } setData("referenceType"); } function onexitlabeltext(token) { this.stack[this.stack.length - 2].identifier = normalizeIdentifier(this.sliceSerialize(token)).toLowerCase(); } function onexitlabel() { var fragment = this.stack[this.stack.length - 1]; var value = this.resume(); this.stack[this.stack.length - 1].label = value; setData("inReference", true); if (this.stack[this.stack.length - 1].type === "link") { this.stack[this.stack.length - 1].children = fragment.children; } else { this.stack[this.stack.length - 1].alt = value; } } function onexitresourcedestinationstring() { var data2 = this.resume(); this.stack[this.stack.length - 1].url = data2; } function onexitresourcetitlestring() { var data2 = this.resume(); this.stack[this.stack.length - 1].title = data2; } function onexitresource() { setData("inReference"); } function onenterreference() { setData("referenceType", "collapsed"); } function onexitreferencestring(token) { var label = this.resume(); this.stack[this.stack.length - 1].label = label; this.stack[this.stack.length - 1].identifier = normalizeIdentifier(this.sliceSerialize(token)).toLowerCase(); setData("referenceType", "full"); } function onexitcharacterreferencemarker(token) { setData("characterReferenceType", token.type); } function onexitcharacterreferencevalue(token) { var data2 = this.sliceSerialize(token); var type = getData("characterReferenceType"); var value; var tail; if (type) { value = safeFromInt(data2, type === "characterReferenceMarkerNumeric" ? 10 : 16); setData("characterReferenceType"); } else { value = decode(data2); } tail = this.stack.pop(); tail.value += value; tail.position.end = point(token.end); } function onexitautolinkprotocol(token) { onexitdata.call(this, token); this.stack[this.stack.length - 1].url = this.sliceSerialize(token); } function onexitautolinkemail(token) { onexitdata.call(this, token); this.stack[this.stack.length - 1].url = "mailto:" + this.sliceSerialize(token); } function blockQuote() { return { type: "blockquote", children: [] }; } function codeFlow() { return { type: "code", lang: null, meta: null, value: "" }; } function codeText() { return { type: "inlineCode", value: "" }; } function definition() { return { type: "definition", identifier: "", label: null, title: null, url: "" }; } function emphasis() { return { type: "emphasis", children: [] }; } function heading() { return { type: "heading", depth: void 0, children: [] }; } function hardBreak() { return { type: "break" }; } function html() { return { type: "html", value: "" }; } function image() { return { type: "image", title: null, url: "", alt: null }; } function link() { return { type: "link", title: null, url: "", children: [] }; } function list(token) { return { type: "list", ordered: token.type === "listOrdered", start: null, spread: token._spread, children: [] }; } function listItem(token) { return { type: "listItem", spread: token._spread, checked: null, children: [] }; } function paragraph() { return { type: "paragraph", children: [] }; } function strong() { return { type: "strong", children: [] }; } function text() { return { type: "text", value: "" }; } function thematicBreak() { return { type: "thematicBreak" }; } } function configure(config, extensions) { var index = -1; while (++index < extensions.length) { extension(config, extensions[index]); } return config; } function extension(config, extension2) { var key; var left; for (key in extension2) { left = own.call(config, key) ? config[key] : config[key] = {}; if (key === "canContainEols" || key === "transforms") { config[key] = [].concat(left, extension2[key]); } else { Object.assign(left, extension2[key]); } } } } }); // node_modules/mdast-util-from-markdown/index.js var require_mdast_util_from_markdown = __commonJS({ "node_modules/mdast-util-from-markdown/index.js"(exports, module2) { "use strict"; module2.exports = require_dist(); } }); // node_modules/remark-parse/index.js var require_remark_parse = __commonJS({ "node_modules/remark-parse/index.js"(exports, module2) { "use strict"; module2.exports = parse3; var fromMarkdown = require_mdast_util_from_markdown(); function parse3(options) { var self = this; this.Parser = parse4; function parse4(doc) { return fromMarkdown(doc, Object.assign({}, self.data("settings"), options, { extensions: self.data("micromarkExtensions") || [], mdastExtensions: self.data("fromMarkdownExtensions") || [] })); } } } }); // node_modules/@tryfabric/martian/build/src/notion/languageMap.json var require_languageMap = __commonJS({ "node_modules/@tryfabric/martian/build/src/notion/languageMap.json"(exports, module2) { module2.exports = { abap: "abap", sh: "shell", "shell-script": "shell", bash: "shell", zsh: "shell", text: "vb.net", c_cpp: "c++", clojure: "clojure", coffee: "coffeescript", "coffee-script": "coffeescript", cpp: "c++", csharp: "c#", cake: "c#", cakescript: "c#", css: "css", dart: "dart", diff: "diff", udiff: "diff", dockerfile: "docker", elixir: "elixir", elm: "elm", erlang: "erlang", fsharp: "f#", cucumber: "gherkin", glsl: "glsl", golang: "go", groovy: "groovy", haskell: "haskell", html: "html", xhtml: "html", java: "java/c/c++/c#", javascript: "javascript", js: "javascript", node: "javascript", json: "json", julia: "julia", tex: "latex", latex: "latex", less: "less", lisp: "webassembly", livescript: "livescript", "live-script": "livescript", ls: "livescript", lua: "lua", makefile: "makefile", bsdmake: "makefile", make: "makefile", mf: "makefile", markdown: "markdown", pandoc: "markdown", matlab: "matlab", octave: "matlab", nix: "nix", nixos: "nix", objectivec: "objective-c", "obj-c": "objective-c", objc: "objective-c", ocaml: "ocaml", pascal: "pascal", delphi: "pascal", objectpascal: "pascal", perl: "perl", cperl: "perl", php: "php", inc: "php", powershell: "powershell", posh: "powershell", pwsh: "powershell", prolog: "prolog", protobuf: "protobuf", "Protocol Buffers": "protobuf", python: "python", python3: "python", rusthon: "python", r: "r", R: "r", Rscript: "r", splus: "r", rust: "rust", ruby: "ruby", jruby: "ruby", macruby: "ruby", rake: "ruby", rb: "ruby", rbx: "ruby", rs: "rust", sass: "sass", scala: "scala", scheme: "scheme", scss: "scss", sql: "sql", typescript: "typescript", ts: "typescript", "visual basic": "vb.net", vbnet: "vb.net", "vb .net": "vb.net", "vb.net": "vb.net", verilog: "verilog", vhdl: "vhdl", wast: "webassembly", wasm: "webassembly", xml: "xml", rss: "xml", xsd: "xml", wsdl: "xml", yaml: "yaml", yml: "yaml" }; } }); // node_modules/@tryfabric/martian/build/src/notion/blocks.js var require_blocks = __commonJS({ "node_modules/@tryfabric/martian/build/src/notion/blocks.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.tableRow = exports.table = exports.toDo = exports.numberedListItem = exports.bulletedListItem = exports.headingThree = exports.headingTwo = exports.headingOne = exports.table_of_contents = exports.image = exports.blockquote = exports.code = exports.paragraph = void 0; function paragraph(text) { return { object: "block", type: "paragraph", paragraph: { rich_text: text } }; } exports.paragraph = paragraph; function code(text, lang = "plain text") { return { object: "block", type: "code", code: { rich_text: text, language: lang } }; } exports.code = code; function blockquote(text) { return { object: "block", type: "quote", quote: { rich_text: text } }; } exports.blockquote = blockquote; function image(url) { return { object: "block", type: "image", image: { type: "external", external: { url } } }; } exports.image = image; function table_of_contents() { return { object: "block", type: "table_of_contents", table_of_contents: {} }; } exports.table_of_contents = table_of_contents; function headingOne(text) { return { object: "block", type: "heading_1", heading_1: { rich_text: text } }; } exports.headingOne = headingOne; function headingTwo(text) { return { object: "block", type: "heading_2", heading_2: { rich_text: text } }; } exports.headingTwo = headingTwo; function headingThree(text) { return { object: "block", type: "heading_3", heading_3: { rich_text: text } }; } exports.headingThree = headingThree; function bulletedListItem(text, children = []) { return { object: "block", type: "bulleted_list_item", bulleted_list_item: { rich_text: text, children: children.length ? children : void 0 } }; } exports.bulletedListItem = bulletedListItem; function numberedListItem(text, children = []) { return { object: "block", type: "numbered_list_item", numbered_list_item: { rich_text: text, children: children.length ? children : void 0 } }; } exports.numberedListItem = numberedListItem; function toDo(checked, text, children = []) { return { object: "block", type: "to_do", to_do: { rich_text: text, checked, children: children.length ? children : void 0 } }; } exports.toDo = toDo; function table(children, tableWidth) { return { object: "block", type: "table", table: { table_width: tableWidth, has_row_header: true, children: (children === null || children === void 0 ? void 0 : children.length) ? children : [] } }; } exports.table = table; function tableRow(cells = []) { return { object: "block", type: "table_row", table_row: { cells: cells.length ? cells : [] } }; } exports.tableRow = tableRow; } }); // node_modules/@tryfabric/martian/build/src/notion/common.js var require_common = __commonJS({ "node_modules/@tryfabric/martian/build/src/notion/common.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isSupportedCodeLang = exports.SUPPORTED_CODE_BLOCK_LANGUAGES = exports.richText = exports.LIMITS = void 0; exports.LIMITS = { PAYLOAD_BLOCKS: 1e3, RICH_TEXT_ARRAYS: 100, RICH_TEXT: { TEXT_CONTENT: 2e3, LINK_URL: 1e3, EQUATION_EXPRESSION: 1e3 } }; function richText(content, options = {}) { var _a; const annotations = (_a = options.annotations) !== null && _a !== void 0 ? _a : {}; return { type: "text", annotations: __spreadValues({ bold: false, strikethrough: false, underline: false, italic: false, code: false, color: "default" }, annotations), text: { content, link: options.url ? { type: "url", url: options.url } : void 0 } }; } exports.richText = richText; exports.SUPPORTED_CODE_BLOCK_LANGUAGES = [ "abap", "arduino", "bash", "basic", "c", "clojure", "coffeescript", "c++", "c#", "css", "dart", "diff", "docker", "elixir", "elm", "erlang", "flow", "fortran", "f#", "gherkin", "glsl", "go", "graphql", "groovy", "haskell", "html", "java", "javascript", "json", "julia", "kotlin", "latex", "less", "lisp", "livescript", "lua", "makefile", "markdown", "markup", "matlab", "mermaid", "nix", "objective-c", "ocaml", "pascal", "perl", "php", "plain text", "powershell", "prolog", "protobuf", "python", "r", "reason", "ruby", "rust", "sass", "scala", "scheme", "scss", "shell", "sql", "swift", "typescript", "vb.net", "verilog", "vhdl", "visual basic", "webassembly", "xml", "yaml", "java/c/c++/c#" ]; function isSupportedCodeLang(lang) { return exports.SUPPORTED_CODE_BLOCK_LANGUAGES.includes(lang); } exports.isSupportedCodeLang = isSupportedCodeLang; } }); // node_modules/@tryfabric/martian/build/src/notion/index.js var require_notion = __commonJS({ "node_modules/@tryfabric/martian/build/src/notion/index.js"(exports) { "use strict"; var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { if (k2 === void 0) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); } : function(o, m, k, k2) { if (k2 === void 0) k2 = k; o[k2] = m[k]; }); var __exportStar = exports && exports.__exportStar || function(m, exports2) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports2, p)) __createBinding(exports2, m, p); }; var __importDefault = exports && exports.__importDefault || function(mod) { return mod && mod.__esModule ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseCodeLanguage = void 0; var languageMap_json_1 = __importDefault(require_languageMap()); __exportStar(require_blocks(), exports); __exportStar(require_common(), exports); function parseCodeLanguage(lang) { return lang ? languageMap_json_1.default[lang.toLowerCase()] : void 0; } exports.parseCodeLanguage = parseCodeLanguage; } }); // node_modules/@tryfabric/martian/build/src/parser/internal.js var require_internal = __commonJS({ "node_modules/@tryfabric/martian/build/src/parser/internal.js"(exports) { "use strict"; var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { if (k2 === void 0) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); } : function(o, m, k, k2) { if (k2 === void 0) k2 = k; o[k2] = m[k]; }); var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); } : function(o, v) { o["default"] = v; }); var __importStar = exports && exports.__importStar || function(mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) { for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); } __setModuleDefault(result, mod); return result; }; var __importDefault = exports && exports.__importDefault || function(mod) { return mod && mod.__esModule ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseRichText = exports.parseBlocks = void 0; var notion = __importStar(require_notion()); var path_1 = __importDefault(require("path")); var url_1 = require("url"); var notion_1 = require_notion(); function ensureLength(text, copy) { const chunks = text.match(/[^]{1,2000}/g) || []; return chunks.flatMap((item) => notion.richText(item, copy)); } function ensureCodeBlockLanguage(lang) { if (lang) { lang = lang.toLowerCase(); return (0, notion_1.isSupportedCodeLang)(lang) ? lang : notion.parseCodeLanguage(lang); } return void 0; } function parseInline(element, options) { var _a; const copy = { annotations: __spreadValues({}, (_a = options === null || options === void 0 ? void 0 : options.annotations) !== null && _a !== void 0 ? _a : {}), url: options === null || options === void 0 ? void 0 : options.url }; switch (element.type) { case "text": return ensureLength(element.value, copy); case "delete": copy.annotations.strikethrough = true; return element.children.flatMap((child) => parseInline(child, copy)); case "emphasis": copy.annotations.italic = true; return element.children.flatMap((child) => parseInline(child, copy)); case "strong": copy.annotations.bold = true; return element.children.flatMap((child) => parseInline(child, copy)); case "link": copy.url = element.url; return element.children.flatMap((child) => parseInline(child, copy)); case "inlineCode": copy.annotations.code = true; return [notion.richText(element.value, copy)]; default: return []; } } function parseImage(image, options) { var _a; const allowedTypes = [ ".png", ".jpg", ".jpeg", ".gif", ".tif", ".tiff", ".bmp", ".svg", ".heic" ]; function dealWithError() { return notion.paragraph([notion.richText(image.url)]); } try { if ((_a = options.strictImageUrls) !== null && _a !== void 0 ? _a : true) { const parsedUrl = new url_1.URL(image.url); const fileType = path_1.default.extname(parsedUrl.pathname); if (allowedTypes.includes(fileType)) { return notion.image(image.url); } else { return dealWithError(); } } else { return notion.image(image.url); } } catch (error) { return dealWithError(); } } function parseParagraph(element, options) { const mightBeToc = element.children.length > 2 && element.children[0].type === "text" && element.children[0].value === "[[" && element.children[1].type === "emphasis"; if (mightBeToc) { const emphasisItem = element.children[1]; const emphasisTextItem = emphasisItem.children[0]; if (emphasisTextItem.value === "TOC") { return [notion.table_of_contents()]; } } const images = []; const paragraphs = []; element.children.forEach((item) => { if (item.type === "image") { images.push(parseImage(item, options)); } else { const richText = parseInline(item); if (richText.length) { paragraphs.push(richText); } } }); if (paragraphs.length) { return [notion.paragraph(paragraphs.flat()), ...images]; } else { return images; } } function parseBlockquote(element, options) { const blocks = element.children.flatMap((child) => parseNode(child, options)); const paragraphs = blocks.flatMap((child) => child); const richtext = paragraphs.flatMap((child) => { if (child.type === "paragraph") { return child.paragraph.rich_text; } if (child.type === "heading_1") { return child.heading_1.rich_text; } if (child.type === "heading_2") { return child.heading_2.rich_text; } if (child.type === "heading_3") { return child.heading_3.rich_text; } return []; }); return notion.blockquote(richtext); } function parseHeading(element) { const text = element.children.flatMap((child) => parseInline(child)); switch (element.depth) { case 1: return notion.headingOne(text); case 2: return notion.headingTwo(text); default: return notion.headingThree(text); } } function parseCode(element) { const text = ensureLength(element.value); const lang = ensureCodeBlockLanguage(element.lang); return notion.code(text, lang); } function parseList(element, options) { return element.children.flatMap((item) => { const paragraph = item.children.shift(); if (paragraph === void 0 || paragraph.type !== "paragraph") { return []; } const text = paragraph.children.flatMap((child) => parseInline(child)); const parsedChildren = item.children.flatMap((child) => parseNode(child, options)); if (element.start !== null && element.start !== void 0) { return [notion.numberedListItem(text, parsedChildren)]; } else if (item.checked !== null && item.checked !== void 0) { return [notion.toDo(item.checked, text, parsedChildren)]; } else { return [notion.bulletedListItem(text, parsedChildren)]; } }); } function parseTableCell(node) { return [node.children.flatMap((child) => parseInline(child))]; } function parseTableRow(node) { const tableCells = node.children.flatMap((child) => parseTableCell(child)); return [notion.tableRow(tableCells)]; } function parseTable(node) { var _a; const tableWidth = ((_a = node.children) === null || _a === void 0 ? void 0 : _a.length) ? node.children[0].children.length : 0; const tableRows = node.children.flatMap((child) => parseTableRow(child)); return [notion.table(tableRows, tableWidth)]; } function parseNode(node, options) { switch (node.type) { case "heading": return [parseHeading(node)]; case "paragraph": return parseParagraph(node, options); case "code": return [parseCode(node)]; case "blockquote": return [parseBlockquote(node, options)]; case "list": return parseList(node, options); case "table": if (options.allowUnsupported) { return parseTable(node); } else { return []; } default: return []; } } function parseBlocks(root, options) { var _a, _b, _c, _d; const parsed = root.children.flatMap((item) => parseNode(item, options || {})); const truncate = !!((_b = (_a = options === null || options === void 0 ? void 0 : options.notionLimits) === null || _a === void 0 ? void 0 : _a.truncate) !== null && _b !== void 0 ? _b : true), limitCallback = (_d = (_c = options === null || options === void 0 ? void 0 : options.notionLimits) === null || _c === void 0 ? void 0 : _c.onError) !== null && _d !== void 0 ? _d : () => { }; if (parsed.length > notion_1.LIMITS.PAYLOAD_BLOCKS) limitCallback(new Error(`Resulting blocks array exceeds Notion limit (${notion_1.LIMITS.PAYLOAD_BLOCKS})`)); return truncate ? parsed.slice(0, notion_1.LIMITS.PAYLOAD_BLOCKS) : parsed; } exports.parseBlocks = parseBlocks; function parseRichText(root, options) { var _a, _b, _c, _d; if (root.children[0].type !== "paragraph") { throw new Error(`Unsupported markdown element: ${JSON.stringify(root)}`); } const richTexts = []; root.children.forEach((paragraph) => { if (paragraph.type === "paragraph") { paragraph.children.forEach((child) => richTexts.push(...parseInline(child))); } }); const truncate = !!((_b = (_a = options === null || options === void 0 ? void 0 : options.notionLimits) === null || _a === void 0 ? void 0 : _a.truncate) !== null && _b !== void 0 ? _b : true), limitCallback = (_d = (_c = options === null || options === void 0 ? void 0 : options.notionLimits) === null || _c === void 0 ? void 0 : _c.onError) !== null && _d !== void 0 ? _d : () => { }; if (richTexts.length > notion_1.LIMITS.RICH_TEXT_ARRAYS) limitCallback(new Error(`Resulting richTexts array exceeds Notion limit (${notion_1.LIMITS.RICH_TEXT_ARRAYS})`)); return (truncate ? richTexts.slice(0, notion_1.LIMITS.RICH_TEXT_ARRAYS) : richTexts).map((rt) => { var _a2; if (rt.type !== "text") return rt; if (rt.text.content.length > notion_1.LIMITS.RICH_TEXT.TEXT_CONTENT) { limitCallback(new Error(`Resulting text content exceeds Notion limit (${notion_1.LIMITS.RICH_TEXT.TEXT_CONTENT})`)); if (truncate) rt.text.content = rt.text.content.slice(0, notion_1.LIMITS.RICH_TEXT.TEXT_CONTENT - 3) + "..."; } if (((_a2 = rt.text.link) === null || _a2 === void 0 ? void 0 : _a2.url) && rt.text.link.url.length > notion_1.LIMITS.RICH_TEXT.LINK_URL) limitCallback(new Error(`Resulting text URL exceeds Notion limit (${notion_1.LIMITS.RICH_TEXT.LINK_URL})`)); return rt; }); } exports.parseRichText = parseRichText; } }); // node_modules/micromark-extension-gfm-autolink-literal/syntax.js var require_syntax = __commonJS({ "node_modules/micromark-extension-gfm-autolink-literal/syntax.js"(exports) { var asciiAlpha = require_ascii_alpha(); var asciiAlphanumeric = require_ascii_alphanumeric(); var asciiControl = require_ascii_control(); var markdownLineEnding = require_markdown_line_ending(); var unicodePunctuation = require_unicode_punctuation(); var unicodeWhitespace = require_unicode_whitespace(); var www = { tokenize: tokenizeWww, partial: true }; var domain = { tokenize: tokenizeDomain, partial: true }; var path = { tokenize: tokenizePath, partial: true }; var punctuation = { tokenize: tokenizePunctuation, partial: true }; var namedCharacterReference = { tokenize: tokenizeNamedCharacterReference, partial: true }; var wwwAutolink = { tokenize: tokenizeWwwAutolink, previous: previousWww }; var httpAutolink = { tokenize: tokenizeHttpAutolink, previous: previousHttp }; var emailAutolink = { tokenize: tokenizeEmailAutolink, previous: previousEmail }; var text = {}; exports.text = text; var code = 48; while (code < 123) { text[code] = emailAutolink; code++; if (code === 58) code = 65; else if (code === 91) code = 97; } text[43] = emailAutolink; text[45] = emailAutolink; text[46] = emailAutolink; text[95] = emailAutolink; text[72] = [emailAutolink, httpAutolink]; text[104] = [emailAutolink, httpAutolink]; text[87] = [emailAutolink, wwwAutolink]; text[119] = [emailAutolink, wwwAutolink]; function tokenizeEmailAutolink(effects, ok, nok) { var self = this; var hasDot; return start; function start(code2) { if (!gfmAtext(code2) || !previousEmail(self.previous) || previous(self.events)) { return nok(code2); } effects.enter("literalAutolink"); effects.enter("literalAutolinkEmail"); return atext(code2); } function atext(code2) { if (gfmAtext(code2)) { effects.consume(code2); return atext; } if (code2 === 64) { effects.consume(code2); return label; } return nok(code2); } function label(code2) { if (code2 === 46) { return effects.check(punctuation, done, dotContinuation)(code2); } if (code2 === 45 || code2 === 95) { return effects.check(punctuation, nok, dashOrUnderscoreContinuation)(code2); } if (asciiAlphanumeric(code2)) { effects.consume(code2); return label; } return done(code2); } function dotContinuation(code2) { effects.consume(code2); hasDot = true; return label; } function dashOrUnderscoreContinuation(code2) { effects.consume(code2); return afterDashOrUnderscore; } function afterDashOrUnderscore(code2) { if (code2 === 46) { return effects.check(punctuation, nok, dotContinuation)(code2); } return label(code2); } function done(code2) { if (hasDot) { effects.exit("literalAutolinkEmail"); effects.exit("literalAutolink"); return ok(code2); } return nok(code2); } } function tokenizeWwwAutolink(effects, ok, nok) { var self = this; return start; function start(code2) { if (code2 !== 87 && code2 - 32 !== 87 || !previousWww(self.previous) || previous(self.events)) { return nok(code2); } effects.enter("literalAutolink"); effects.enter("literalAutolinkWww"); return effects.check(www, effects.attempt(domain, effects.attempt(path, done), nok), nok)(code2); } function done(code2) { effects.exit("literalAutolinkWww"); effects.exit("literalAutolink"); return ok(code2); } } function tokenizeHttpAutolink(effects, ok, nok) { var self = this; return start; function start(code2) { if (code2 !== 72 && code2 - 32 !== 72 || !previousHttp(self.previous) || previous(self.events)) { return nok(code2); } effects.enter("literalAutolink"); effects.enter("literalAutolinkHttp"); effects.consume(code2); return t1; } function t1(code2) { if (code2 === 84 || code2 - 32 === 84) { effects.consume(code2); return t2; } return nok(code2); } function t2(code2) { if (code2 === 84 || code2 - 32 === 84) { effects.consume(code2); return p; } return nok(code2); } function p(code2) { if (code2 === 80 || code2 - 32 === 80) { effects.consume(code2); return s; } return nok(code2); } function s(code2) { if (code2 === 83 || code2 - 32 === 83) { effects.consume(code2); return colon; } return colon(code2); } function colon(code2) { if (code2 === 58) { effects.consume(code2); return slash1; } return nok(code2); } function slash1(code2) { if (code2 === 47) { effects.consume(code2); return slash2; } return nok(code2); } function slash2(code2) { if (code2 === 47) { effects.consume(code2); return after; } return nok(code2); } function after(code2) { return asciiControl(code2) || unicodeWhitespace(code2) || unicodePunctuation(code2) ? nok(code2) : effects.attempt(domain, effects.attempt(path, done), nok)(code2); } function done(code2) { effects.exit("literalAutolinkHttp"); effects.exit("literalAutolink"); return ok(code2); } } function tokenizeWww(effects, ok, nok) { return start; function start(code2) { effects.consume(code2); return w2; } function w2(code2) { if (code2 === 87 || code2 - 32 === 87) { effects.consume(code2); return w3; } return nok(code2); } function w3(code2) { if (code2 === 87 || code2 - 32 === 87) { effects.consume(code2); return dot; } return nok(code2); } function dot(code2) { if (code2 === 46) { effects.consume(code2); return after; } return nok(code2); } function after(code2) { return code2 === null || markdownLineEnding(code2) ? nok(code2) : ok(code2); } } function tokenizeDomain(effects, ok, nok) { var hasUnderscoreInLastSegment; var hasUnderscoreInLastLastSegment; return domain2; function domain2(code2) { if (code2 === 38) { return effects.check(namedCharacterReference, done, punctuationContinuation)(code2); } if (code2 === 46 || code2 === 95) { return effects.check(punctuation, done, punctuationContinuation)(code2); } if (asciiControl(code2) || unicodeWhitespace(code2) || code2 !== 45 && unicodePunctuation(code2)) { return done(code2); } effects.consume(code2); return domain2; } function punctuationContinuation(code2) { if (code2 === 46) { hasUnderscoreInLastLastSegment = hasUnderscoreInLastSegment; hasUnderscoreInLastSegment = void 0; effects.consume(code2); return domain2; } if (code2 === 95) hasUnderscoreInLastSegment = true; effects.consume(code2); return domain2; } function done(code2) { if (!hasUnderscoreInLastLastSegment && !hasUnderscoreInLastSegment) { return ok(code2); } return nok(code2); } } function tokenizePath(effects, ok) { var balance = 0; return inPath; function inPath(code2) { if (code2 === 38) { return effects.check(namedCharacterReference, ok, continuedPunctuation)(code2); } if (code2 === 40) { balance++; } if (code2 === 41) { return effects.check(punctuation, parenAtPathEnd, continuedPunctuation)(code2); } if (pathEnd(code2)) { return ok(code2); } if (trailingPunctuation(code2)) { return effects.check(punctuation, ok, continuedPunctuation)(code2); } effects.consume(code2); return inPath; } function continuedPunctuation(code2) { effects.consume(code2); return inPath; } function parenAtPathEnd(code2) { balance--; return balance < 0 ? ok(code2) : continuedPunctuation(code2); } } function tokenizeNamedCharacterReference(effects, ok, nok) { return start; function start(code2) { effects.consume(code2); return inside; } function inside(code2) { if (asciiAlpha(code2)) { effects.consume(code2); return inside; } if (code2 === 59) { effects.consume(code2); return after; } return nok(code2); } function after(code2) { return pathEnd(code2) ? ok(code2) : nok(code2); } } function tokenizePunctuation(effects, ok, nok) { return start; function start(code2) { effects.consume(code2); return after; } function after(code2) { if (trailingPunctuation(code2)) { effects.consume(code2); return after; } return pathEnd(code2) ? ok(code2) : nok(code2); } } function trailingPunctuation(code2) { return code2 === 33 || code2 === 34 || code2 === 39 || code2 === 41 || code2 === 42 || code2 === 44 || code2 === 46 || code2 === 58 || code2 === 59 || code2 === 60 || code2 === 63 || code2 === 95 || code2 === 126; } function pathEnd(code2) { return code2 === null || code2 < 0 || code2 === 32 || code2 === 60; } function gfmAtext(code2) { return code2 === 43 || code2 === 45 || code2 === 46 || code2 === 95 || asciiAlphanumeric(code2); } function previousWww(code2) { return code2 === null || code2 < 0 || code2 === 32 || code2 === 40 || code2 === 42 || code2 === 95 || code2 === 126; } function previousHttp(code2) { return code2 === null || !asciiAlpha(code2); } function previousEmail(code2) { return code2 !== 47 && previousHttp(code2); } function previous(events) { var index = events.length; while (index--) { if ((events[index][1].type === "labelLink" || events[index][1].type === "labelImage") && !events[index][1]._balanced) { return true; } } } } }); // node_modules/micromark-extension-gfm-autolink-literal/index.js var require_micromark_extension_gfm_autolink_literal = __commonJS({ "node_modules/micromark-extension-gfm-autolink-literal/index.js"(exports, module2) { module2.exports = require_syntax(); } }); // node_modules/micromark-extension-gfm-strikethrough/index.js var require_micromark_extension_gfm_strikethrough = __commonJS({ "node_modules/micromark-extension-gfm-strikethrough/index.js"(exports, module2) { module2.exports = create; var classifyCharacter = require_classify_character(); var chunkedSplice = require_chunked_splice(); var resolveAll = require_resolve_all(); var shallow = require_shallow(); function create(options) { var settings = options || {}; var single = settings.singleTilde; var tokenizer = { tokenize: tokenizeStrikethrough, resolveAll: resolveAllStrikethrough }; if (single === null || single === void 0) { single = true; } return { text: { 126: tokenizer }, insideSpan: { null: tokenizer } }; function resolveAllStrikethrough(events, context) { var index = -1; var strikethrough; var text; var open; var nextEvents; while (++index < events.length) { if (events[index][0] === "enter" && events[index][1].type === "strikethroughSequenceTemporary" && events[index][1]._close) { open = index; while (open--) { if (events[open][0] === "exit" && events[open][1].type === "strikethroughSequenceTemporary" && events[open][1]._open && events[index][1].end.offset - events[index][1].start.offset === events[open][1].end.offset - events[open][1].start.offset) { events[index][1].type = "strikethroughSequence"; events[open][1].type = "strikethroughSequence"; strikethrough = { type: "strikethrough", start: shallow(events[open][1].start), end: shallow(events[index][1].end) }; text = { type: "strikethroughText", start: shallow(events[open][1].end), end: shallow(events[index][1].start) }; nextEvents = [ ["enter", strikethrough, context], ["enter", events[open][1], context], ["exit", events[open][1], context], ["enter", text, context] ]; chunkedSplice(nextEvents, nextEvents.length, 0, resolveAll(context.parser.constructs.insideSpan.null, events.slice(open + 1, index), context)); chunkedSplice(nextEvents, nextEvents.length, 0, [ ["exit", text, context], ["enter", events[index][1], context], ["exit", events[index][1], context], ["exit", strikethrough, context] ]); chunkedSplice(events, open - 1, index - open + 3, nextEvents); index = open + nextEvents.length - 2; break; } } } } return removeRemainingSequences(events); } function removeRemainingSequences(events) { var index = -1; var length = events.length; while (++index < length) { if (events[index][1].type === "strikethroughSequenceTemporary") { events[index][1].type = "data"; } } return events; } function tokenizeStrikethrough(effects, ok, nok) { var previous = this.previous; var events = this.events; var size = 0; return start; function start(code) { if (code !== 126 || previous === 126 && events[events.length - 1][1].type !== "characterEscape") { return nok(code); } effects.enter("strikethroughSequenceTemporary"); return more(code); } function more(code) { var before = classifyCharacter(previous); var token; var after; if (code === 126) { if (size > 1) return nok(code); effects.consume(code); size++; return more; } if (size < 2 && !single) return nok(code); token = effects.exit("strikethroughSequenceTemporary"); after = classifyCharacter(code); token._open = !after || after === 2 && before; token._close = !before || before === 2 && after; return ok(code); } } } } }); // node_modules/micromark-extension-gfm-table/syntax.js var require_syntax2 = __commonJS({ "node_modules/micromark-extension-gfm-table/syntax.js"(exports) { exports.flow = { null: { tokenize: tokenizeTable, resolve: resolveTable, interruptible: true } }; var createSpace = require_factory_space(); var setextUnderlineMini = { tokenize: tokenizeSetextUnderlineMini, partial: true }; var nextPrefixedOrBlank = { tokenize: tokenizeNextPrefixedOrBlank, partial: true }; function resolveTable(events, context) { var length = events.length; var index = -1; var token; var inHead; var inDelimiterRow; var inRow; var cell; var content; var text; var contentStart; var contentEnd; var cellStart; while (++index < length) { token = events[index][1]; if (inRow) { if (token.type === "temporaryTableCellContent") { contentStart = contentStart || index; contentEnd = index; } if ((token.type === "tableCellDivider" || token.type === "tableRow") && contentEnd) { content = { type: "tableContent", start: events[contentStart][1].start, end: events[contentEnd][1].end }; text = { type: "chunkText", start: content.start, end: content.end, contentType: "text" }; events.splice(contentStart, contentEnd - contentStart + 1, ["enter", content, context], ["enter", text, context], ["exit", text, context], ["exit", content, context]); index -= contentEnd - contentStart - 3; length = events.length; contentStart = void 0; contentEnd = void 0; } } if (events[index][0] === "exit" && cellStart && cellStart + 1 < index && (token.type === "tableCellDivider" || token.type === "tableRow" && (cellStart + 3 < index || events[cellStart][1].type !== "whitespace"))) { cell = { type: inDelimiterRow ? "tableDelimiter" : inHead ? "tableHeader" : "tableData", start: events[cellStart][1].start, end: events[index][1].end }; events.splice(index + (token.type === "tableCellDivider" ? 1 : 0), 0, [ "exit", cell, context ]); events.splice(cellStart, 0, ["enter", cell, context]); index += 2; length = events.length; cellStart = index + 1; } if (token.type === "tableRow") { inRow = events[index][0] === "enter"; if (inRow) { cellStart = index + 1; } } if (token.type === "tableDelimiterRow") { inDelimiterRow = events[index][0] === "enter"; if (inDelimiterRow) { cellStart = index + 1; } } if (token.type === "tableHead") { inHead = events[index][0] === "enter"; } } return events; } function tokenizeTable(effects, ok, nok) { var align = []; var tableHeaderCount = 0; var seenDelimiter; var hasDash; return start; function start(code) { if (code === null || code === -5 || code === -4 || code === -3) { return nok(code); } effects.enter("table")._align = align; effects.enter("tableHead"); effects.enter("tableRow"); if (code === 124) { return cellDividerHead(code); } tableHeaderCount++; effects.enter("temporaryTableCellContent"); return inCellContentHead(code); } function cellDividerHead(code) { effects.enter("tableCellDivider"); effects.consume(code); effects.exit("tableCellDivider"); seenDelimiter = true; return cellBreakHead; } function cellBreakHead(code) { if (code === null || code === -5 || code === -4 || code === -3) { return atRowEndHead(code); } if (code === -2 || code === -1 || code === 32) { effects.enter("whitespace"); effects.consume(code); return inWhitespaceHead; } if (seenDelimiter) { seenDelimiter = void 0; tableHeaderCount++; } if (code === 124) { return cellDividerHead(code); } effects.enter("temporaryTableCellContent"); return inCellContentHead(code); } function inWhitespaceHead(code) { if (code === -2 || code === -1 || code === 32) { effects.consume(code); return inWhitespaceHead; } effects.exit("whitespace"); return cellBreakHead(code); } function inCellContentHead(code) { if (code === null || code < 0 || code === 32 || code === 124) { effects.exit("temporaryTableCellContent"); return cellBreakHead(code); } effects.consume(code); return code === 92 ? inCellContentEscapeHead : inCellContentHead; } function inCellContentEscapeHead(code) { if (code === 92 || code === 124) { effects.consume(code); return inCellContentHead; } return inCellContentHead(code); } function atRowEndHead(code) { if (code === null) { return nok(code); } effects.exit("tableRow"); effects.exit("tableHead"); effects.enter("lineEnding"); effects.consume(code); effects.exit("lineEnding"); return effects.check(setextUnderlineMini, nok, createSpace(effects, rowStartDelimiter, "linePrefix", 4)); } function rowStartDelimiter(code) { if (code === null || code < 0 || code === 32) { return nok(code); } effects.enter("tableDelimiterRow"); return atDelimiterRowBreak(code); } function atDelimiterRowBreak(code) { if (code === null || code === -5 || code === -4 || code === -3) { return rowEndDelimiter(code); } if (code === -2 || code === -1 || code === 32) { effects.enter("whitespace"); effects.consume(code); return inWhitespaceDelimiter; } if (code === 45) { effects.enter("tableDelimiterFiller"); effects.consume(code); hasDash = true; align.push(null); return inFillerDelimiter; } if (code === 58) { effects.enter("tableDelimiterAlignment"); effects.consume(code); effects.exit("tableDelimiterAlignment"); align.push("left"); return afterLeftAlignment; } if (code === 124) { effects.enter("tableCellDivider"); effects.consume(code); effects.exit("tableCellDivider"); return atDelimiterRowBreak; } return nok(code); } function inWhitespaceDelimiter(code) { if (code === -2 || code === -1 || code === 32) { effects.consume(code); return inWhitespaceDelimiter; } effects.exit("whitespace"); return atDelimiterRowBreak(code); } function inFillerDelimiter(code) { if (code === 45) { effects.consume(code); return inFillerDelimiter; } effects.exit("tableDelimiterFiller"); if (code === 58) { effects.enter("tableDelimiterAlignment"); effects.consume(code); effects.exit("tableDelimiterAlignment"); align[align.length - 1] = align[align.length - 1] === "left" ? "center" : "right"; return afterRightAlignment; } return atDelimiterRowBreak(code); } function afterLeftAlignment(code) { if (code === 45) { effects.enter("tableDelimiterFiller"); effects.consume(code); hasDash = true; return inFillerDelimiter; } return nok(code); } function afterRightAlignment(code) { if (code === null || code === -5 || code === -4 || code === -3) { return rowEndDelimiter(code); } if (code === -2 || code === -1 || code === 32) { effects.enter("whitespace"); effects.consume(code); return inWhitespaceDelimiter; } if (code === 124) { effects.enter("tableCellDivider"); effects.consume(code); effects.exit("tableCellDivider"); return atDelimiterRowBreak; } return nok(code); } function rowEndDelimiter(code) { effects.exit("tableDelimiterRow"); if (!hasDash || tableHeaderCount !== align.length) { return nok(code); } if (code === null) { return tableClose(code); } return effects.check(nextPrefixedOrBlank, tableClose, tableContinue)(code); } function tableClose(code) { effects.exit("table"); return ok(code); } function tableContinue(code) { effects.enter("lineEnding"); effects.consume(code); effects.exit("lineEnding"); return createSpace(effects, bodyStart, "linePrefix", 4); } function bodyStart(code) { effects.enter("tableBody"); return rowStartBody(code); } function rowStartBody(code) { effects.enter("tableRow"); if (code === 124) { return cellDividerBody(code); } effects.enter("temporaryTableCellContent"); return inCellContentBody(code); } function cellDividerBody(code) { effects.enter("tableCellDivider"); effects.consume(code); effects.exit("tableCellDivider"); return cellBreakBody; } function cellBreakBody(code) { if (code === null || code === -5 || code === -4 || code === -3) { return atRowEndBody(code); } if (code === -2 || code === -1 || code === 32) { effects.enter("whitespace"); effects.consume(code); return inWhitespaceBody; } if (code === 124) { return cellDividerBody(code); } effects.enter("temporaryTableCellContent"); return inCellContentBody(code); } function inWhitespaceBody(code) { if (code === -2 || code === -1 || code === 32) { effects.consume(code); return inWhitespaceBody; } effects.exit("whitespace"); return cellBreakBody(code); } function inCellContentBody(code) { if (code === null || code < 0 || code === 32 || code === 124) { effects.exit("temporaryTableCellContent"); return cellBreakBody(code); } effects.consume(code); return code === 92 ? inCellContentEscapeBody : inCellContentBody; } function inCellContentEscapeBody(code) { if (code === 92 || code === 124) { effects.consume(code); return inCellContentBody; } return inCellContentBody(code); } function atRowEndBody(code) { effects.exit("tableRow"); if (code === null) { return tableBodyClose(code); } return effects.check(nextPrefixedOrBlank, tableBodyClose, tableBodyContinue)(code); } function tableBodyClose(code) { effects.exit("tableBody"); return tableClose(code); } function tableBodyContinue(code) { effects.enter("lineEnding"); effects.consume(code); effects.exit("lineEnding"); return createSpace(effects, rowStartBody, "linePrefix", 4); } } function tokenizeSetextUnderlineMini(effects, ok, nok) { return start; function start(code) { if (code !== 45) { return nok(code); } effects.enter("setextUnderline"); return sequence(code); } function sequence(code) { if (code === 45) { effects.consume(code); return sequence; } return whitespace(code); } function whitespace(code) { if (code === -2 || code === -1 || code === 32) { effects.consume(code); return whitespace; } if (code === null || code === -5 || code === -4 || code === -3) { return ok(code); } return nok(code); } } function tokenizeNextPrefixedOrBlank(effects, ok, nok) { var size = 0; return start; function start(code) { effects.enter("check"); effects.consume(code); return whitespace; } function whitespace(code) { if (code === -1 || code === 32) { effects.consume(code); size++; return size === 4 ? ok : whitespace; } if (code === null || code < 0) { return ok(code); } return nok(code); } } } }); // node_modules/micromark-extension-gfm-table/index.js var require_micromark_extension_gfm_table = __commonJS({ "node_modules/micromark-extension-gfm-table/index.js"(exports, module2) { module2.exports = require_syntax2(); } }); // node_modules/micromark-extension-gfm-task-list-item/syntax.js var require_syntax3 = __commonJS({ "node_modules/micromark-extension-gfm-task-list-item/syntax.js"(exports) { var markdownLineEndingOrSpace = require_markdown_line_ending_or_space(); var spaceFactory = require_factory_space(); var prefixSize = require_prefix_size(); var tasklistCheck = { tokenize: tokenizeTasklistCheck }; exports.text = { 91: tasklistCheck }; function tokenizeTasklistCheck(effects, ok, nok) { var self = this; return open; function open(code) { if (code !== 91 || self.previous !== null || !self._gfmTasklistFirstContentOfListItem) { return nok(code); } effects.enter("taskListCheck"); effects.enter("taskListCheckMarker"); effects.consume(code); effects.exit("taskListCheckMarker"); return inside; } function inside(code) { if (code === -2 || code === 32) { effects.enter("taskListCheckValueUnchecked"); effects.consume(code); effects.exit("taskListCheckValueUnchecked"); return close; } if (code === 88 || code === 120) { effects.enter("taskListCheckValueChecked"); effects.consume(code); effects.exit("taskListCheckValueChecked"); return close; } return nok(code); } function close(code) { if (code === 93) { effects.enter("taskListCheckMarker"); effects.consume(code); effects.exit("taskListCheckMarker"); effects.exit("taskListCheck"); return effects.check({ tokenize: spaceThenNonSpace }, ok, nok); } return nok(code); } } function spaceThenNonSpace(effects, ok, nok) { var self = this; return spaceFactory(effects, after, "whitespace"); function after(code) { return prefixSize(self.events, "whitespace") && code !== null && !markdownLineEndingOrSpace(code) ? ok(code) : nok(code); } } } }); // node_modules/micromark-extension-gfm-task-list-item/index.js var require_micromark_extension_gfm_task_list_item = __commonJS({ "node_modules/micromark-extension-gfm-task-list-item/index.js"(exports, module2) { module2.exports = require_syntax3(); } }); // node_modules/micromark-extension-gfm/syntax.js var require_syntax4 = __commonJS({ "node_modules/micromark-extension-gfm/syntax.js"(exports, module2) { var combine = require_combine_extensions(); var autolink = require_micromark_extension_gfm_autolink_literal(); var strikethrough = require_micromark_extension_gfm_strikethrough(); var table = require_micromark_extension_gfm_table(); var tasklist = require_micromark_extension_gfm_task_list_item(); module2.exports = create; function create(options) { return combine([autolink, strikethrough(options), table, tasklist]); } } }); // node_modules/micromark-extension-gfm/index.js var require_micromark_extension_gfm = __commonJS({ "node_modules/micromark-extension-gfm/index.js"(exports, module2) { module2.exports = require_syntax4(); } }); // node_modules/ccount/index.js var require_ccount = __commonJS({ "node_modules/ccount/index.js"(exports, module2) { "use strict"; module2.exports = ccount; function ccount(source, character) { var value = String(source); var count = 0; var index; if (typeof character !== "string") { throw new Error("Expected character"); } index = value.indexOf(character); while (index !== -1) { count++; index = value.indexOf(character, index + character.length); } return count; } } }); // node_modules/unist-util-is/convert.js var require_convert = __commonJS({ "node_modules/unist-util-is/convert.js"(exports, module2) { "use strict"; module2.exports = convert; function convert(test) { if (test == null) { return ok; } if (typeof test === "string") { return typeFactory(test); } if (typeof test === "object") { return "length" in test ? anyFactory(test) : allFactory(test); } if (typeof test === "function") { return test; } throw new Error("Expected function, string, or object as test"); } function allFactory(test) { return all; function all(node) { var key; for (key in test) { if (node[key] !== test[key]) return false; } return true; } } function anyFactory(tests) { var checks = []; var index = -1; while (++index < tests.length) { checks[index] = convert(tests[index]); } return any; function any() { var index2 = -1; while (++index2 < checks.length) { if (checks[index2].apply(this, arguments)) { return true; } } return false; } } function typeFactory(test) { return type; function type(node) { return Boolean(node && node.type === test); } } function ok() { return true; } } }); // node_modules/unist-util-visit-parents/color.browser.js var require_color_browser = __commonJS({ "node_modules/unist-util-visit-parents/color.browser.js"(exports, module2) { module2.exports = identity; function identity(d) { return d; } } }); // node_modules/unist-util-visit-parents/index.js var require_unist_util_visit_parents = __commonJS({ "node_modules/unist-util-visit-parents/index.js"(exports, module2) { "use strict"; module2.exports = visitParents; var convert = require_convert(); var color = require_color_browser(); var CONTINUE = true; var SKIP3 = "skip"; var EXIT = false; visitParents.CONTINUE = CONTINUE; visitParents.SKIP = SKIP3; visitParents.EXIT = EXIT; function visitParents(tree, test, visitor, reverse) { var step; var is; if (typeof test === "function" && typeof visitor !== "function") { reverse = visitor; visitor = test; test = null; } is = convert(test); step = reverse ? -1 : 1; factory(tree, null, [])(); function factory(node, index, parents) { var value = typeof node === "object" && node !== null ? node : {}; var name; if (typeof value.type === "string") { name = typeof value.tagName === "string" ? value.tagName : typeof value.name === "string" ? value.name : void 0; visit3.displayName = "node (" + color(value.type + (name ? "<" + name + ">" : "")) + ")"; } return visit3; function visit3() { var grandparents = parents.concat(node); var result = []; var subresult; var offset; if (!test || is(node, index, parents[parents.length - 1] || null)) { result = toResult(visitor(node, parents)); if (result[0] === EXIT) { return result; } } if (node.children && result[0] !== SKIP3) { offset = (reverse ? node.children.length : -1) + step; while (offset > -1 && offset < node.children.length) { subresult = factory(node.children[offset], offset, grandparents)(); if (subresult[0] === EXIT) { return subresult; } offset = typeof subresult[1] === "number" ? subresult[1] : offset + step; } } return result; } } } function toResult(value) { if (value !== null && typeof value === "object" && "length" in value) { return value; } if (typeof value === "number") { return [CONTINUE, value]; } return [value]; } } }); // node_modules/escape-string-regexp/index.js var require_escape_string_regexp = __commonJS({ "node_modules/escape-string-regexp/index.js"(exports, module2) { "use strict"; module2.exports = (string2) => { if (typeof string2 !== "string") { throw new TypeError("Expected a string"); } return string2.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d"); }; } }); // node_modules/mdast-util-find-and-replace/index.js var require_mdast_util_find_and_replace = __commonJS({ "node_modules/mdast-util-find-and-replace/index.js"(exports, module2) { "use strict"; module2.exports = findAndReplace; var visit3 = require_unist_util_visit_parents(); var convert = require_convert(); var escape = require_escape_string_regexp(); var splice = [].splice; function findAndReplace(tree, find, replace, options) { var settings; var schema4; if (typeof find === "string" || find && typeof find.exec === "function") { schema4 = [[find, replace]]; } else { schema4 = find; options = replace; } settings = options || {}; search(tree, settings, handlerFactory(toPairs(schema4))); return tree; function handlerFactory(pairs2) { var pair = pairs2[0]; return handler; function handler(node, parent) { var find2 = pair[0]; var replace2 = pair[1]; var nodes = []; var start = 0; var index = parent.children.indexOf(node); var position; var match; var subhandler; var value; find2.lastIndex = 0; match = find2.exec(node.value); while (match) { position = match.index; value = replace2.apply(null, [].concat(match, { index: match.index, input: match.input })); if (value !== false) { if (start !== position) { nodes.push({ type: "text", value: node.value.slice(start, position) }); } if (typeof value === "string" && value.length > 0) { value = { type: "text", value }; } if (value) { nodes = [].concat(nodes, value); } start = position + match[0].length; } if (!find2.global) { break; } match = find2.exec(node.value); } if (position === void 0) { nodes = [node]; index--; } else { if (start < node.value.length) { nodes.push({ type: "text", value: node.value.slice(start) }); } nodes.unshift(index, 1); splice.apply(parent.children, nodes); } if (pairs2.length > 1) { subhandler = handlerFactory(pairs2.slice(1)); position = -1; while (++position < nodes.length) { node = nodes[position]; if (node.type === "text") { subhandler(node, parent); } else { search(node, settings, subhandler); } } } return index + nodes.length + 1; } } } function search(tree, settings, handler) { var ignored = convert(settings.ignore || []); var result = []; visit3(tree, "text", visitor); return result; function visitor(node, parents) { var index = -1; var parent; var grandparent; while (++index < parents.length) { parent = parents[index]; if (ignored(parent, grandparent ? grandparent.children.indexOf(parent) : void 0, grandparent)) { return; } grandparent = parent; } return handler(node, grandparent); } } function toPairs(schema4) { var result = []; var key; var index; if (typeof schema4 !== "object") { throw new Error("Expected array or object as schema"); } if ("length" in schema4) { index = -1; while (++index < schema4.length) { result.push([ toExpression(schema4[index][0]), toFunction(schema4[index][1]) ]); } } else { for (key in schema4) { result.push([toExpression(key), toFunction(schema4[key])]); } } return result; } function toExpression(find) { return typeof find === "string" ? new RegExp(escape(find), "g") : find; } function toFunction(replace) { return typeof replace === "function" ? replace : returner; function returner() { return replace; } } } }); // node_modules/mdast-util-gfm-autolink-literal/from-markdown.js var require_from_markdown = __commonJS({ "node_modules/mdast-util-gfm-autolink-literal/from-markdown.js"(exports) { var ccount = require_ccount(); var findAndReplace = require_mdast_util_find_and_replace(); var unicodePunctuation = require_unicode_punctuation(); var unicodeWhitespace = require_unicode_whitespace(); exports.transforms = [transformGfmAutolinkLiterals]; exports.enter = { literalAutolink: enterLiteralAutolink, literalAutolinkEmail: enterLiteralAutolinkValue, literalAutolinkHttp: enterLiteralAutolinkValue, literalAutolinkWww: enterLiteralAutolinkValue }; exports.exit = { literalAutolink: exitLiteralAutolink, literalAutolinkEmail: exitLiteralAutolinkEmail, literalAutolinkHttp: exitLiteralAutolinkHttp, literalAutolinkWww: exitLiteralAutolinkWww }; function enterLiteralAutolink(token) { this.enter({ type: "link", title: null, url: "", children: [] }, token); } function enterLiteralAutolinkValue(token) { this.config.enter.autolinkProtocol.call(this, token); } function exitLiteralAutolinkHttp(token) { this.config.exit.autolinkProtocol.call(this, token); } function exitLiteralAutolinkWww(token) { this.config.exit.data.call(this, token); this.stack[this.stack.length - 1].url = "http://" + this.sliceSerialize(token); } function exitLiteralAutolinkEmail(token) { this.config.exit.autolinkEmail.call(this, token); } function exitLiteralAutolink(token) { this.exit(token); } function transformGfmAutolinkLiterals(tree) { findAndReplace(tree, [ [/(https?:\/\/|www(?=\.))([-.\w]+)([^ \t\r\n]*)/i, findUrl], [/([-.\w+]+)@([-\w]+(?:\.[-\w]+)+)/, findEmail] ], { ignore: ["link", "linkReference"] }); } function findUrl($0, protocol, domain, path, match) { var prefix = ""; var parts; var result; if (!previous(match)) { return false; } if (/^w/i.test(protocol)) { domain = protocol + domain; protocol = ""; prefix = "http://"; } if (!isCorrectDomain(domain)) { return false; } parts = splitUrl(domain + path); if (!parts[0]) return false; result = { type: "link", title: null, url: prefix + protocol + parts[0], children: [{ type: "text", value: protocol + parts[0] }] }; if (parts[1]) { result = [result, { type: "text", value: parts[1] }]; } return result; } function findEmail($0, atext, label, match) { if (!previous(match, true) || /[_-]$/.test(label)) { return false; } return { type: "link", title: null, url: "mailto:" + atext + "@" + label, children: [{ type: "text", value: atext + "@" + label }] }; } function isCorrectDomain(domain) { var parts = domain.split("."); if (parts.length < 2 || parts[parts.length - 1] && (/_/.test(parts[parts.length - 1]) || !/[a-zA-Z\d]/.test(parts[parts.length - 1])) || parts[parts.length - 2] && (/_/.test(parts[parts.length - 2]) || !/[a-zA-Z\d]/.test(parts[parts.length - 2]))) { return false; } return true; } function splitUrl(url) { var trail = /[!"&'),.:;<>?\]}]+$/.exec(url); var closingParenIndex; var openingParens; var closingParens; if (trail) { url = url.slice(0, trail.index); trail = trail[0]; closingParenIndex = trail.indexOf(")"); openingParens = ccount(url, "("); closingParens = ccount(url, ")"); while (closingParenIndex !== -1 && openingParens > closingParens) { url += trail.slice(0, closingParenIndex + 1); trail = trail.slice(closingParenIndex + 1); closingParenIndex = trail.indexOf(")"); closingParens++; } } return [url, trail]; } function previous(match, email) { var code = match.input.charCodeAt(match.index - 1); return (code !== code || unicodeWhitespace(code) || unicodePunctuation(code)) && (!email || code !== 47); } } }); // node_modules/mdast-util-gfm-strikethrough/from-markdown.js var require_from_markdown2 = __commonJS({ "node_modules/mdast-util-gfm-strikethrough/from-markdown.js"(exports) { exports.canContainEols = ["delete"]; exports.enter = { strikethrough: enterStrikethrough }; exports.exit = { strikethrough: exitStrikethrough }; function enterStrikethrough(token) { this.enter({ type: "delete", children: [] }, token); } function exitStrikethrough(token) { this.exit(token); } } }); // node_modules/mdast-util-gfm-table/from-markdown.js var require_from_markdown3 = __commonJS({ "node_modules/mdast-util-gfm-table/from-markdown.js"(exports) { exports.enter = { table: enterTable, tableData: enterCell, tableHeader: enterCell, tableRow: enterRow }; exports.exit = { codeText: exitCodeText, table: exitTable, tableData: exit, tableHeader: exit, tableRow: exit }; function enterTable(token) { this.enter({ type: "table", align: token._align, children: [] }, token); this.setData("inTable", true); } function exitTable(token) { this.exit(token); this.setData("inTable"); } function enterRow(token) { this.enter({ type: "tableRow", children: [] }, token); } function exit(token) { this.exit(token); } function enterCell(token) { this.enter({ type: "tableCell", children: [] }, token); } function exitCodeText(token) { var value = this.resume(); if (this.getData("inTable")) { value = value.replace(/\\([\\|])/g, replace); } this.stack[this.stack.length - 1].value = value; this.exit(token); } function replace($0, $1) { return $1 === "|" ? $1 : $0; } } }); // node_modules/mdast-util-gfm-task-list-item/from-markdown.js var require_from_markdown4 = __commonJS({ "node_modules/mdast-util-gfm-task-list-item/from-markdown.js"(exports) { exports.exit = { taskListCheckValueChecked: exitCheck, taskListCheckValueUnchecked: exitCheck, paragraph: exitParagraphWithTaskListItem }; function exitCheck(token) { this.stack[this.stack.length - 2].checked = token.type === "taskListCheckValueChecked"; } function exitParagraphWithTaskListItem(token) { var parent = this.stack[this.stack.length - 2]; var node = this.stack[this.stack.length - 1]; var siblings = parent.children; var head = node.children[0]; var index = -1; var firstParaghraph; if (parent && parent.type === "listItem" && typeof parent.checked === "boolean" && head && head.type === "text") { while (++index < siblings.length) { if (siblings[index].type === "paragraph") { firstParaghraph = siblings[index]; break; } } if (firstParaghraph === node) { head.value = head.value.slice(1); if (head.value.length === 0) { node.children.shift(); } else { head.position.start.column++; head.position.start.offset++; node.position.start = Object.assign({}, head.position.start); } } } this.exit(token); } } }); // node_modules/mdast-util-gfm/from-markdown.js var require_from_markdown5 = __commonJS({ "node_modules/mdast-util-gfm/from-markdown.js"(exports, module2) { var autolinkLiteral = require_from_markdown(); var strikethrough = require_from_markdown2(); var table = require_from_markdown3(); var taskListItem = require_from_markdown4(); var own = {}.hasOwnProperty; module2.exports = configure([ autolinkLiteral, strikethrough, table, taskListItem ]); function configure(extensions) { var config = { transforms: [], canContainEols: [] }; var length = extensions.length; var index = -1; while (++index < length) { extension(config, extensions[index]); } return config; } function extension(config, extension2) { var key; var left; var right; for (key in extension2) { left = own.call(config, key) ? config[key] : config[key] = {}; right = extension2[key]; if (key === "canContainEols" || key === "transforms") { config[key] = [].concat(left, right); } else { Object.assign(left, right); } } } } }); // node_modules/mdast-util-gfm-autolink-literal/to-markdown.js var require_to_markdown = __commonJS({ "node_modules/mdast-util-gfm-autolink-literal/to-markdown.js"(exports) { var inConstruct = "phrasing"; var notInConstruct = ["autolink", "link", "image", "label"]; exports.unsafe = [ { character: "@", before: "[+\\-.\\w]", after: "[\\-.\\w]", inConstruct, notInConstruct }, { character: ".", before: "[Ww]", after: "[\\-.\\w]", inConstruct, notInConstruct }, { character: ":", before: "[ps]", after: "\\/", inConstruct, notInConstruct } ]; } }); // node_modules/mdast-util-to-markdown/lib/util/container-phrasing.js var require_container_phrasing = __commonJS({ "node_modules/mdast-util-to-markdown/lib/util/container-phrasing.js"(exports, module2) { module2.exports = phrasing; function phrasing(parent, context, safeOptions) { var children = parent.children || []; var results = []; var index = -1; var before = safeOptions.before; var after; var handle; var child; while (++index < children.length) { child = children[index]; if (index + 1 < children.length) { handle = context.handle.handlers[children[index + 1].type]; if (handle && handle.peek) handle = handle.peek; after = handle ? handle(children[index + 1], parent, context, { before: "", after: "" }).charAt(0) : ""; } else { after = safeOptions.after; } if (results.length > 0 && (before === "\r" || before === "\n") && child.type === "html") { results[results.length - 1] = results[results.length - 1].replace(/(\r?\n|\r)$/, " "); before = " "; } results.push(context.handle(child, parent, context, { before, after })); before = results[results.length - 1].slice(-1); } return results.join(""); } } }); // node_modules/mdast-util-gfm-strikethrough/to-markdown.js var require_to_markdown2 = __commonJS({ "node_modules/mdast-util-gfm-strikethrough/to-markdown.js"(exports) { var phrasing = require_container_phrasing(); exports.unsafe = [{ character: "~", inConstruct: "phrasing" }]; exports.handlers = { delete: handleDelete }; handleDelete.peek = peekDelete; function handleDelete(node, _, context) { var exit = context.enter("emphasis"); var value = phrasing(node, context, { before: "~", after: "~" }); exit(); return "~~" + value + "~~"; } function peekDelete() { return "~"; } } }); // node_modules/mdast-util-to-markdown/lib/util/pattern-compile.js var require_pattern_compile = __commonJS({ "node_modules/mdast-util-to-markdown/lib/util/pattern-compile.js"(exports, module2) { module2.exports = patternCompile; function patternCompile(pattern) { var before; var after; if (!pattern._compiled) { before = pattern.before ? "(?:" + pattern.before + ")" : ""; after = pattern.after ? "(?:" + pattern.after + ")" : ""; if (pattern.atBreak) { before = "[\\r\\n][\\t ]*" + before; } pattern._compiled = new RegExp((before ? "(" + before + ")" : "") + (/[|\\{}()[\]^$+*?.-]/.test(pattern.character) ? "\\" : "") + pattern.character + (after || ""), "g"); } return pattern._compiled; } } }); // node_modules/mdast-util-to-markdown/lib/handle/inline-code.js var require_inline_code = __commonJS({ "node_modules/mdast-util-to-markdown/lib/handle/inline-code.js"(exports, module2) { module2.exports = inlineCode; inlineCode.peek = inlineCodePeek; var patternCompile = require_pattern_compile(); function inlineCode(node, parent, context) { var value = node.value || ""; var sequence = "`"; var index = -1; var pattern; var expression; var match; var position; while (new RegExp("(^|[^`])" + sequence + "([^`]|$)").test(value)) { sequence += "`"; } if (/[^ \r\n]/.test(value) && (/[ \r\n`]/.test(value.charAt(0)) || /[ \r\n`]/.test(value.charAt(value.length - 1)))) { value = " " + value + " "; } while (++index < context.unsafe.length) { pattern = context.unsafe[index]; if (!pattern.atBreak) continue; expression = patternCompile(pattern); while (match = expression.exec(value)) { position = match.index; if (value.charCodeAt(position) === 10 && value.charCodeAt(position - 1) === 13) { position--; } value = value.slice(0, position) + " " + value.slice(match.index + 1); } } return sequence + value + sequence; } function inlineCodePeek() { return "`"; } } }); // node_modules/repeat-string/index.js var require_repeat_string = __commonJS({ "node_modules/repeat-string/index.js"(exports, module2) { "use strict"; var res = ""; var cache; module2.exports = repeat; function repeat(str, num) { if (typeof str !== "string") { throw new TypeError("expected a string"); } if (num === 1) return str; if (num === 2) return str + str; var max = str.length * num; if (cache !== str || typeof cache === "undefined") { cache = str; res = ""; } else if (res.length >= max) { return res.substr(0, max); } while (max > res.length && num > 1) { if (num & 1) { res += str; } num >>= 1; str += str; } res += str; res = res.substr(0, max); return res; } } }); // node_modules/markdown-table/index.js var require_markdown_table = __commonJS({ "node_modules/markdown-table/index.js"(exports, module2) { "use strict"; var repeat = require_repeat_string(); module2.exports = markdownTable; var trailingWhitespace = / +$/; var space = " "; var lineFeed = "\n"; var dash = "-"; var colon = ":"; var verticalBar = "|"; var x = 0; var C = 67; var L = 76; var R = 82; var c = 99; var l = 108; var r = 114; function markdownTable(table, options) { var settings = options || {}; var padding = settings.padding !== false; var start = settings.delimiterStart !== false; var end = settings.delimiterEnd !== false; var align = (settings.align || []).concat(); var alignDelimiters = settings.alignDelimiters !== false; var alignments = []; var stringLength = settings.stringLength || defaultStringLength; var rowIndex = -1; var rowLength = table.length; var cellMatrix = []; var sizeMatrix = []; var row = []; var sizes = []; var longestCellByColumn = []; var mostCellsPerRow = 0; var cells; var columnIndex; var columnLength; var largest; var size; var cell; var lines; var line; var before; var after; var code; while (++rowIndex < rowLength) { cells = table[rowIndex]; columnIndex = -1; columnLength = cells.length; row = []; sizes = []; if (columnLength > mostCellsPerRow) { mostCellsPerRow = columnLength; } while (++columnIndex < columnLength) { cell = serialize(cells[columnIndex]); if (alignDelimiters === true) { size = stringLength(cell); sizes[columnIndex] = size; largest = longestCellByColumn[columnIndex]; if (largest === void 0 || size > largest) { longestCellByColumn[columnIndex] = size; } } row.push(cell); } cellMatrix[rowIndex] = row; sizeMatrix[rowIndex] = sizes; } columnIndex = -1; columnLength = mostCellsPerRow; if (typeof align === "object" && "length" in align) { while (++columnIndex < columnLength) { alignments[columnIndex] = toAlignment(align[columnIndex]); } } else { code = toAlignment(align); while (++columnIndex < columnLength) { alignments[columnIndex] = code; } } columnIndex = -1; columnLength = mostCellsPerRow; row = []; sizes = []; while (++columnIndex < columnLength) { code = alignments[columnIndex]; before = ""; after = ""; if (code === l) { before = colon; } else if (code === r) { after = colon; } else if (code === c) { before = colon; after = colon; } size = alignDelimiters ? Math.max(1, longestCellByColumn[columnIndex] - before.length - after.length) : 1; cell = before + repeat(dash, size) + after; if (alignDelimiters === true) { size = before.length + size + after.length; if (size > longestCellByColumn[columnIndex]) { longestCellByColumn[columnIndex] = size; } sizes[columnIndex] = size; } row[columnIndex] = cell; } cellMatrix.splice(1, 0, row); sizeMatrix.splice(1, 0, sizes); rowIndex = -1; rowLength = cellMatrix.length; lines = []; while (++rowIndex < rowLength) { row = cellMatrix[rowIndex]; sizes = sizeMatrix[rowIndex]; columnIndex = -1; columnLength = mostCellsPerRow; line = []; while (++columnIndex < columnLength) { cell = row[columnIndex] || ""; before = ""; after = ""; if (alignDelimiters === true) { size = longestCellByColumn[columnIndex] - (sizes[columnIndex] || 0); code = alignments[columnIndex]; if (code === r) { before = repeat(space, size); } else if (code === c) { if (size % 2 === 0) { before = repeat(space, size / 2); after = before; } else { before = repeat(space, size / 2 + 0.5); after = repeat(space, size / 2 - 0.5); } } else { after = repeat(space, size); } } if (start === true && columnIndex === 0) { line.push(verticalBar); } if (padding === true && !(alignDelimiters === false && cell === "") && (start === true || columnIndex !== 0)) { line.push(space); } if (alignDelimiters === true) { line.push(before); } line.push(cell); if (alignDelimiters === true) { line.push(after); } if (padding === true) { line.push(space); } if (end === true || columnIndex !== columnLength - 1) { line.push(verticalBar); } } line = line.join(""); if (end === false) { line = line.replace(trailingWhitespace, ""); } lines.push(line); } return lines.join(lineFeed); } function serialize(value) { return value === null || value === void 0 ? "" : String(value); } function defaultStringLength(value) { return value.length; } function toAlignment(value) { var code = typeof value === "string" ? value.charCodeAt(0) : x; return code === L || code === l ? l : code === R || code === r ? r : code === C || code === c ? c : x; } } }); // node_modules/mdast-util-gfm-table/to-markdown.js var require_to_markdown3 = __commonJS({ "node_modules/mdast-util-gfm-table/to-markdown.js"(exports, module2) { var phrasing = require_container_phrasing(); var defaultInlineCode = require_inline_code(); var markdownTable = require_markdown_table(); module2.exports = toMarkdown; function toMarkdown(options) { var settings = options || {}; var padding = settings.tableCellPadding; var alignDelimiters = settings.tablePipeAlign; var stringLength = settings.stringLength; var around = padding ? " " : "|"; return { unsafe: [ { character: "\r", inConstruct: "tableCell" }, { character: "\n", inConstruct: "tableCell" }, { atBreak: true, character: "|", after: "[ :-]" }, { character: "|", inConstruct: "tableCell" }, { atBreak: true, character: ":", after: "-" }, { atBreak: true, character: "-", after: "[:|-]" } ], handlers: { table: handleTable, tableRow: handleTableRow, tableCell: handleTableCell, inlineCode: inlineCodeWithTable } }; function handleTable(node, _, context) { return serializeData(handleTableAsData(node, context), node.align); } function handleTableRow(node, _, context) { var row = handleTableRowAsData(node, context); var value = serializeData([row]); return value.slice(0, value.indexOf("\n")); } function handleTableCell(node, _, context) { var exit = context.enter("tableCell"); var value = phrasing(node, context, { before: around, after: around }); exit(); return value; } function serializeData(matrix, align) { return markdownTable(matrix, { align, alignDelimiters, padding, stringLength }); } function handleTableAsData(node, context) { var children = node.children; var index = -1; var length = children.length; var result = []; var subexit = context.enter("table"); while (++index < length) { result[index] = handleTableRowAsData(children[index], context); } subexit(); return result; } function handleTableRowAsData(node, context) { var children = node.children; var index = -1; var length = children.length; var result = []; var subexit = context.enter("tableRow"); while (++index < length) { result[index] = handleTableCell(children[index], node, context); } subexit(); return result; } function inlineCodeWithTable(node, parent, context) { var value = defaultInlineCode(node, parent, context); if (context.stack.indexOf("tableCell") !== -1) { value = value.replace(/\|/g, "\\$&"); } return value; } } } }); // node_modules/mdast-util-to-markdown/lib/util/check-bullet.js var require_check_bullet = __commonJS({ "node_modules/mdast-util-to-markdown/lib/util/check-bullet.js"(exports, module2) { module2.exports = checkBullet; function checkBullet(context) { var marker = context.options.bullet || "*"; if (marker !== "*" && marker !== "+" && marker !== "-") { throw new Error("Cannot serialize items with `" + marker + "` for `options.bullet`, expected `*`, `+`, or `-`"); } return marker; } } }); // node_modules/mdast-util-to-markdown/lib/util/check-list-item-indent.js var require_check_list_item_indent = __commonJS({ "node_modules/mdast-util-to-markdown/lib/util/check-list-item-indent.js"(exports, module2) { module2.exports = checkListItemIndent; function checkListItemIndent(context) { var style = context.options.listItemIndent || "tab"; if (style === 1 || style === "1") { return "one"; } if (style !== "tab" && style !== "one" && style !== "mixed") { throw new Error("Cannot serialize items with `" + style + "` for `options.listItemIndent`, expected `tab`, `one`, or `mixed`"); } return style; } } }); // node_modules/mdast-util-to-markdown/lib/util/container-flow.js var require_container_flow = __commonJS({ "node_modules/mdast-util-to-markdown/lib/util/container-flow.js"(exports, module2) { module2.exports = flow; var repeat = require_repeat_string(); function flow(parent, context) { var children = parent.children || []; var results = []; var index = -1; var child; while (++index < children.length) { child = children[index]; results.push(context.handle(child, parent, context, { before: "\n", after: "\n" })); if (index + 1 < children.length) { results.push(between(child, children[index + 1])); } } return results.join(""); function between(left, right) { var index2 = -1; var result; while (++index2 < context.join.length) { result = context.join[index2](left, right, parent, context); if (result === true || result === 1) { break; } if (typeof result === "number") { return repeat("\n", 1 + Number(result)); } if (result === false) { return "\n\n\n\n"; } } return "\n\n"; } } } }); // node_modules/mdast-util-to-markdown/lib/util/indent-lines.js var require_indent_lines = __commonJS({ "node_modules/mdast-util-to-markdown/lib/util/indent-lines.js"(exports, module2) { module2.exports = indentLines; var eol = /\r?\n|\r/g; function indentLines(value, map2) { var result = []; var start = 0; var line = 0; var match; while (match = eol.exec(value)) { one(value.slice(start, match.index)); result.push(match[0]); start = match.index + match[0].length; line++; } one(value.slice(start)); return result.join(""); function one(value2) { result.push(map2(value2, line, !value2)); } } } }); // node_modules/mdast-util-to-markdown/lib/handle/list-item.js var require_list_item = __commonJS({ "node_modules/mdast-util-to-markdown/lib/handle/list-item.js"(exports, module2) { module2.exports = listItem; var repeat = require_repeat_string(); var checkBullet = require_check_bullet(); var checkListItemIndent = require_check_list_item_indent(); var flow = require_container_flow(); var indentLines = require_indent_lines(); function listItem(node, parent, context) { var bullet = checkBullet(context); var listItemIndent = checkListItemIndent(context); var size; var value; var exit; if (parent && parent.ordered) { bullet = (parent.start > -1 ? parent.start : 1) + (context.options.incrementListMarker === false ? 0 : parent.children.indexOf(node)) + "."; } size = bullet.length + 1; if (listItemIndent === "tab" || listItemIndent === "mixed" && (parent && parent.spread || node.spread)) { size = Math.ceil(size / 4) * 4; } exit = context.enter("listItem"); value = indentLines(flow(node, context), map2); exit(); return value; function map2(line, index, blank) { if (index) { return (blank ? "" : repeat(" ", size)) + line; } return (blank ? bullet : bullet + repeat(" ", size - bullet.length)) + line; } } } }); // node_modules/mdast-util-gfm-task-list-item/to-markdown.js var require_to_markdown4 = __commonJS({ "node_modules/mdast-util-gfm-task-list-item/to-markdown.js"(exports) { var defaultListItem = require_list_item(); exports.unsafe = [{ atBreak: true, character: "-", after: "[:|-]" }]; exports.handlers = { listItem: listItemWithTaskListItem }; function listItemWithTaskListItem(node, parent, context) { var value = defaultListItem(node, parent, context); var head = node.children[0]; if (typeof node.checked === "boolean" && head && head.type === "paragraph") { value = value.replace(/^(?:[*+-]|\d+\.)([\r\n]| {1,3})/, check); } return value; function check($0) { return $0 + "[" + (node.checked ? "x" : " ") + "] "; } } } }); // node_modules/mdast-util-to-markdown/lib/configure.js var require_configure = __commonJS({ "node_modules/mdast-util-to-markdown/lib/configure.js"(exports, module2) { module2.exports = configure; function configure(base, extension) { var index = -1; var key; if (extension.extensions) { while (++index < extension.extensions.length) { configure(base, extension.extensions[index]); } } for (key in extension) { if (key === "extensions") { } else if (key === "unsafe" || key === "join") { base[key] = base[key].concat(extension[key] || []); } else if (key === "handlers") { base[key] = Object.assign(base[key], extension[key] || {}); } else { base.options[key] = extension[key]; } } return base; } } }); // node_modules/mdast-util-gfm/to-markdown.js var require_to_markdown5 = __commonJS({ "node_modules/mdast-util-gfm/to-markdown.js"(exports, module2) { var autolinkLiteral = require_to_markdown(); var strikethrough = require_to_markdown2(); var table = require_to_markdown3(); var taskListItem = require_to_markdown4(); var configure = require_configure(); module2.exports = toMarkdown; function toMarkdown(options) { var config = configure({ handlers: {}, join: [], unsafe: [], options: {} }, { extensions: [autolinkLiteral, strikethrough, table(options), taskListItem] }); return Object.assign(config.options, { handlers: config.handlers, join: config.join, unsafe: config.unsafe }); } } }); // node_modules/remark-gfm/index.js var require_remark_gfm = __commonJS({ "node_modules/remark-gfm/index.js"(exports, module2) { "use strict"; var syntax = require_micromark_extension_gfm(); var fromMarkdown = require_from_markdown5(); var toMarkdown = require_to_markdown5(); var warningIssued; module2.exports = gfm; function gfm(options) { var data = this.data(); if (!warningIssued && (this.Parser && this.Parser.prototype && this.Parser.prototype.blockTokenizers || this.Compiler && this.Compiler.prototype && this.Compiler.prototype.visitors)) { warningIssued = true; console.warn("[remark-gfm] Warning: please upgrade to remark 13 to use this plugin"); } add("micromarkExtensions", syntax(options)); add("fromMarkdownExtensions", fromMarkdown); add("toMarkdownExtensions", toMarkdown(options)); function add(field, value) { if (data[field]) data[field].push(value); else data[field] = [value]; } } } }); // node_modules/@tryfabric/martian/build/src/index.js var require_src = __commonJS({ "node_modules/@tryfabric/martian/build/src/index.js"(exports) { "use strict"; var __importDefault = exports && exports.__importDefault || function(mod) { return mod && mod.__esModule ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.markdownToRichText = exports.markdownToBlocks = void 0; var unified_1 = __importDefault(require_unified()); var remark_parse_1 = __importDefault(require_remark_parse()); var internal_1 = require_internal(); var remark_gfm_1 = __importDefault(require_remark_gfm()); function markdownToBlocks2(body, options) { const root = (0, unified_1.default)().use(remark_parse_1.default).use(remark_gfm_1.default).parse(body); return (0, internal_1.parseBlocks)(root, options); } exports.markdownToBlocks = markdownToBlocks2; function markdownToRichText(text, options) { const root = (0, unified_1.default)().use(remark_parse_1.default).use(remark_gfm_1.default).parse(text); return (0, internal_1.parseRichText)(root, options); } exports.markdownToRichText = markdownToRichText; } }); // node_modules/js-yaml/lib/js-yaml/common.js var require_common2 = __commonJS({ "node_modules/js-yaml/lib/js-yaml/common.js"(exports, module2) { "use strict"; function isNothing(subject) { return typeof subject === "undefined" || subject === null; } function isObject(subject) { return typeof subject === "object" && subject !== null; } function toArray(sequence) { if (Array.isArray(sequence)) return sequence; else if (isNothing(sequence)) return []; return [sequence]; } function extend(target, source) { var index, length, key, sourceKeys; if (source) { sourceKeys = Object.keys(source); for (index = 0, length = sourceKeys.length; index < length; index += 1) { key = sourceKeys[index]; target[key] = source[key]; } } return target; } function repeat(string2, count) { var result = "", cycle; for (cycle = 0; cycle < count; cycle += 1) { result += string2; } return result; } function isNegativeZero(number) { return number === 0 && Number.NEGATIVE_INFINITY === 1 / number; } module2.exports.isNothing = isNothing; module2.exports.isObject = isObject; module2.exports.toArray = toArray; module2.exports.repeat = repeat; module2.exports.isNegativeZero = isNegativeZero; module2.exports.extend = extend; } }); // node_modules/js-yaml/lib/js-yaml/exception.js var require_exception = __commonJS({ "node_modules/js-yaml/lib/js-yaml/exception.js"(exports, module2) { "use strict"; function YAMLException(reason, mark) { Error.call(this); this.name = "YAMLException"; this.reason = reason; this.mark = mark; this.message = (this.reason || "(unknown reason)") + (this.mark ? " " + this.mark.toString() : ""); if (Error.captureStackTrace) { Error.captureStackTrace(this, this.constructor); } else { this.stack = new Error().stack || ""; } } YAMLException.prototype = Object.create(Error.prototype); YAMLException.prototype.constructor = YAMLException; YAMLException.prototype.toString = function toString(compact) { var result = this.name + ": "; result += this.reason || "(unknown reason)"; if (!compact && this.mark) { result += " " + this.mark.toString(); } return result; }; module2.exports = YAMLException; } }); // node_modules/js-yaml/lib/js-yaml/mark.js var require_mark = __commonJS({ "node_modules/js-yaml/lib/js-yaml/mark.js"(exports, module2) { "use strict"; var common = require_common2(); function Mark(name, buffer, position, line, column) { this.name = name; this.buffer = buffer; this.position = position; this.line = line; this.column = column; } Mark.prototype.getSnippet = function getSnippet(indent, maxLength) { var head, start, tail, end, snippet; if (!this.buffer) return null; indent = indent || 4; maxLength = maxLength || 75; head = ""; start = this.position; while (start > 0 && "\0\r\n\x85\u2028\u2029".indexOf(this.buffer.charAt(start - 1)) === -1) { start -= 1; if (this.position - start > maxLength / 2 - 1) { head = " ... "; start += 5; break; } } tail = ""; end = this.position; while (end < this.buffer.length && "\0\r\n\x85\u2028\u2029".indexOf(this.buffer.charAt(end)) === -1) { end += 1; if (end - this.position > maxLength / 2 - 1) { tail = " ... "; end -= 5; break; } } snippet = this.buffer.slice(start, end); return common.repeat(" ", indent) + head + snippet + tail + "\n" + common.repeat(" ", indent + this.position - start + head.length) + "^"; }; Mark.prototype.toString = function toString(compact) { var snippet, where = ""; if (this.name) { where += 'in "' + this.name + '" '; } where += "at line " + (this.line + 1) + ", column " + (this.column + 1); if (!compact) { snippet = this.getSnippet(); if (snippet) { where += ":\n" + snippet; } } return where; }; module2.exports = Mark; } }); // node_modules/js-yaml/lib/js-yaml/type.js var require_type = __commonJS({ "node_modules/js-yaml/lib/js-yaml/type.js"(exports, module2) { "use strict"; var YAMLException = require_exception(); var TYPE_CONSTRUCTOR_OPTIONS = [ "kind", "resolve", "construct", "instanceOf", "predicate", "represent", "defaultStyle", "styleAliases" ]; var YAML_NODE_KINDS = [ "scalar", "sequence", "mapping" ]; function compileStyleAliases(map2) { var result = {}; if (map2 !== null) { Object.keys(map2).forEach(function(style) { map2[style].forEach(function(alias) { result[String(alias)] = style; }); }); } return result; } function Type(tag, options) { options = options || {}; Object.keys(options).forEach(function(name) { if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) { throw new YAMLException('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.'); } }); this.tag = tag; this.kind = options["kind"] || null; this.resolve = options["resolve"] || function() { return true; }; this.construct = options["construct"] || function(data) { return data; }; this.instanceOf = options["instanceOf"] || null; this.predicate = options["predicate"] || null; this.represent = options["represent"] || null; this.defaultStyle = options["defaultStyle"] || null; this.styleAliases = compileStyleAliases(options["styleAliases"] || null); if (YAML_NODE_KINDS.indexOf(this.kind) === -1) { throw new YAMLException('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.'); } } module2.exports = Type; } }); // node_modules/js-yaml/lib/js-yaml/schema.js var require_schema = __commonJS({ "node_modules/js-yaml/lib/js-yaml/schema.js"(exports, module2) { "use strict"; var common = require_common2(); var YAMLException = require_exception(); var Type = require_type(); function compileList(schema4, name, result) { var exclude = []; schema4.include.forEach(function(includedSchema) { result = compileList(includedSchema, name, result); }); schema4[name].forEach(function(currentType) { result.forEach(function(previousType, previousIndex) { if (previousType.tag === currentType.tag && previousType.kind === currentType.kind) { exclude.push(previousIndex); } }); result.push(currentType); }); return result.filter(function(type, index) { return exclude.indexOf(index) === -1; }); } function compileMap() { var result = { scalar: {}, sequence: {}, mapping: {}, fallback: {} }, index, length; function collectType(type) { result[type.kind][type.tag] = result["fallback"][type.tag] = type; } for (index = 0, length = arguments.length; index < length; index += 1) { arguments[index].forEach(collectType); } return result; } function Schema2(definition) { this.include = definition.include || []; this.implicit = definition.implicit || []; this.explicit = definition.explicit || []; this.implicit.forEach(function(type) { if (type.loadKind && type.loadKind !== "scalar") { throw new YAMLException("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported."); } }); this.compiledImplicit = compileList(this, "implicit", []); this.compiledExplicit = compileList(this, "explicit", []); this.compiledTypeMap = compileMap(this.compiledImplicit, this.compiledExplicit); } Schema2.DEFAULT = null; Schema2.create = function createSchema() { var schemas2, types; switch (arguments.length) { case 1: schemas2 = Schema2.DEFAULT; types = arguments[0]; break; case 2: schemas2 = arguments[0]; types = arguments[1]; break; default: throw new YAMLException("Wrong number of arguments for Schema.create function"); } schemas2 = common.toArray(schemas2); types = common.toArray(types); if (!schemas2.every(function(schema4) { return schema4 instanceof Schema2; })) { throw new YAMLException("Specified list of super schemas (or a single Schema object) contains a non-Schema object."); } if (!types.every(function(type) { return type instanceof Type; })) { throw new YAMLException("Specified list of YAML types (or a single Type object) contains a non-Type object."); } return new Schema2({ include: schemas2, explicit: types }); }; module2.exports = Schema2; } }); // node_modules/js-yaml/lib/js-yaml/type/str.js var require_str = __commonJS({ "node_modules/js-yaml/lib/js-yaml/type/str.js"(exports, module2) { "use strict"; var Type = require_type(); module2.exports = new Type("tag:yaml.org,2002:str", { kind: "scalar", construct: function(data) { return data !== null ? data : ""; } }); } }); // node_modules/js-yaml/lib/js-yaml/type/seq.js var require_seq = __commonJS({ "node_modules/js-yaml/lib/js-yaml/type/seq.js"(exports, module2) { "use strict"; var Type = require_type(); module2.exports = new Type("tag:yaml.org,2002:seq", { kind: "sequence", construct: function(data) { return data !== null ? data : []; } }); } }); // node_modules/js-yaml/lib/js-yaml/type/map.js var require_map = __commonJS({ "node_modules/js-yaml/lib/js-yaml/type/map.js"(exports, module2) { "use strict"; var Type = require_type(); module2.exports = new Type("tag:yaml.org,2002:map", { kind: "mapping", construct: function(data) { return data !== null ? data : {}; } }); } }); // node_modules/js-yaml/lib/js-yaml/schema/failsafe.js var require_failsafe = __commonJS({ "node_modules/js-yaml/lib/js-yaml/schema/failsafe.js"(exports, module2) { "use strict"; var Schema2 = require_schema(); module2.exports = new Schema2({ explicit: [ require_str(), require_seq(), require_map() ] }); } }); // node_modules/js-yaml/lib/js-yaml/type/null.js var require_null = __commonJS({ "node_modules/js-yaml/lib/js-yaml/type/null.js"(exports, module2) { "use strict"; var Type = require_type(); function resolveYamlNull(data) { if (data === null) return true; var max = data.length; return max === 1 && data === "~" || max === 4 && (data === "null" || data === "Null" || data === "NULL"); } function constructYamlNull() { return null; } function isNull(object) { return object === null; } module2.exports = new Type("tag:yaml.org,2002:null", { kind: "scalar", resolve: resolveYamlNull, construct: constructYamlNull, predicate: isNull, represent: { canonical: function() { return "~"; }, lowercase: function() { return "null"; }, uppercase: function() { return "NULL"; }, camelcase: function() { return "Null"; } }, defaultStyle: "lowercase" }); } }); // node_modules/js-yaml/lib/js-yaml/type/bool.js var require_bool = __commonJS({ "node_modules/js-yaml/lib/js-yaml/type/bool.js"(exports, module2) { "use strict"; var Type = require_type(); function resolveYamlBoolean(data) { if (data === null) return false; var max = data.length; return max === 4 && (data === "true" || data === "True" || data === "TRUE") || max === 5 && (data === "false" || data === "False" || data === "FALSE"); } function constructYamlBoolean(data) { return data === "true" || data === "True" || data === "TRUE"; } function isBoolean(object) { return Object.prototype.toString.call(object) === "[object Boolean]"; } module2.exports = new Type("tag:yaml.org,2002:bool", { kind: "scalar", resolve: resolveYamlBoolean, construct: constructYamlBoolean, predicate: isBoolean, represent: { lowercase: function(object) { return object ? "true" : "false"; }, uppercase: function(object) { return object ? "TRUE" : "FALSE"; }, camelcase: function(object) { return object ? "True" : "False"; } }, defaultStyle: "lowercase" }); } }); // node_modules/js-yaml/lib/js-yaml/type/int.js var require_int = __commonJS({ "node_modules/js-yaml/lib/js-yaml/type/int.js"(exports, module2) { "use strict"; var common = require_common2(); var Type = require_type(); function isHexCode(c) { return 48 <= c && c <= 57 || 65 <= c && c <= 70 || 97 <= c && c <= 102; } function isOctCode(c) { return 48 <= c && c <= 55; } function isDecCode(c) { return 48 <= c && c <= 57; } function resolveYamlInteger(data) { if (data === null) return false; var max = data.length, index = 0, hasDigits = false, ch; if (!max) return false; ch = data[index]; if (ch === "-" || ch === "+") { ch = data[++index]; } if (ch === "0") { if (index + 1 === max) return true; ch = data[++index]; if (ch === "b") { index++; for (; index < max; index++) { ch = data[index]; if (ch === "_") continue; if (ch !== "0" && ch !== "1") return false; hasDigits = true; } return hasDigits && ch !== "_"; } if (ch === "x") { index++; for (; index < max; index++) { ch = data[index]; if (ch === "_") continue; if (!isHexCode(data.charCodeAt(index))) return false; hasDigits = true; } return hasDigits && ch !== "_"; } for (; index < max; index++) { ch = data[index]; if (ch === "_") continue; if (!isOctCode(data.charCodeAt(index))) return false; hasDigits = true; } return hasDigits && ch !== "_"; } if (ch === "_") return false; for (; index < max; index++) { ch = data[index]; if (ch === "_") continue; if (ch === ":") break; if (!isDecCode(data.charCodeAt(index))) { return false; } hasDigits = true; } if (!hasDigits || ch === "_") return false; if (ch !== ":") return true; return /^(:[0-5]?[0-9])+$/.test(data.slice(index)); } function constructYamlInteger(data) { var value = data, sign = 1, ch, base, digits = []; if (value.indexOf("_") !== -1) { value = value.replace(/_/g, ""); } ch = value[0]; if (ch === "-" || ch === "+") { if (ch === "-") sign = -1; value = value.slice(1); ch = value[0]; } if (value === "0") return 0; if (ch === "0") { if (value[1] === "b") return sign * parseInt(value.slice(2), 2); if (value[1] === "x") return sign * parseInt(value, 16); return sign * parseInt(value, 8); } if (value.indexOf(":") !== -1) { value.split(":").forEach(function(v) { digits.unshift(parseInt(v, 10)); }); value = 0; base = 1; digits.forEach(function(d) { value += d * base; base *= 60; }); return sign * value; } return sign * parseInt(value, 10); } function isInteger(object) { return Object.prototype.toString.call(object) === "[object Number]" && (object % 1 === 0 && !common.isNegativeZero(object)); } module2.exports = new Type("tag:yaml.org,2002:int", { kind: "scalar", resolve: resolveYamlInteger, construct: constructYamlInteger, predicate: isInteger, represent: { binary: function(obj) { return obj >= 0 ? "0b" + obj.toString(2) : "-0b" + obj.toString(2).slice(1); }, octal: function(obj) { return obj >= 0 ? "0" + obj.toString(8) : "-0" + obj.toString(8).slice(1); }, decimal: function(obj) { return obj.toString(10); }, hexadecimal: function(obj) { return obj >= 0 ? "0x" + obj.toString(16).toUpperCase() : "-0x" + obj.toString(16).toUpperCase().slice(1); } }, defaultStyle: "decimal", styleAliases: { binary: [2, "bin"], octal: [8, "oct"], decimal: [10, "dec"], hexadecimal: [16, "hex"] } }); } }); // node_modules/js-yaml/lib/js-yaml/type/float.js var require_float = __commonJS({ "node_modules/js-yaml/lib/js-yaml/type/float.js"(exports, module2) { "use strict"; var common = require_common2(); var Type = require_type(); var YAML_FLOAT_PATTERN = new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"); function resolveYamlFloat(data) { if (data === null) return false; if (!YAML_FLOAT_PATTERN.test(data) || data[data.length - 1] === "_") { return false; } return true; } function constructYamlFloat(data) { var value, sign, base, digits; value = data.replace(/_/g, "").toLowerCase(); sign = value[0] === "-" ? -1 : 1; digits = []; if ("+-".indexOf(value[0]) >= 0) { value = value.slice(1); } if (value === ".inf") { return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; } else if (value === ".nan") { return NaN; } else if (value.indexOf(":") >= 0) { value.split(":").forEach(function(v) { digits.unshift(parseFloat(v, 10)); }); value = 0; base = 1; digits.forEach(function(d) { value += d * base; base *= 60; }); return sign * value; } return sign * parseFloat(value, 10); } var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/; function representYamlFloat(object, style) { var res; if (isNaN(object)) { switch (style) { case "lowercase": return ".nan"; case "uppercase": return ".NAN"; case "camelcase": return ".NaN"; } } else if (Number.POSITIVE_INFINITY === object) { switch (style) { case "lowercase": return ".inf"; case "uppercase": return ".INF"; case "camelcase": return ".Inf"; } } else if (Number.NEGATIVE_INFINITY === object) { switch (style) { case "lowercase": return "-.inf"; case "uppercase": return "-.INF"; case "camelcase": return "-.Inf"; } } else if (common.isNegativeZero(object)) { return "-0.0"; } res = object.toString(10); return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace("e", ".e") : res; } function isFloat(object) { return Object.prototype.toString.call(object) === "[object Number]" && (object % 1 !== 0 || common.isNegativeZero(object)); } module2.exports = new Type("tag:yaml.org,2002:float", { kind: "scalar", resolve: resolveYamlFloat, construct: constructYamlFloat, predicate: isFloat, represent: representYamlFloat, defaultStyle: "lowercase" }); } }); // node_modules/js-yaml/lib/js-yaml/schema/json.js var require_json = __commonJS({ "node_modules/js-yaml/lib/js-yaml/schema/json.js"(exports, module2) { "use strict"; var Schema2 = require_schema(); module2.exports = new Schema2({ include: [ require_failsafe() ], implicit: [ require_null(), require_bool(), require_int(), require_float() ] }); } }); // node_modules/js-yaml/lib/js-yaml/schema/core.js var require_core2 = __commonJS({ "node_modules/js-yaml/lib/js-yaml/schema/core.js"(exports, module2) { "use strict"; var Schema2 = require_schema(); module2.exports = new Schema2({ include: [ require_json() ] }); } }); // node_modules/js-yaml/lib/js-yaml/type/timestamp.js var require_timestamp = __commonJS({ "node_modules/js-yaml/lib/js-yaml/type/timestamp.js"(exports, module2) { "use strict"; var Type = require_type(); var YAML_DATE_REGEXP = new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"); var YAML_TIMESTAMP_REGEXP = new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$"); function resolveYamlTimestamp(data) { if (data === null) return false; if (YAML_DATE_REGEXP.exec(data) !== null) return true; if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true; return false; } function constructYamlTimestamp(data) { var match, year, month, day, hour, minute, second, fraction = 0, delta = null, tz_hour, tz_minute, date; match = YAML_DATE_REGEXP.exec(data); if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data); if (match === null) throw new Error("Date resolve error"); year = +match[1]; month = +match[2] - 1; day = +match[3]; if (!match[4]) { return new Date(Date.UTC(year, month, day)); } hour = +match[4]; minute = +match[5]; second = +match[6]; if (match[7]) { fraction = match[7].slice(0, 3); while (fraction.length < 3) { fraction += "0"; } fraction = +fraction; } if (match[9]) { tz_hour = +match[10]; tz_minute = +(match[11] || 0); delta = (tz_hour * 60 + tz_minute) * 6e4; if (match[9] === "-") delta = -delta; } date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction)); if (delta) date.setTime(date.getTime() - delta); return date; } function representYamlTimestamp(object) { return object.toISOString(); } module2.exports = new Type("tag:yaml.org,2002:timestamp", { kind: "scalar", resolve: resolveYamlTimestamp, construct: constructYamlTimestamp, instanceOf: Date, represent: representYamlTimestamp }); } }); // node_modules/js-yaml/lib/js-yaml/type/merge.js var require_merge = __commonJS({ "node_modules/js-yaml/lib/js-yaml/type/merge.js"(exports, module2) { "use strict"; var Type = require_type(); function resolveYamlMerge(data) { return data === "<<" || data === null; } module2.exports = new Type("tag:yaml.org,2002:merge", { kind: "scalar", resolve: resolveYamlMerge }); } }); // node_modules/js-yaml/lib/js-yaml/type/binary.js var require_binary = __commonJS({ "node_modules/js-yaml/lib/js-yaml/type/binary.js"(exports, module2) { "use strict"; var NodeBuffer; try { _require = require; NodeBuffer = _require("buffer").Buffer; } catch (__) { } var _require; var Type = require_type(); var BASE64_MAP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r"; function resolveYamlBinary(data) { if (data === null) return false; var code, idx, bitlen = 0, max = data.length, map2 = BASE64_MAP; for (idx = 0; idx < max; idx++) { code = map2.indexOf(data.charAt(idx)); if (code > 64) continue; if (code < 0) return false; bitlen += 6; } return bitlen % 8 === 0; } function constructYamlBinary(data) { var idx, tailbits, input = data.replace(/[\r\n=]/g, ""), max = input.length, map2 = BASE64_MAP, bits = 0, result = []; for (idx = 0; idx < max; idx++) { if (idx % 4 === 0 && idx) { result.push(bits >> 16 & 255); result.push(bits >> 8 & 255); result.push(bits & 255); } bits = bits << 6 | map2.indexOf(input.charAt(idx)); } tailbits = max % 4 * 6; if (tailbits === 0) { result.push(bits >> 16 & 255); result.push(bits >> 8 & 255); result.push(bits & 255); } else if (tailbits === 18) { result.push(bits >> 10 & 255); result.push(bits >> 2 & 255); } else if (tailbits === 12) { result.push(bits >> 4 & 255); } if (NodeBuffer) { return NodeBuffer.from ? NodeBuffer.from(result) : new NodeBuffer(result); } return result; } function representYamlBinary(object) { var result = "", bits = 0, idx, tail, max = object.length, map2 = BASE64_MAP; for (idx = 0; idx < max; idx++) { if (idx % 3 === 0 && idx) { result += map2[bits >> 18 & 63]; result += map2[bits >> 12 & 63]; result += map2[bits >> 6 & 63]; result += map2[bits & 63]; } bits = (bits << 8) + object[idx]; } tail = max % 3; if (tail === 0) { result += map2[bits >> 18 & 63]; result += map2[bits >> 12 & 63]; result += map2[bits >> 6 & 63]; result += map2[bits & 63]; } else if (tail === 2) { result += map2[bits >> 10 & 63]; result += map2[bits >> 4 & 63]; result += map2[bits << 2 & 63]; result += map2[64]; } else if (tail === 1) { result += map2[bits >> 2 & 63]; result += map2[bits << 4 & 63]; result += map2[64]; result += map2[64]; } return result; } function isBinary(object) { return NodeBuffer && NodeBuffer.isBuffer(object); } module2.exports = new Type("tag:yaml.org,2002:binary", { kind: "scalar", resolve: resolveYamlBinary, construct: constructYamlBinary, predicate: isBinary, represent: representYamlBinary }); } }); // node_modules/js-yaml/lib/js-yaml/type/omap.js var require_omap = __commonJS({ "node_modules/js-yaml/lib/js-yaml/type/omap.js"(exports, module2) { "use strict"; var Type = require_type(); var _hasOwnProperty = Object.prototype.hasOwnProperty; var _toString = Object.prototype.toString; function resolveYamlOmap(data) { if (data === null) return true; var objectKeys = [], index, length, pair, pairKey, pairHasKey, object = data; for (index = 0, length = object.length; index < length; index += 1) { pair = object[index]; pairHasKey = false; if (_toString.call(pair) !== "[object Object]") return false; for (pairKey in pair) { if (_hasOwnProperty.call(pair, pairKey)) { if (!pairHasKey) pairHasKey = true; else return false; } } if (!pairHasKey) return false; if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey); else return false; } return true; } function constructYamlOmap(data) { return data !== null ? data : []; } module2.exports = new Type("tag:yaml.org,2002:omap", { kind: "sequence", resolve: resolveYamlOmap, construct: constructYamlOmap }); } }); // node_modules/js-yaml/lib/js-yaml/type/pairs.js var require_pairs = __commonJS({ "node_modules/js-yaml/lib/js-yaml/type/pairs.js"(exports, module2) { "use strict"; var Type = require_type(); var _toString = Object.prototype.toString; function resolveYamlPairs(data) { if (data === null) return true; var index, length, pair, keys, result, object = data; result = new Array(object.length); for (index = 0, length = object.length; index < length; index += 1) { pair = object[index]; if (_toString.call(pair) !== "[object Object]") return false; keys = Object.keys(pair); if (keys.length !== 1) return false; result[index] = [keys[0], pair[keys[0]]]; } return true; } function constructYamlPairs(data) { if (data === null) return []; var index, length, pair, keys, result, object = data; result = new Array(object.length); for (index = 0, length = object.length; index < length; index += 1) { pair = object[index]; keys = Object.keys(pair); result[index] = [keys[0], pair[keys[0]]]; } return result; } module2.exports = new Type("tag:yaml.org,2002:pairs", { kind: "sequence", resolve: resolveYamlPairs, construct: constructYamlPairs }); } }); // node_modules/js-yaml/lib/js-yaml/type/set.js var require_set = __commonJS({ "node_modules/js-yaml/lib/js-yaml/type/set.js"(exports, module2) { "use strict"; var Type = require_type(); var _hasOwnProperty = Object.prototype.hasOwnProperty; function resolveYamlSet(data) { if (data === null) return true; var key, object = data; for (key in object) { if (_hasOwnProperty.call(object, key)) { if (object[key] !== null) return false; } } return true; } function constructYamlSet(data) { return data !== null ? data : {}; } module2.exports = new Type("tag:yaml.org,2002:set", { kind: "mapping", resolve: resolveYamlSet, construct: constructYamlSet }); } }); // node_modules/js-yaml/lib/js-yaml/schema/default_safe.js var require_default_safe = __commonJS({ "node_modules/js-yaml/lib/js-yaml/schema/default_safe.js"(exports, module2) { "use strict"; var Schema2 = require_schema(); module2.exports = new Schema2({ include: [ require_core2() ], implicit: [ require_timestamp(), require_merge() ], explicit: [ require_binary(), require_omap(), require_pairs(), require_set() ] }); } }); // node_modules/js-yaml/lib/js-yaml/type/js/undefined.js var require_undefined = __commonJS({ "node_modules/js-yaml/lib/js-yaml/type/js/undefined.js"(exports, module2) { "use strict"; var Type = require_type(); function resolveJavascriptUndefined() { return true; } function constructJavascriptUndefined() { return void 0; } function representJavascriptUndefined() { return ""; } function isUndefined(object) { return typeof object === "undefined"; } module2.exports = new Type("tag:yaml.org,2002:js/undefined", { kind: "scalar", resolve: resolveJavascriptUndefined, construct: constructJavascriptUndefined, predicate: isUndefined, represent: representJavascriptUndefined }); } }); // node_modules/js-yaml/lib/js-yaml/type/js/regexp.js var require_regexp = __commonJS({ "node_modules/js-yaml/lib/js-yaml/type/js/regexp.js"(exports, module2) { "use strict"; var Type = require_type(); function resolveJavascriptRegExp(data) { if (data === null) return false; if (data.length === 0) return false; var regexp = data, tail = /\/([gim]*)$/.exec(data), modifiers = ""; if (regexp[0] === "/") { if (tail) modifiers = tail[1]; if (modifiers.length > 3) return false; if (regexp[regexp.length - modifiers.length - 1] !== "/") return false; } return true; } function constructJavascriptRegExp(data) { var regexp = data, tail = /\/([gim]*)$/.exec(data), modifiers = ""; if (regexp[0] === "/") { if (tail) modifiers = tail[1]; regexp = regexp.slice(1, regexp.length - modifiers.length - 1); } return new RegExp(regexp, modifiers); } function representJavascriptRegExp(object) { var result = "/" + object.source + "/"; if (object.global) result += "g"; if (object.multiline) result += "m"; if (object.ignoreCase) result += "i"; return result; } function isRegExp(object) { return Object.prototype.toString.call(object) === "[object RegExp]"; } module2.exports = new Type("tag:yaml.org,2002:js/regexp", { kind: "scalar", resolve: resolveJavascriptRegExp, construct: constructJavascriptRegExp, predicate: isRegExp, represent: representJavascriptRegExp }); } }); // node_modules/js-yaml/lib/js-yaml/type/js/function.js var require_function = __commonJS({ "node_modules/js-yaml/lib/js-yaml/type/js/function.js"(exports, module2) { "use strict"; var esprima; try { _require = require; esprima = _require("esprima"); } catch (_) { if (typeof window !== "undefined") esprima = window.esprima; } var _require; var Type = require_type(); function resolveJavascriptFunction(data) { if (data === null) return false; try { var source = "(" + data + ")", ast = esprima.parse(source, { range: true }); if (ast.type !== "Program" || ast.body.length !== 1 || ast.body[0].type !== "ExpressionStatement" || ast.body[0].expression.type !== "ArrowFunctionExpression" && ast.body[0].expression.type !== "FunctionExpression") { return false; } return true; } catch (err) { return false; } } function constructJavascriptFunction(data) { var source = "(" + data + ")", ast = esprima.parse(source, { range: true }), params = [], body; if (ast.type !== "Program" || ast.body.length !== 1 || ast.body[0].type !== "ExpressionStatement" || ast.body[0].expression.type !== "ArrowFunctionExpression" && ast.body[0].expression.type !== "FunctionExpression") { throw new Error("Failed to resolve function"); } ast.body[0].expression.params.forEach(function(param) { params.push(param.name); }); body = ast.body[0].expression.body.range; if (ast.body[0].expression.body.type === "BlockStatement") { return new Function(params, source.slice(body[0] + 1, body[1] - 1)); } return new Function(params, "return " + source.slice(body[0], body[1])); } function representJavascriptFunction(object) { return object.toString(); } function isFunction(object) { return Object.prototype.toString.call(object) === "[object Function]"; } module2.exports = new Type("tag:yaml.org,2002:js/function", { kind: "scalar", resolve: resolveJavascriptFunction, construct: constructJavascriptFunction, predicate: isFunction, represent: representJavascriptFunction }); } }); // node_modules/js-yaml/lib/js-yaml/schema/default_full.js var require_default_full = __commonJS({ "node_modules/js-yaml/lib/js-yaml/schema/default_full.js"(exports, module2) { "use strict"; var Schema2 = require_schema(); module2.exports = Schema2.DEFAULT = new Schema2({ include: [ require_default_safe() ], explicit: [ require_undefined(), require_regexp(), require_function() ] }); } }); // node_modules/js-yaml/lib/js-yaml/loader.js var require_loader = __commonJS({ "node_modules/js-yaml/lib/js-yaml/loader.js"(exports, module2) { "use strict"; var common = require_common2(); var YAMLException = require_exception(); var Mark = require_mark(); var DEFAULT_SAFE_SCHEMA = require_default_safe(); var DEFAULT_FULL_SCHEMA = require_default_full(); var _hasOwnProperty = Object.prototype.hasOwnProperty; var CONTEXT_FLOW_IN = 1; var CONTEXT_FLOW_OUT = 2; var CONTEXT_BLOCK_IN = 3; var CONTEXT_BLOCK_OUT = 4; var CHOMPING_CLIP = 1; var CHOMPING_STRIP = 2; var CHOMPING_KEEP = 3; var PATTERN_NON_PRINTABLE = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/; var PATTERN_FLOW_INDICATORS = /[,\[\]\{\}]/; var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\-]+!)$/i; var PATTERN_TAG_URI = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i; function _class(obj) { return Object.prototype.toString.call(obj); } function is_EOL(c) { return c === 10 || c === 13; } function is_WHITE_SPACE(c) { return c === 9 || c === 32; } function is_WS_OR_EOL(c) { return c === 9 || c === 32 || c === 10 || c === 13; } function is_FLOW_INDICATOR(c) { return c === 44 || c === 91 || c === 93 || c === 123 || c === 125; } function fromHexCode(c) { var lc; if (48 <= c && c <= 57) { return c - 48; } lc = c | 32; if (97 <= lc && lc <= 102) { return lc - 97 + 10; } return -1; } function escapedHexLen(c) { if (c === 120) { return 2; } if (c === 117) { return 4; } if (c === 85) { return 8; } return 0; } function fromDecimalCode(c) { if (48 <= c && c <= 57) { return c - 48; } return -1; } function simpleEscapeSequence(c) { return c === 48 ? "\0" : c === 97 ? "\x07" : c === 98 ? "\b" : c === 116 ? " " : c === 9 ? " " : c === 110 ? "\n" : c === 118 ? "\v" : c === 102 ? "\f" : c === 114 ? "\r" : c === 101 ? "" : c === 32 ? " " : c === 34 ? '"' : c === 47 ? "/" : c === 92 ? "\\" : c === 78 ? "\x85" : c === 95 ? "\xA0" : c === 76 ? "\u2028" : c === 80 ? "\u2029" : ""; } function charFromCodepoint(c) { if (c <= 65535) { return String.fromCharCode(c); } return String.fromCharCode((c - 65536 >> 10) + 55296, (c - 65536 & 1023) + 56320); } var simpleEscapeCheck = new Array(256); var simpleEscapeMap = new Array(256); for (i = 0; i < 256; i++) { simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0; simpleEscapeMap[i] = simpleEscapeSequence(i); } var i; function State(input, options) { this.input = input; this.filename = options["filename"] || null; this.schema = options["schema"] || DEFAULT_FULL_SCHEMA; this.onWarning = options["onWarning"] || null; this.legacy = options["legacy"] || false; this.json = options["json"] || false; this.listener = options["listener"] || null; this.implicitTypes = this.schema.compiledImplicit; this.typeMap = this.schema.compiledTypeMap; this.length = input.length; this.position = 0; this.line = 0; this.lineStart = 0; this.lineIndent = 0; this.documents = []; } function generateError(state, message) { return new YAMLException(message, new Mark(state.filename, state.input, state.position, state.line, state.position - state.lineStart)); } function throwError(state, message) { throw generateError(state, message); } function throwWarning(state, message) { if (state.onWarning) { state.onWarning.call(null, generateError(state, message)); } } var directiveHandlers = { YAML: function handleYamlDirective(state, name, args) { var match, major, minor; if (state.version !== null) { throwError(state, "duplication of %YAML directive"); } if (args.length !== 1) { throwError(state, "YAML directive accepts exactly one argument"); } match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]); if (match === null) { throwError(state, "ill-formed argument of the YAML directive"); } major = parseInt(match[1], 10); minor = parseInt(match[2], 10); if (major !== 1) { throwError(state, "unacceptable YAML version of the document"); } state.version = args[0]; state.checkLineBreaks = minor < 2; if (minor !== 1 && minor !== 2) { throwWarning(state, "unsupported YAML version of the document"); } }, TAG: function handleTagDirective(state, name, args) { var handle, prefix; if (args.length !== 2) { throwError(state, "TAG directive accepts exactly two arguments"); } handle = args[0]; prefix = args[1]; if (!PATTERN_TAG_HANDLE.test(handle)) { throwError(state, "ill-formed tag handle (first argument) of the TAG directive"); } if (_hasOwnProperty.call(state.tagMap, handle)) { throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle'); } if (!PATTERN_TAG_URI.test(prefix)) { throwError(state, "ill-formed tag prefix (second argument) of the TAG directive"); } state.tagMap[handle] = prefix; } }; function captureSegment(state, start, end, checkJson) { var _position, _length, _character, _result; if (start < end) { _result = state.input.slice(start, end); if (checkJson) { for (_position = 0, _length = _result.length; _position < _length; _position += 1) { _character = _result.charCodeAt(_position); if (!(_character === 9 || 32 <= _character && _character <= 1114111)) { throwError(state, "expected valid JSON character"); } } } else if (PATTERN_NON_PRINTABLE.test(_result)) { throwError(state, "the stream contains non-printable characters"); } state.result += _result; } } function mergeMappings(state, destination, source, overridableKeys) { var sourceKeys, key, index, quantity; if (!common.isObject(source)) { throwError(state, "cannot merge mappings; the provided source object is unacceptable"); } sourceKeys = Object.keys(source); for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) { key = sourceKeys[index]; if (!_hasOwnProperty.call(destination, key)) { destination[key] = source[key]; overridableKeys[key] = true; } } } function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startPos) { var index, quantity; if (Array.isArray(keyNode)) { keyNode = Array.prototype.slice.call(keyNode); for (index = 0, quantity = keyNode.length; index < quantity; index += 1) { if (Array.isArray(keyNode[index])) { throwError(state, "nested arrays are not supported inside keys"); } if (typeof keyNode === "object" && _class(keyNode[index]) === "[object Object]") { keyNode[index] = "[object Object]"; } } } if (typeof keyNode === "object" && _class(keyNode) === "[object Object]") { keyNode = "[object Object]"; } keyNode = String(keyNode); if (_result === null) { _result = {}; } if (keyTag === "tag:yaml.org,2002:merge") { if (Array.isArray(valueNode)) { for (index = 0, quantity = valueNode.length; index < quantity; index += 1) { mergeMappings(state, _result, valueNode[index], overridableKeys); } } else { mergeMappings(state, _result, valueNode, overridableKeys); } } else { if (!state.json && !_hasOwnProperty.call(overridableKeys, keyNode) && _hasOwnProperty.call(_result, keyNode)) { state.line = startLine || state.line; state.position = startPos || state.position; throwError(state, "duplicated mapping key"); } _result[keyNode] = valueNode; delete overridableKeys[keyNode]; } return _result; } function readLineBreak(state) { var ch; ch = state.input.charCodeAt(state.position); if (ch === 10) { state.position++; } else if (ch === 13) { state.position++; if (state.input.charCodeAt(state.position) === 10) { state.position++; } } else { throwError(state, "a line break is expected"); } state.line += 1; state.lineStart = state.position; } function skipSeparationSpace(state, allowComments, checkIndent) { var lineBreaks = 0, ch = state.input.charCodeAt(state.position); while (ch !== 0) { while (is_WHITE_SPACE(ch)) { ch = state.input.charCodeAt(++state.position); } if (allowComments && ch === 35) { do { ch = state.input.charCodeAt(++state.position); } while (ch !== 10 && ch !== 13 && ch !== 0); } if (is_EOL(ch)) { readLineBreak(state); ch = state.input.charCodeAt(state.position); lineBreaks++; state.lineIndent = 0; while (ch === 32) { state.lineIndent++; ch = state.input.charCodeAt(++state.position); } } else { break; } } if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) { throwWarning(state, "deficient indentation"); } return lineBreaks; } function testDocumentSeparator(state) { var _position = state.position, ch; ch = state.input.charCodeAt(_position); if ((ch === 45 || ch === 46) && ch === state.input.charCodeAt(_position + 1) && ch === state.input.charCodeAt(_position + 2)) { _position += 3; ch = state.input.charCodeAt(_position); if (ch === 0 || is_WS_OR_EOL(ch)) { return true; } } return false; } function writeFoldedLines(state, count) { if (count === 1) { state.result += " "; } else if (count > 1) { state.result += common.repeat("\n", count - 1); } } function readPlainScalar(state, nodeIndent, withinFlowCollection) { var preceding, following, captureStart, captureEnd, hasPendingContent, _line, _lineStart, _lineIndent, _kind = state.kind, _result = state.result, ch; ch = state.input.charCodeAt(state.position); if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 35 || ch === 38 || ch === 42 || ch === 33 || ch === 124 || ch === 62 || ch === 39 || ch === 34 || ch === 37 || ch === 64 || ch === 96) { return false; } if (ch === 63 || ch === 45) { following = state.input.charCodeAt(state.position + 1); if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { return false; } } state.kind = "scalar"; state.result = ""; captureStart = captureEnd = state.position; hasPendingContent = false; while (ch !== 0) { if (ch === 58) { following = state.input.charCodeAt(state.position + 1); if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { break; } } else if (ch === 35) { preceding = state.input.charCodeAt(state.position - 1); if (is_WS_OR_EOL(preceding)) { break; } } else if (state.position === state.lineStart && testDocumentSeparator(state) || withinFlowCollection && is_FLOW_INDICATOR(ch)) { break; } else if (is_EOL(ch)) { _line = state.line; _lineStart = state.lineStart; _lineIndent = state.lineIndent; skipSeparationSpace(state, false, -1); if (state.lineIndent >= nodeIndent) { hasPendingContent = true; ch = state.input.charCodeAt(state.position); continue; } else { state.position = captureEnd; state.line = _line; state.lineStart = _lineStart; state.lineIndent = _lineIndent; break; } } if (hasPendingContent) { captureSegment(state, captureStart, captureEnd, false); writeFoldedLines(state, state.line - _line); captureStart = captureEnd = state.position; hasPendingContent = false; } if (!is_WHITE_SPACE(ch)) { captureEnd = state.position + 1; } ch = state.input.charCodeAt(++state.position); } captureSegment(state, captureStart, captureEnd, false); if (state.result) { return true; } state.kind = _kind; state.result = _result; return false; } function readSingleQuotedScalar(state, nodeIndent) { var ch, captureStart, captureEnd; ch = state.input.charCodeAt(state.position); if (ch !== 39) { return false; } state.kind = "scalar"; state.result = ""; state.position++; captureStart = captureEnd = state.position; while ((ch = state.input.charCodeAt(state.position)) !== 0) { if (ch === 39) { captureSegment(state, captureStart, state.position, true); ch = state.input.charCodeAt(++state.position); if (ch === 39) { captureStart = state.position; state.position++; captureEnd = state.position; } else { return true; } } else if (is_EOL(ch)) { captureSegment(state, captureStart, captureEnd, true); writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); captureStart = captureEnd = state.position; } else if (state.position === state.lineStart && testDocumentSeparator(state)) { throwError(state, "unexpected end of the document within a single quoted scalar"); } else { state.position++; captureEnd = state.position; } } throwError(state, "unexpected end of the stream within a single quoted scalar"); } function readDoubleQuotedScalar(state, nodeIndent) { var captureStart, captureEnd, hexLength, hexResult, tmp, ch; ch = state.input.charCodeAt(state.position); if (ch !== 34) { return false; } state.kind = "scalar"; state.result = ""; state.position++; captureStart = captureEnd = state.position; while ((ch = state.input.charCodeAt(state.position)) !== 0) { if (ch === 34) { captureSegment(state, captureStart, state.position, true); state.position++; return true; } else if (ch === 92) { captureSegment(state, captureStart, state.position, true); ch = state.input.charCodeAt(++state.position); if (is_EOL(ch)) { skipSeparationSpace(state, false, nodeIndent); } else if (ch < 256 && simpleEscapeCheck[ch]) { state.result += simpleEscapeMap[ch]; state.position++; } else if ((tmp = escapedHexLen(ch)) > 0) { hexLength = tmp; hexResult = 0; for (; hexLength > 0; hexLength--) { ch = state.input.charCodeAt(++state.position); if ((tmp = fromHexCode(ch)) >= 0) { hexResult = (hexResult << 4) + tmp; } else { throwError(state, "expected hexadecimal character"); } } state.result += charFromCodepoint(hexResult); state.position++; } else { throwError(state, "unknown escape sequence"); } captureStart = captureEnd = state.position; } else if (is_EOL(ch)) { captureSegment(state, captureStart, captureEnd, true); writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); captureStart = captureEnd = state.position; } else if (state.position === state.lineStart && testDocumentSeparator(state)) { throwError(state, "unexpected end of the document within a double quoted scalar"); } else { state.position++; captureEnd = state.position; } } throwError(state, "unexpected end of the stream within a double quoted scalar"); } function readFlowCollection(state, nodeIndent) { var readNext = true, _line, _tag = state.tag, _result, _anchor = state.anchor, following, terminator, isPair2, isExplicitPair, isMapping, overridableKeys = {}, keyNode, keyTag, valueNode, ch; ch = state.input.charCodeAt(state.position); if (ch === 91) { terminator = 93; isMapping = false; _result = []; } else if (ch === 123) { terminator = 125; isMapping = true; _result = {}; } else { return false; } if (state.anchor !== null) { state.anchorMap[state.anchor] = _result; } ch = state.input.charCodeAt(++state.position); while (ch !== 0) { skipSeparationSpace(state, true, nodeIndent); ch = state.input.charCodeAt(state.position); if (ch === terminator) { state.position++; state.tag = _tag; state.anchor = _anchor; state.kind = isMapping ? "mapping" : "sequence"; state.result = _result; return true; } else if (!readNext) { throwError(state, "missed comma between flow collection entries"); } keyTag = keyNode = valueNode = null; isPair2 = isExplicitPair = false; if (ch === 63) { following = state.input.charCodeAt(state.position + 1); if (is_WS_OR_EOL(following)) { isPair2 = isExplicitPair = true; state.position++; skipSeparationSpace(state, true, nodeIndent); } } _line = state.line; composeNode2(state, nodeIndent, CONTEXT_FLOW_IN, false, true); keyTag = state.tag; keyNode = state.result; skipSeparationSpace(state, true, nodeIndent); ch = state.input.charCodeAt(state.position); if ((isExplicitPair || state.line === _line) && ch === 58) { isPair2 = true; ch = state.input.charCodeAt(++state.position); skipSeparationSpace(state, true, nodeIndent); composeNode2(state, nodeIndent, CONTEXT_FLOW_IN, false, true); valueNode = state.result; } if (isMapping) { storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode); } else if (isPair2) { _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode)); } else { _result.push(keyNode); } skipSeparationSpace(state, true, nodeIndent); ch = state.input.charCodeAt(state.position); if (ch === 44) { readNext = true; ch = state.input.charCodeAt(++state.position); } else { readNext = false; } } throwError(state, "unexpected end of the stream within a flow collection"); } function readBlockScalar(state, nodeIndent) { var captureStart, folding, chomping = CHOMPING_CLIP, didReadContent = false, detectedIndent = false, textIndent = nodeIndent, emptyLines = 0, atMoreIndented = false, tmp, ch; ch = state.input.charCodeAt(state.position); if (ch === 124) { folding = false; } else if (ch === 62) { folding = true; } else { return false; } state.kind = "scalar"; state.result = ""; while (ch !== 0) { ch = state.input.charCodeAt(++state.position); if (ch === 43 || ch === 45) { if (CHOMPING_CLIP === chomping) { chomping = ch === 43 ? CHOMPING_KEEP : CHOMPING_STRIP; } else { throwError(state, "repeat of a chomping mode identifier"); } } else if ((tmp = fromDecimalCode(ch)) >= 0) { if (tmp === 0) { throwError(state, "bad explicit indentation width of a block scalar; it cannot be less than one"); } else if (!detectedIndent) { textIndent = nodeIndent + tmp - 1; detectedIndent = true; } else { throwError(state, "repeat of an indentation width identifier"); } } else { break; } } if (is_WHITE_SPACE(ch)) { do { ch = state.input.charCodeAt(++state.position); } while (is_WHITE_SPACE(ch)); if (ch === 35) { do { ch = state.input.charCodeAt(++state.position); } while (!is_EOL(ch) && ch !== 0); } } while (ch !== 0) { readLineBreak(state); state.lineIndent = 0; ch = state.input.charCodeAt(state.position); while ((!detectedIndent || state.lineIndent < textIndent) && ch === 32) { state.lineIndent++; ch = state.input.charCodeAt(++state.position); } if (!detectedIndent && state.lineIndent > textIndent) { textIndent = state.lineIndent; } if (is_EOL(ch)) { emptyLines++; continue; } if (state.lineIndent < textIndent) { if (chomping === CHOMPING_KEEP) { state.result += common.repeat("\n", didReadContent ? 1 + emptyLines : emptyLines); } else if (chomping === CHOMPING_CLIP) { if (didReadContent) { state.result += "\n"; } } break; } if (folding) { if (is_WHITE_SPACE(ch)) { atMoreIndented = true; state.result += common.repeat("\n", didReadContent ? 1 + emptyLines : emptyLines); } else if (atMoreIndented) { atMoreIndented = false; state.result += common.repeat("\n", emptyLines + 1); } else if (emptyLines === 0) { if (didReadContent) { state.result += " "; } } else { state.result += common.repeat("\n", emptyLines); } } else { state.result += common.repeat("\n", didReadContent ? 1 + emptyLines : emptyLines); } didReadContent = true; detectedIndent = true; emptyLines = 0; captureStart = state.position; while (!is_EOL(ch) && ch !== 0) { ch = state.input.charCodeAt(++state.position); } captureSegment(state, captureStart, state.position, false); } return true; } function readBlockSequence(state, nodeIndent) { var _line, _tag = state.tag, _anchor = state.anchor, _result = [], following, detected = false, ch; if (state.anchor !== null) { state.anchorMap[state.anchor] = _result; } ch = state.input.charCodeAt(state.position); while (ch !== 0) { if (ch !== 45) { break; } following = state.input.charCodeAt(state.position + 1); if (!is_WS_OR_EOL(following)) { break; } detected = true; state.position++; if (skipSeparationSpace(state, true, -1)) { if (state.lineIndent <= nodeIndent) { _result.push(null); ch = state.input.charCodeAt(state.position); continue; } } _line = state.line; composeNode2(state, nodeIndent, CONTEXT_BLOCK_IN, false, true); _result.push(state.result); skipSeparationSpace(state, true, -1); ch = state.input.charCodeAt(state.position); if ((state.line === _line || state.lineIndent > nodeIndent) && ch !== 0) { throwError(state, "bad indentation of a sequence entry"); } else if (state.lineIndent < nodeIndent) { break; } } if (detected) { state.tag = _tag; state.anchor = _anchor; state.kind = "sequence"; state.result = _result; return true; } return false; } function readBlockMapping(state, nodeIndent, flowIndent) { var following, allowCompact, _line, _pos, _tag = state.tag, _anchor = state.anchor, _result = {}, overridableKeys = {}, keyTag = null, keyNode = null, valueNode = null, atExplicitKey = false, detected = false, ch; if (state.anchor !== null) { state.anchorMap[state.anchor] = _result; } ch = state.input.charCodeAt(state.position); while (ch !== 0) { following = state.input.charCodeAt(state.position + 1); _line = state.line; _pos = state.position; if ((ch === 63 || ch === 58) && is_WS_OR_EOL(following)) { if (ch === 63) { if (atExplicitKey) { storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); keyTag = keyNode = valueNode = null; } detected = true; atExplicitKey = true; allowCompact = true; } else if (atExplicitKey) { atExplicitKey = false; allowCompact = true; } else { throwError(state, "incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"); } state.position += 1; ch = following; } else if (composeNode2(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) { if (state.line === _line) { ch = state.input.charCodeAt(state.position); while (is_WHITE_SPACE(ch)) { ch = state.input.charCodeAt(++state.position); } if (ch === 58) { ch = state.input.charCodeAt(++state.position); if (!is_WS_OR_EOL(ch)) { throwError(state, "a whitespace character is expected after the key-value separator within a block mapping"); } if (atExplicitKey) { storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); keyTag = keyNode = valueNode = null; } detected = true; atExplicitKey = false; allowCompact = false; keyTag = state.tag; keyNode = state.result; } else if (detected) { throwError(state, "can not read an implicit mapping pair; a colon is missed"); } else { state.tag = _tag; state.anchor = _anchor; return true; } } else if (detected) { throwError(state, "can not read a block mapping entry; a multiline key may not be an implicit key"); } else { state.tag = _tag; state.anchor = _anchor; return true; } } else { break; } if (state.line === _line || state.lineIndent > nodeIndent) { if (composeNode2(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) { if (atExplicitKey) { keyNode = state.result; } else { valueNode = state.result; } } if (!atExplicitKey) { storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _pos); keyTag = keyNode = valueNode = null; } skipSeparationSpace(state, true, -1); ch = state.input.charCodeAt(state.position); } if (state.lineIndent > nodeIndent && ch !== 0) { throwError(state, "bad indentation of a mapping entry"); } else if (state.lineIndent < nodeIndent) { break; } } if (atExplicitKey) { storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); } if (detected) { state.tag = _tag; state.anchor = _anchor; state.kind = "mapping"; state.result = _result; } return detected; } function readTagProperty(state) { var _position, isVerbatim = false, isNamed = false, tagHandle, tagName, ch; ch = state.input.charCodeAt(state.position); if (ch !== 33) return false; if (state.tag !== null) { throwError(state, "duplication of a tag property"); } ch = state.input.charCodeAt(++state.position); if (ch === 60) { isVerbatim = true; ch = state.input.charCodeAt(++state.position); } else if (ch === 33) { isNamed = true; tagHandle = "!!"; ch = state.input.charCodeAt(++state.position); } else { tagHandle = "!"; } _position = state.position; if (isVerbatim) { do { ch = state.input.charCodeAt(++state.position); } while (ch !== 0 && ch !== 62); if (state.position < state.length) { tagName = state.input.slice(_position, state.position); ch = state.input.charCodeAt(++state.position); } else { throwError(state, "unexpected end of the stream within a verbatim tag"); } } else { while (ch !== 0 && !is_WS_OR_EOL(ch)) { if (ch === 33) { if (!isNamed) { tagHandle = state.input.slice(_position - 1, state.position + 1); if (!PATTERN_TAG_HANDLE.test(tagHandle)) { throwError(state, "named tag handle cannot contain such characters"); } isNamed = true; _position = state.position + 1; } else { throwError(state, "tag suffix cannot contain exclamation marks"); } } ch = state.input.charCodeAt(++state.position); } tagName = state.input.slice(_position, state.position); if (PATTERN_FLOW_INDICATORS.test(tagName)) { throwError(state, "tag suffix cannot contain flow indicator characters"); } } if (tagName && !PATTERN_TAG_URI.test(tagName)) { throwError(state, "tag name cannot contain such characters: " + tagName); } if (isVerbatim) { state.tag = tagName; } else if (_hasOwnProperty.call(state.tagMap, tagHandle)) { state.tag = state.tagMap[tagHandle] + tagName; } else if (tagHandle === "!") { state.tag = "!" + tagName; } else if (tagHandle === "!!") { state.tag = "tag:yaml.org,2002:" + tagName; } else { throwError(state, 'undeclared tag handle "' + tagHandle + '"'); } return true; } function readAnchorProperty(state) { var _position, ch; ch = state.input.charCodeAt(state.position); if (ch !== 38) return false; if (state.anchor !== null) { throwError(state, "duplication of an anchor property"); } ch = state.input.charCodeAt(++state.position); _position = state.position; while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { ch = state.input.charCodeAt(++state.position); } if (state.position === _position) { throwError(state, "name of an anchor node must contain at least one character"); } state.anchor = state.input.slice(_position, state.position); return true; } function readAlias(state) { var _position, alias, ch; ch = state.input.charCodeAt(state.position); if (ch !== 42) return false; ch = state.input.charCodeAt(++state.position); _position = state.position; while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { ch = state.input.charCodeAt(++state.position); } if (state.position === _position) { throwError(state, "name of an alias node must contain at least one character"); } alias = state.input.slice(_position, state.position); if (!_hasOwnProperty.call(state.anchorMap, alias)) { throwError(state, 'unidentified alias "' + alias + '"'); } state.result = state.anchorMap[alias]; skipSeparationSpace(state, true, -1); return true; } function composeNode2(state, parentIndent, nodeContext, allowToSeek, allowCompact) { var allowBlockStyles, allowBlockScalars, allowBlockCollections, indentStatus = 1, atNewLine = false, hasContent = false, typeIndex, typeQuantity, type, flowIndent, blockIndent; if (state.listener !== null) { state.listener("open", state); } state.tag = null; state.anchor = null; state.kind = null; state.result = null; allowBlockStyles = allowBlockScalars = allowBlockCollections = CONTEXT_BLOCK_OUT === nodeContext || CONTEXT_BLOCK_IN === nodeContext; if (allowToSeek) { if (skipSeparationSpace(state, true, -1)) { atNewLine = true; if (state.lineIndent > parentIndent) { indentStatus = 1; } else if (state.lineIndent === parentIndent) { indentStatus = 0; } else if (state.lineIndent < parentIndent) { indentStatus = -1; } } } if (indentStatus === 1) { while (readTagProperty(state) || readAnchorProperty(state)) { if (skipSeparationSpace(state, true, -1)) { atNewLine = true; allowBlockCollections = allowBlockStyles; if (state.lineIndent > parentIndent) { indentStatus = 1; } else if (state.lineIndent === parentIndent) { indentStatus = 0; } else if (state.lineIndent < parentIndent) { indentStatus = -1; } } else { allowBlockCollections = false; } } } if (allowBlockCollections) { allowBlockCollections = atNewLine || allowCompact; } if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) { if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) { flowIndent = parentIndent; } else { flowIndent = parentIndent + 1; } blockIndent = state.position - state.lineStart; if (indentStatus === 1) { if (allowBlockCollections && (readBlockSequence(state, blockIndent) || readBlockMapping(state, blockIndent, flowIndent)) || readFlowCollection(state, flowIndent)) { hasContent = true; } else { if (allowBlockScalars && readBlockScalar(state, flowIndent) || readSingleQuotedScalar(state, flowIndent) || readDoubleQuotedScalar(state, flowIndent)) { hasContent = true; } else if (readAlias(state)) { hasContent = true; if (state.tag !== null || state.anchor !== null) { throwError(state, "alias node should not have any properties"); } } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) { hasContent = true; if (state.tag === null) { state.tag = "?"; } } if (state.anchor !== null) { state.anchorMap[state.anchor] = state.result; } } } else if (indentStatus === 0) { hasContent = allowBlockCollections && readBlockSequence(state, blockIndent); } } if (state.tag !== null && state.tag !== "!") { if (state.tag === "?") { if (state.result !== null && state.kind !== "scalar") { throwError(state, 'unacceptable node kind for ! tag; it should be "scalar", not "' + state.kind + '"'); } for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) { type = state.implicitTypes[typeIndex]; if (type.resolve(state.result)) { state.result = type.construct(state.result); state.tag = type.tag; if (state.anchor !== null) { state.anchorMap[state.anchor] = state.result; } break; } } } else if (_hasOwnProperty.call(state.typeMap[state.kind || "fallback"], state.tag)) { type = state.typeMap[state.kind || "fallback"][state.tag]; if (state.result !== null && type.kind !== state.kind) { throwError(state, "unacceptable node kind for !<" + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"'); } if (!type.resolve(state.result)) { throwError(state, "cannot resolve a node with !<" + state.tag + "> explicit tag"); } else { state.result = type.construct(state.result); if (state.anchor !== null) { state.anchorMap[state.anchor] = state.result; } } } else { throwError(state, "unknown tag !<" + state.tag + ">"); } } if (state.listener !== null) { state.listener("close", state); } return state.tag !== null || state.anchor !== null || hasContent; } function readDocument(state) { var documentStart = state.position, _position, directiveName, directiveArgs, hasDirectives = false, ch; state.version = null; state.checkLineBreaks = state.legacy; state.tagMap = {}; state.anchorMap = {}; while ((ch = state.input.charCodeAt(state.position)) !== 0) { skipSeparationSpace(state, true, -1); ch = state.input.charCodeAt(state.position); if (state.lineIndent > 0 || ch !== 37) { break; } hasDirectives = true; ch = state.input.charCodeAt(++state.position); _position = state.position; while (ch !== 0 && !is_WS_OR_EOL(ch)) { ch = state.input.charCodeAt(++state.position); } directiveName = state.input.slice(_position, state.position); directiveArgs = []; if (directiveName.length < 1) { throwError(state, "directive name must not be less than one character in length"); } while (ch !== 0) { while (is_WHITE_SPACE(ch)) { ch = state.input.charCodeAt(++state.position); } if (ch === 35) { do { ch = state.input.charCodeAt(++state.position); } while (ch !== 0 && !is_EOL(ch)); break; } if (is_EOL(ch)) break; _position = state.position; while (ch !== 0 && !is_WS_OR_EOL(ch)) { ch = state.input.charCodeAt(++state.position); } directiveArgs.push(state.input.slice(_position, state.position)); } if (ch !== 0) readLineBreak(state); if (_hasOwnProperty.call(directiveHandlers, directiveName)) { directiveHandlers[directiveName](state, directiveName, directiveArgs); } else { throwWarning(state, 'unknown document directive "' + directiveName + '"'); } } skipSeparationSpace(state, true, -1); if (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 45 && state.input.charCodeAt(state.position + 1) === 45 && state.input.charCodeAt(state.position + 2) === 45) { state.position += 3; skipSeparationSpace(state, true, -1); } else if (hasDirectives) { throwError(state, "directives end mark is expected"); } composeNode2(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true); skipSeparationSpace(state, true, -1); if (state.checkLineBreaks && PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) { throwWarning(state, "non-ASCII line breaks are interpreted as content"); } state.documents.push(state.result); if (state.position === state.lineStart && testDocumentSeparator(state)) { if (state.input.charCodeAt(state.position) === 46) { state.position += 3; skipSeparationSpace(state, true, -1); } return; } if (state.position < state.length - 1) { throwError(state, "end of the stream or a document separator is expected"); } else { return; } } function loadDocuments(input, options) { input = String(input); options = options || {}; if (input.length !== 0) { if (input.charCodeAt(input.length - 1) !== 10 && input.charCodeAt(input.length - 1) !== 13) { input += "\n"; } if (input.charCodeAt(0) === 65279) { input = input.slice(1); } } var state = new State(input, options); var nullpos = input.indexOf("\0"); if (nullpos !== -1) { state.position = nullpos; throwError(state, "null byte is not allowed in input"); } state.input += "\0"; while (state.input.charCodeAt(state.position) === 32) { state.lineIndent += 1; state.position += 1; } while (state.position < state.length - 1) { readDocument(state); } return state.documents; } function loadAll(input, iterator, options) { if (iterator !== null && typeof iterator === "object" && typeof options === "undefined") { options = iterator; iterator = null; } var documents = loadDocuments(input, options); if (typeof iterator !== "function") { return documents; } for (var index = 0, length = documents.length; index < length; index += 1) { iterator(documents[index]); } } function load(input, options) { var documents = loadDocuments(input, options); if (documents.length === 0) { return void 0; } else if (documents.length === 1) { return documents[0]; } throw new YAMLException("expected a single document in the stream, but found more"); } function safeLoadAll(input, iterator, options) { if (typeof iterator === "object" && iterator !== null && typeof options === "undefined") { options = iterator; iterator = null; } return loadAll(input, iterator, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options)); } function safeLoad(input, options) { return load(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options)); } module2.exports.loadAll = loadAll; module2.exports.load = load; module2.exports.safeLoadAll = safeLoadAll; module2.exports.safeLoad = safeLoad; } }); // node_modules/js-yaml/lib/js-yaml/dumper.js var require_dumper = __commonJS({ "node_modules/js-yaml/lib/js-yaml/dumper.js"(exports, module2) { "use strict"; var common = require_common2(); var YAMLException = require_exception(); var DEFAULT_FULL_SCHEMA = require_default_full(); var DEFAULT_SAFE_SCHEMA = require_default_safe(); var _toString = Object.prototype.toString; var _hasOwnProperty = Object.prototype.hasOwnProperty; var CHAR_TAB = 9; var CHAR_LINE_FEED = 10; var CHAR_CARRIAGE_RETURN = 13; var CHAR_SPACE = 32; var CHAR_EXCLAMATION = 33; var CHAR_DOUBLE_QUOTE = 34; var CHAR_SHARP = 35; var CHAR_PERCENT = 37; var CHAR_AMPERSAND = 38; var CHAR_SINGLE_QUOTE = 39; var CHAR_ASTERISK = 42; var CHAR_COMMA = 44; var CHAR_MINUS = 45; var CHAR_COLON = 58; var CHAR_EQUALS = 61; var CHAR_GREATER_THAN = 62; var CHAR_QUESTION = 63; var CHAR_COMMERCIAL_AT = 64; var CHAR_LEFT_SQUARE_BRACKET = 91; var CHAR_RIGHT_SQUARE_BRACKET = 93; var CHAR_GRAVE_ACCENT = 96; var CHAR_LEFT_CURLY_BRACKET = 123; var CHAR_VERTICAL_LINE = 124; var CHAR_RIGHT_CURLY_BRACKET = 125; var ESCAPE_SEQUENCES = {}; ESCAPE_SEQUENCES[0] = "\\0"; ESCAPE_SEQUENCES[7] = "\\a"; ESCAPE_SEQUENCES[8] = "\\b"; ESCAPE_SEQUENCES[9] = "\\t"; ESCAPE_SEQUENCES[10] = "\\n"; ESCAPE_SEQUENCES[11] = "\\v"; ESCAPE_SEQUENCES[12] = "\\f"; ESCAPE_SEQUENCES[13] = "\\r"; ESCAPE_SEQUENCES[27] = "\\e"; ESCAPE_SEQUENCES[34] = '\\"'; ESCAPE_SEQUENCES[92] = "\\\\"; ESCAPE_SEQUENCES[133] = "\\N"; ESCAPE_SEQUENCES[160] = "\\_"; ESCAPE_SEQUENCES[8232] = "\\L"; ESCAPE_SEQUENCES[8233] = "\\P"; var DEPRECATED_BOOLEANS_SYNTAX = [ "y", "Y", "yes", "Yes", "YES", "on", "On", "ON", "n", "N", "no", "No", "NO", "off", "Off", "OFF" ]; function compileStyleMap(schema4, map2) { var result, keys, index, length, tag, style, type; if (map2 === null) return {}; result = {}; keys = Object.keys(map2); for (index = 0, length = keys.length; index < length; index += 1) { tag = keys[index]; style = String(map2[tag]); if (tag.slice(0, 2) === "!!") { tag = "tag:yaml.org,2002:" + tag.slice(2); } type = schema4.compiledTypeMap["fallback"][tag]; if (type && _hasOwnProperty.call(type.styleAliases, style)) { style = type.styleAliases[style]; } result[tag] = style; } return result; } function encodeHex(character) { var string2, handle, length; string2 = character.toString(16).toUpperCase(); if (character <= 255) { handle = "x"; length = 2; } else if (character <= 65535) { handle = "u"; length = 4; } else if (character <= 4294967295) { handle = "U"; length = 8; } else { throw new YAMLException("code point within a string may not be greater than 0xFFFFFFFF"); } return "\\" + handle + common.repeat("0", length - string2.length) + string2; } function State(options) { this.schema = options["schema"] || DEFAULT_FULL_SCHEMA; this.indent = Math.max(1, options["indent"] || 2); this.noArrayIndent = options["noArrayIndent"] || false; this.skipInvalid = options["skipInvalid"] || false; this.flowLevel = common.isNothing(options["flowLevel"]) ? -1 : options["flowLevel"]; this.styleMap = compileStyleMap(this.schema, options["styles"] || null); this.sortKeys = options["sortKeys"] || false; this.lineWidth = options["lineWidth"] || 80; this.noRefs = options["noRefs"] || false; this.noCompatMode = options["noCompatMode"] || false; this.condenseFlow = options["condenseFlow"] || false; this.implicitTypes = this.schema.compiledImplicit; this.explicitTypes = this.schema.compiledExplicit; this.tag = null; this.result = ""; this.duplicates = []; this.usedDuplicates = null; } function indentString(string2, spaces) { var ind = common.repeat(" ", spaces), position = 0, next = -1, result = "", line, length = string2.length; while (position < length) { next = string2.indexOf("\n", position); if (next === -1) { line = string2.slice(position); position = length; } else { line = string2.slice(position, next + 1); position = next + 1; } if (line.length && line !== "\n") result += ind; result += line; } return result; } function generateNextLine(state, level) { return "\n" + common.repeat(" ", state.indent * level); } function testImplicitResolving(state, str) { var index, length, type; for (index = 0, length = state.implicitTypes.length; index < length; index += 1) { type = state.implicitTypes[index]; if (type.resolve(str)) { return true; } } return false; } function isWhitespace(c) { return c === CHAR_SPACE || c === CHAR_TAB; } function isPrintable(c) { return 32 <= c && c <= 126 || 161 <= c && c <= 55295 && c !== 8232 && c !== 8233 || 57344 <= c && c <= 65533 && c !== 65279 || 65536 <= c && c <= 1114111; } function isNsChar(c) { return isPrintable(c) && !isWhitespace(c) && c !== 65279 && c !== CHAR_CARRIAGE_RETURN && c !== CHAR_LINE_FEED; } function isPlainSafe(c, prev) { return isPrintable(c) && c !== 65279 && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET && c !== CHAR_COLON && (c !== CHAR_SHARP || prev && isNsChar(prev)); } function isPlainSafeFirst(c) { return isPrintable(c) && c !== 65279 && !isWhitespace(c) && c !== CHAR_MINUS && c !== CHAR_QUESTION && c !== CHAR_COLON && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET && c !== CHAR_SHARP && c !== CHAR_AMPERSAND && c !== CHAR_ASTERISK && c !== CHAR_EXCLAMATION && c !== CHAR_VERTICAL_LINE && c !== CHAR_EQUALS && c !== CHAR_GREATER_THAN && c !== CHAR_SINGLE_QUOTE && c !== CHAR_DOUBLE_QUOTE && c !== CHAR_PERCENT && c !== CHAR_COMMERCIAL_AT && c !== CHAR_GRAVE_ACCENT; } function needIndentIndicator(string2) { var leadingSpaceRe = /^\n* /; return leadingSpaceRe.test(string2); } var STYLE_PLAIN = 1; var STYLE_SINGLE = 2; var STYLE_LITERAL = 3; var STYLE_FOLDED = 4; var STYLE_DOUBLE = 5; function chooseScalarStyle(string2, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType) { var i; var char, prev_char; var hasLineBreak = false; var hasFoldableLine = false; var shouldTrackWidth = lineWidth !== -1; var previousLineBreak = -1; var plain = isPlainSafeFirst(string2.charCodeAt(0)) && !isWhitespace(string2.charCodeAt(string2.length - 1)); if (singleLineOnly) { for (i = 0; i < string2.length; i++) { char = string2.charCodeAt(i); if (!isPrintable(char)) { return STYLE_DOUBLE; } prev_char = i > 0 ? string2.charCodeAt(i - 1) : null; plain = plain && isPlainSafe(char, prev_char); } } else { for (i = 0; i < string2.length; i++) { char = string2.charCodeAt(i); if (char === CHAR_LINE_FEED) { hasLineBreak = true; if (shouldTrackWidth) { hasFoldableLine = hasFoldableLine || i - previousLineBreak - 1 > lineWidth && string2[previousLineBreak + 1] !== " "; previousLineBreak = i; } } else if (!isPrintable(char)) { return STYLE_DOUBLE; } prev_char = i > 0 ? string2.charCodeAt(i - 1) : null; plain = plain && isPlainSafe(char, prev_char); } hasFoldableLine = hasFoldableLine || shouldTrackWidth && (i - previousLineBreak - 1 > lineWidth && string2[previousLineBreak + 1] !== " "); } if (!hasLineBreak && !hasFoldableLine) { return plain && !testAmbiguousType(string2) ? STYLE_PLAIN : STYLE_SINGLE; } if (indentPerLevel > 9 && needIndentIndicator(string2)) { return STYLE_DOUBLE; } return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL; } function writeScalar(state, string2, level, iskey) { state.dump = function() { if (string2.length === 0) { return "''"; } if (!state.noCompatMode && DEPRECATED_BOOLEANS_SYNTAX.indexOf(string2) !== -1) { return "'" + string2 + "'"; } var indent = state.indent * Math.max(1, level); var lineWidth = state.lineWidth === -1 ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent); var singleLineOnly = iskey || state.flowLevel > -1 && level >= state.flowLevel; function testAmbiguity(string3) { return testImplicitResolving(state, string3); } switch (chooseScalarStyle(string2, singleLineOnly, state.indent, lineWidth, testAmbiguity)) { case STYLE_PLAIN: return string2; case STYLE_SINGLE: return "'" + string2.replace(/'/g, "''") + "'"; case STYLE_LITERAL: return "|" + blockHeader(string2, state.indent) + dropEndingNewline(indentString(string2, indent)); case STYLE_FOLDED: return ">" + blockHeader(string2, state.indent) + dropEndingNewline(indentString(foldString(string2, lineWidth), indent)); case STYLE_DOUBLE: return '"' + escapeString(string2, lineWidth) + '"'; default: throw new YAMLException("impossible error: invalid scalar style"); } }(); } function blockHeader(string2, indentPerLevel) { var indentIndicator = needIndentIndicator(string2) ? String(indentPerLevel) : ""; var clip = string2[string2.length - 1] === "\n"; var keep = clip && (string2[string2.length - 2] === "\n" || string2 === "\n"); var chomp = keep ? "+" : clip ? "" : "-"; return indentIndicator + chomp + "\n"; } function dropEndingNewline(string2) { return string2[string2.length - 1] === "\n" ? string2.slice(0, -1) : string2; } function foldString(string2, width) { var lineRe = /(\n+)([^\n]*)/g; var result = function() { var nextLF = string2.indexOf("\n"); nextLF = nextLF !== -1 ? nextLF : string2.length; lineRe.lastIndex = nextLF; return foldLine(string2.slice(0, nextLF), width); }(); var prevMoreIndented = string2[0] === "\n" || string2[0] === " "; var moreIndented; var match; while (match = lineRe.exec(string2)) { var prefix = match[1], line = match[2]; moreIndented = line[0] === " "; result += prefix + (!prevMoreIndented && !moreIndented && line !== "" ? "\n" : "") + foldLine(line, width); prevMoreIndented = moreIndented; } return result; } function foldLine(line, width) { if (line === "" || line[0] === " ") return line; var breakRe = / [^ ]/g; var match; var start = 0, end, curr = 0, next = 0; var result = ""; while (match = breakRe.exec(line)) { next = match.index; if (next - start > width) { end = curr > start ? curr : next; result += "\n" + line.slice(start, end); start = end + 1; } curr = next; } result += "\n"; if (line.length - start > width && curr > start) { result += line.slice(start, curr) + "\n" + line.slice(curr + 1); } else { result += line.slice(start); } return result.slice(1); } function escapeString(string2) { var result = ""; var char, nextChar; var escapeSeq; for (var i = 0; i < string2.length; i++) { char = string2.charCodeAt(i); if (char >= 55296 && char <= 56319) { nextChar = string2.charCodeAt(i + 1); if (nextChar >= 56320 && nextChar <= 57343) { result += encodeHex((char - 55296) * 1024 + nextChar - 56320 + 65536); i++; continue; } } escapeSeq = ESCAPE_SEQUENCES[char]; result += !escapeSeq && isPrintable(char) ? string2[i] : escapeSeq || encodeHex(char); } return result; } function writeFlowSequence(state, level, object) { var _result = "", _tag = state.tag, index, length; for (index = 0, length = object.length; index < length; index += 1) { if (writeNode(state, level, object[index], false, false)) { if (index !== 0) _result += "," + (!state.condenseFlow ? " " : ""); _result += state.dump; } } state.tag = _tag; state.dump = "[" + _result + "]"; } function writeBlockSequence(state, level, object, compact) { var _result = "", _tag = state.tag, index, length; for (index = 0, length = object.length; index < length; index += 1) { if (writeNode(state, level + 1, object[index], true, true)) { if (!compact || index !== 0) { _result += generateNextLine(state, level); } if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { _result += "-"; } else { _result += "- "; } _result += state.dump; } } state.tag = _tag; state.dump = _result || "[]"; } function writeFlowMapping(state, level, object) { var _result = "", _tag = state.tag, objectKeyList = Object.keys(object), index, length, objectKey, objectValue, pairBuffer; for (index = 0, length = objectKeyList.length; index < length; index += 1) { pairBuffer = ""; if (index !== 0) pairBuffer += ", "; if (state.condenseFlow) pairBuffer += '"'; objectKey = objectKeyList[index]; objectValue = object[objectKey]; if (!writeNode(state, level, objectKey, false, false)) { continue; } if (state.dump.length > 1024) pairBuffer += "? "; pairBuffer += state.dump + (state.condenseFlow ? '"' : "") + ":" + (state.condenseFlow ? "" : " "); if (!writeNode(state, level, objectValue, false, false)) { continue; } pairBuffer += state.dump; _result += pairBuffer; } state.tag = _tag; state.dump = "{" + _result + "}"; } function writeBlockMapping(state, level, object, compact) { var _result = "", _tag = state.tag, objectKeyList = Object.keys(object), index, length, objectKey, objectValue, explicitPair, pairBuffer; if (state.sortKeys === true) { objectKeyList.sort(); } else if (typeof state.sortKeys === "function") { objectKeyList.sort(state.sortKeys); } else if (state.sortKeys) { throw new YAMLException("sortKeys must be a boolean or a function"); } for (index = 0, length = objectKeyList.length; index < length; index += 1) { pairBuffer = ""; if (!compact || index !== 0) { pairBuffer += generateNextLine(state, level); } objectKey = objectKeyList[index]; objectValue = object[objectKey]; if (!writeNode(state, level + 1, objectKey, true, true, true)) { continue; } explicitPair = state.tag !== null && state.tag !== "?" || state.dump && state.dump.length > 1024; if (explicitPair) { if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { pairBuffer += "?"; } else { pairBuffer += "? "; } } pairBuffer += state.dump; if (explicitPair) { pairBuffer += generateNextLine(state, level); } if (!writeNode(state, level + 1, objectValue, true, explicitPair)) { continue; } if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { pairBuffer += ":"; } else { pairBuffer += ": "; } pairBuffer += state.dump; _result += pairBuffer; } state.tag = _tag; state.dump = _result || "{}"; } function detectType(state, object, explicit) { var _result, typeList, index, length, type, style; typeList = explicit ? state.explicitTypes : state.implicitTypes; for (index = 0, length = typeList.length; index < length; index += 1) { type = typeList[index]; if ((type.instanceOf || type.predicate) && (!type.instanceOf || typeof object === "object" && object instanceof type.instanceOf) && (!type.predicate || type.predicate(object))) { state.tag = explicit ? type.tag : "?"; if (type.represent) { style = state.styleMap[type.tag] || type.defaultStyle; if (_toString.call(type.represent) === "[object Function]") { _result = type.represent(object, style); } else if (_hasOwnProperty.call(type.represent, style)) { _result = type.represent[style](object, style); } else { throw new YAMLException("!<" + type.tag + '> tag resolver accepts not "' + style + '" style'); } state.dump = _result; } return true; } } return false; } function writeNode(state, level, object, block, compact, iskey) { state.tag = null; state.dump = object; if (!detectType(state, object, false)) { detectType(state, object, true); } var type = _toString.call(state.dump); if (block) { block = state.flowLevel < 0 || state.flowLevel > level; } var objectOrArray = type === "[object Object]" || type === "[object Array]", duplicateIndex, duplicate; if (objectOrArray) { duplicateIndex = state.duplicates.indexOf(object); duplicate = duplicateIndex !== -1; } if (state.tag !== null && state.tag !== "?" || duplicate || state.indent !== 2 && level > 0) { compact = false; } if (duplicate && state.usedDuplicates[duplicateIndex]) { state.dump = "*ref_" + duplicateIndex; } else { if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) { state.usedDuplicates[duplicateIndex] = true; } if (type === "[object Object]") { if (block && Object.keys(state.dump).length !== 0) { writeBlockMapping(state, level, state.dump, compact); if (duplicate) { state.dump = "&ref_" + duplicateIndex + state.dump; } } else { writeFlowMapping(state, level, state.dump); if (duplicate) { state.dump = "&ref_" + duplicateIndex + " " + state.dump; } } } else if (type === "[object Array]") { var arrayLevel = state.noArrayIndent && level > 0 ? level - 1 : level; if (block && state.dump.length !== 0) { writeBlockSequence(state, arrayLevel, state.dump, compact); if (duplicate) { state.dump = "&ref_" + duplicateIndex + state.dump; } } else { writeFlowSequence(state, arrayLevel, state.dump); if (duplicate) { state.dump = "&ref_" + duplicateIndex + " " + state.dump; } } } else if (type === "[object String]") { if (state.tag !== "?") { writeScalar(state, state.dump, level, iskey); } } else { if (state.skipInvalid) return false; throw new YAMLException("unacceptable kind of an object to dump " + type); } if (state.tag !== null && state.tag !== "?") { state.dump = "!<" + state.tag + "> " + state.dump; } } return true; } function getDuplicateReferences(object, state) { var objects = [], duplicatesIndexes = [], index, length; inspectNode(object, objects, duplicatesIndexes); for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) { state.duplicates.push(objects[duplicatesIndexes[index]]); } state.usedDuplicates = new Array(length); } function inspectNode(object, objects, duplicatesIndexes) { var objectKeyList, index, length; if (object !== null && typeof object === "object") { index = objects.indexOf(object); if (index !== -1) { if (duplicatesIndexes.indexOf(index) === -1) { duplicatesIndexes.push(index); } } else { objects.push(object); if (Array.isArray(object)) { for (index = 0, length = object.length; index < length; index += 1) { inspectNode(object[index], objects, duplicatesIndexes); } } else { objectKeyList = Object.keys(object); for (index = 0, length = objectKeyList.length; index < length; index += 1) { inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes); } } } } } function dump(input, options) { options = options || {}; var state = new State(options); if (!state.noRefs) getDuplicateReferences(input, state); if (writeNode(state, 0, input, true, true)) return state.dump + "\n"; return ""; } function safeDump(input, options) { return dump(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options)); } module2.exports.dump = dump; module2.exports.safeDump = safeDump; } }); // node_modules/js-yaml/lib/js-yaml.js var require_js_yaml = __commonJS({ "node_modules/js-yaml/lib/js-yaml.js"(exports, module2) { "use strict"; var loader = require_loader(); var dumper = require_dumper(); function deprecated(name) { return function() { throw new Error("Function " + name + " is deprecated and cannot be used."); }; } module2.exports.Type = require_type(); module2.exports.Schema = require_schema(); module2.exports.FAILSAFE_SCHEMA = require_failsafe(); module2.exports.JSON_SCHEMA = require_json(); module2.exports.CORE_SCHEMA = require_core2(); module2.exports.DEFAULT_SAFE_SCHEMA = require_default_safe(); module2.exports.DEFAULT_FULL_SCHEMA = require_default_full(); module2.exports.load = loader.load; module2.exports.loadAll = loader.loadAll; module2.exports.safeLoad = loader.safeLoad; module2.exports.safeLoadAll = loader.safeLoadAll; module2.exports.dump = dumper.dump; module2.exports.safeDump = dumper.safeDump; module2.exports.YAMLException = require_exception(); module2.exports.MINIMAL_SCHEMA = require_failsafe(); module2.exports.SAFE_SCHEMA = require_default_safe(); module2.exports.DEFAULT_SCHEMA = require_default_full(); module2.exports.scan = deprecated("scan"); module2.exports.parse = deprecated("parse"); module2.exports.compose = deprecated("compose"); module2.exports.addConstructor = deprecated("addConstructor"); } }); // node_modules/js-yaml/index.js var require_js_yaml2 = __commonJS({ "node_modules/js-yaml/index.js"(exports, module2) { "use strict"; var yaml2 = require_js_yaml(); module2.exports = yaml2; } }); // main.ts __export(exports, { default: () => MyPlugin }); var import_obsidian3 = __toModule(require("obsidian")); var import_path = __toModule(require("path")); var fs2 = __toModule(require("fs")); // icon.ts var import_obsidian = __toModule(require("obsidian")); var icons = { "notion-logo": ` ` }; var addIcons = () => { Object.keys(icons).forEach((key) => { (0, import_obsidian.addIcon)(key, icons[key]); }); }; // Upload2Notion.ts var import_obsidian2 = __toModule(require("obsidian")); var import_martian = __toModule(require_src()); var fs = __toModule(require("fs")); // node_modules/yaml-front-matter/src/index.js var jsYaml = require_js_yaml2(); function parse(text, options, loadSafe) { let contentKeyName = options && typeof options === "string" ? options : options && options.contentKeyName ? options.contentKeyName : "__content"; let passThroughOptions = options && typeof options === "object" ? options : void 0; let re = /^(-{3}(?:\n|\r)([\w\W]+?)(?:\n|\r)-{3})?([\w\W]*)*/, results = re.exec(text), conf = {}, yamlOrJson; if (yamlOrJson = results[2]) { if (yamlOrJson.charAt(0) === "{") { conf = JSON.parse(yamlOrJson); } else { if (loadSafe) { conf = jsYaml.safeLoad(yamlOrJson, passThroughOptions); } else { conf = jsYaml.load(yamlOrJson, passThroughOptions); } } } conf[contentKeyName] = results[3] || ""; return conf; } function loadFront(content, options) { return parse(content, options, false); } // node_modules/yaml/browser/dist/nodes/Node.js var ALIAS = Symbol.for("yaml.alias"); var DOC = Symbol.for("yaml.document"); var MAP = Symbol.for("yaml.map"); var PAIR = Symbol.for("yaml.pair"); var SCALAR = Symbol.for("yaml.scalar"); var SEQ = Symbol.for("yaml.seq"); var NODE_TYPE = Symbol.for("yaml.node.type"); var isAlias = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === ALIAS; var isDocument = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === DOC; var isMap = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === MAP; var isPair = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === PAIR; var isScalar = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === SCALAR; var isSeq = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === SEQ; function isCollection(node) { if (node && typeof node === "object") switch (node[NODE_TYPE]) { case MAP: case SEQ: return true; } return false; } function isNode(node) { if (node && typeof node === "object") switch (node[NODE_TYPE]) { case ALIAS: case MAP: case SCALAR: case SEQ: return true; } return false; } var hasAnchor = (node) => (isScalar(node) || isCollection(node)) && !!node.anchor; var NodeBase = class { constructor(type) { Object.defineProperty(this, NODE_TYPE, { value: type }); } clone() { const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this)); if (this.range) copy.range = this.range.slice(); return copy; } }; // node_modules/yaml/browser/dist/visit.js var BREAK = Symbol("break visit"); var SKIP = Symbol("skip children"); var REMOVE = Symbol("remove node"); function visit(node, visitor) { const visitor_ = initVisitor(visitor); if (isDocument(node)) { const cd = visit_(null, node.contents, visitor_, Object.freeze([node])); if (cd === REMOVE) node.contents = null; } else visit_(null, node, visitor_, Object.freeze([])); } visit.BREAK = BREAK; visit.SKIP = SKIP; visit.REMOVE = REMOVE; function visit_(key, node, visitor, path) { const ctrl = callVisitor(key, node, visitor, path); if (isNode(ctrl) || isPair(ctrl)) { replaceNode(key, path, ctrl); return visit_(key, ctrl, visitor, path); } if (typeof ctrl !== "symbol") { if (isCollection(node)) { path = Object.freeze(path.concat(node)); for (let i = 0; i < node.items.length; ++i) { const ci = visit_(i, node.items[i], visitor, path); if (typeof ci === "number") i = ci - 1; else if (ci === BREAK) return BREAK; else if (ci === REMOVE) { node.items.splice(i, 1); i -= 1; } } } else if (isPair(node)) { path = Object.freeze(path.concat(node)); const ck = visit_("key", node.key, visitor, path); if (ck === BREAK) return BREAK; else if (ck === REMOVE) node.key = null; const cv = visit_("value", node.value, visitor, path); if (cv === BREAK) return BREAK; else if (cv === REMOVE) node.value = null; } } return ctrl; } function visitAsync(node, visitor) { return __async(this, null, function* () { const visitor_ = initVisitor(visitor); if (isDocument(node)) { const cd = yield visitAsync_(null, node.contents, visitor_, Object.freeze([node])); if (cd === REMOVE) node.contents = null; } else yield visitAsync_(null, node, visitor_, Object.freeze([])); }); } visitAsync.BREAK = BREAK; visitAsync.SKIP = SKIP; visitAsync.REMOVE = REMOVE; function visitAsync_(key, node, visitor, path) { return __async(this, null, function* () { const ctrl = yield callVisitor(key, node, visitor, path); if (isNode(ctrl) || isPair(ctrl)) { replaceNode(key, path, ctrl); return visitAsync_(key, ctrl, visitor, path); } if (typeof ctrl !== "symbol") { if (isCollection(node)) { path = Object.freeze(path.concat(node)); for (let i = 0; i < node.items.length; ++i) { const ci = yield visitAsync_(i, node.items[i], visitor, path); if (typeof ci === "number") i = ci - 1; else if (ci === BREAK) return BREAK; else if (ci === REMOVE) { node.items.splice(i, 1); i -= 1; } } } else if (isPair(node)) { path = Object.freeze(path.concat(node)); const ck = yield visitAsync_("key", node.key, visitor, path); if (ck === BREAK) return BREAK; else if (ck === REMOVE) node.key = null; const cv = yield visitAsync_("value", node.value, visitor, path); if (cv === BREAK) return BREAK; else if (cv === REMOVE) node.value = null; } } return ctrl; }); } function initVisitor(visitor) { if (typeof visitor === "object" && (visitor.Collection || visitor.Node || visitor.Value)) { return Object.assign({ Alias: visitor.Node, Map: visitor.Node, Scalar: visitor.Node, Seq: visitor.Node }, visitor.Value && { Map: visitor.Value, Scalar: visitor.Value, Seq: visitor.Value }, visitor.Collection && { Map: visitor.Collection, Seq: visitor.Collection }, visitor); } return visitor; } function callVisitor(key, node, visitor, path) { var _a, _b, _c, _d, _e; if (typeof visitor === "function") return visitor(key, node, path); if (isMap(node)) return (_a = visitor.Map) == null ? void 0 : _a.call(visitor, key, node, path); if (isSeq(node)) return (_b = visitor.Seq) == null ? void 0 : _b.call(visitor, key, node, path); if (isPair(node)) return (_c = visitor.Pair) == null ? void 0 : _c.call(visitor, key, node, path); if (isScalar(node)) return (_d = visitor.Scalar) == null ? void 0 : _d.call(visitor, key, node, path); if (isAlias(node)) return (_e = visitor.Alias) == null ? void 0 : _e.call(visitor, key, node, path); return void 0; } function replaceNode(key, path, node) { const parent = path[path.length - 1]; if (isCollection(parent)) { parent.items[key] = node; } else if (isPair(parent)) { if (key === "key") parent.key = node; else parent.value = node; } else if (isDocument(parent)) { parent.contents = node; } else { const pt = isAlias(parent) ? "alias" : "scalar"; throw new Error(`Cannot replace node with ${pt} parent`); } } // node_modules/yaml/browser/dist/doc/directives.js var escapeChars = { "!": "%21", ",": "%2C", "[": "%5B", "]": "%5D", "{": "%7B", "}": "%7D" }; var escapeTagName = (tn) => tn.replace(/[!,[\]{}]/g, (ch) => escapeChars[ch]); var Directives = class { constructor(yaml2, tags) { this.docStart = null; this.docEnd = false; this.yaml = Object.assign({}, Directives.defaultYaml, yaml2); this.tags = Object.assign({}, Directives.defaultTags, tags); } clone() { const copy = new Directives(this.yaml, this.tags); copy.docStart = this.docStart; return copy; } atDocument() { const res = new Directives(this.yaml, this.tags); switch (this.yaml.version) { case "1.1": this.atNextDocument = true; break; case "1.2": this.atNextDocument = false; this.yaml = { explicit: Directives.defaultYaml.explicit, version: "1.2" }; this.tags = Object.assign({}, Directives.defaultTags); break; } return res; } add(line, onError) { if (this.atNextDocument) { this.yaml = { explicit: Directives.defaultYaml.explicit, version: "1.1" }; this.tags = Object.assign({}, Directives.defaultTags); this.atNextDocument = false; } const parts = line.trim().split(/[ \t]+/); const name = parts.shift(); switch (name) { case "%TAG": { if (parts.length !== 2) { onError(0, "%TAG directive should contain exactly two parts"); if (parts.length < 2) return false; } const [handle, prefix] = parts; this.tags[handle] = prefix; return true; } case "%YAML": { this.yaml.explicit = true; if (parts.length !== 1) { onError(0, "%YAML directive should contain exactly one part"); return false; } const [version] = parts; if (version === "1.1" || version === "1.2") { this.yaml.version = version; return true; } else { const isValid = /^\d+\.\d+$/.test(version); onError(6, `Unsupported YAML version ${version}`, isValid); return false; } } default: onError(0, `Unknown directive ${name}`, true); return false; } } tagName(source, onError) { if (source === "!") return "!"; if (source[0] !== "!") { onError(`Not a valid tag: ${source}`); return null; } if (source[1] === "<") { const verbatim = source.slice(2, -1); if (verbatim === "!" || verbatim === "!!") { onError(`Verbatim tags aren't resolved, so ${source} is invalid.`); return null; } if (source[source.length - 1] !== ">") onError("Verbatim tags must end with a >"); return verbatim; } const [, handle, suffix] = source.match(/^(.*!)([^!]*)$/); if (!suffix) onError(`The ${source} tag has no suffix`); const prefix = this.tags[handle]; if (prefix) return prefix + decodeURIComponent(suffix); if (handle === "!") return source; onError(`Could not resolve tag: ${source}`); return null; } tagString(tag) { for (const [handle, prefix] of Object.entries(this.tags)) { if (tag.startsWith(prefix)) return handle + escapeTagName(tag.substring(prefix.length)); } return tag[0] === "!" ? tag : `!<${tag}>`; } toString(doc) { const lines = this.yaml.explicit ? [`%YAML ${this.yaml.version || "1.2"}`] : []; const tagEntries = Object.entries(this.tags); let tagNames; if (doc && tagEntries.length > 0 && isNode(doc.contents)) { const tags = {}; visit(doc.contents, (_key, node) => { if (isNode(node) && node.tag) tags[node.tag] = true; }); tagNames = Object.keys(tags); } else tagNames = []; for (const [handle, prefix] of tagEntries) { if (handle === "!!" && prefix === "tag:yaml.org,2002:") continue; if (!doc || tagNames.some((tn) => tn.startsWith(prefix))) lines.push(`%TAG ${handle} ${prefix}`); } return lines.join("\n"); } }; Directives.defaultYaml = { explicit: false, version: "1.2" }; Directives.defaultTags = { "!!": "tag:yaml.org,2002:" }; // node_modules/yaml/browser/dist/doc/anchors.js function anchorIsValid(anchor) { if (/[\x00-\x19\s,[\]{}]/.test(anchor)) { const sa = JSON.stringify(anchor); const msg = `Anchor must not contain whitespace or control characters: ${sa}`; throw new Error(msg); } return true; } function anchorNames(root) { const anchors = new Set(); visit(root, { Value(_key, node) { if (node.anchor) anchors.add(node.anchor); } }); return anchors; } function findNewAnchor(prefix, exclude) { for (let i = 1; true; ++i) { const name = `${prefix}${i}`; if (!exclude.has(name)) return name; } } function createNodeAnchors(doc, prefix) { const aliasObjects = []; const sourceObjects = new Map(); let prevAnchors = null; return { onAnchor: (source) => { aliasObjects.push(source); if (!prevAnchors) prevAnchors = anchorNames(doc); const anchor = findNewAnchor(prefix, prevAnchors); prevAnchors.add(anchor); return anchor; }, setAnchors: () => { for (const source of aliasObjects) { const ref = sourceObjects.get(source); if (typeof ref === "object" && ref.anchor && (isScalar(ref.node) || isCollection(ref.node))) { ref.node.anchor = ref.anchor; } else { const error = new Error("Failed to resolve repeated object (this should not happen)"); error.source = source; throw error; } } }, sourceObjects }; } // node_modules/yaml/browser/dist/nodes/Alias.js var Alias = class extends NodeBase { constructor(source) { super(ALIAS); this.source = source; Object.defineProperty(this, "tag", { set() { throw new Error("Alias nodes cannot have tags"); } }); } resolve(doc) { let found = void 0; visit(doc, { Node: (_key, node) => { if (node === this) return visit.BREAK; if (node.anchor === this.source) found = node; } }); return found; } toJSON(_arg, ctx) { if (!ctx) return { source: this.source }; const { anchors, doc, maxAliasCount } = ctx; const source = this.resolve(doc); if (!source) { const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`; throw new ReferenceError(msg); } const data = anchors.get(source); if (!data || data.res === void 0) { const msg = "This should not happen: Alias anchor was not resolved?"; throw new ReferenceError(msg); } if (maxAliasCount >= 0) { data.count += 1; if (data.aliasCount === 0) data.aliasCount = getAliasCount(doc, source, anchors); if (data.count * data.aliasCount > maxAliasCount) { const msg = "Excessive alias count indicates a resource exhaustion attack"; throw new ReferenceError(msg); } } return data.res; } toString(ctx, _onComment, _onChompKeep) { const src = `*${this.source}`; if (ctx) { anchorIsValid(this.source); if (ctx.options.verifyAliasOrder && !ctx.anchors.has(this.source)) { const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`; throw new Error(msg); } if (ctx.implicitKey) return `${src} `; } return src; } }; function getAliasCount(doc, node, anchors) { if (isAlias(node)) { const source = node.resolve(doc); const anchor = anchors && source && anchors.get(source); return anchor ? anchor.count * anchor.aliasCount : 0; } else if (isCollection(node)) { let count = 0; for (const item of node.items) { const c = getAliasCount(doc, item, anchors); if (c > count) count = c; } return count; } else if (isPair(node)) { const kc = getAliasCount(doc, node.key, anchors); const vc = getAliasCount(doc, node.value, anchors); return Math.max(kc, vc); } return 1; } // node_modules/yaml/browser/dist/nodes/toJS.js function toJS(value, arg, ctx) { if (Array.isArray(value)) return value.map((v, i) => toJS(v, String(i), ctx)); if (value && typeof value.toJSON === "function") { if (!ctx || !hasAnchor(value)) return value.toJSON(arg, ctx); const data = { aliasCount: 0, count: 1, res: void 0 }; ctx.anchors.set(value, data); ctx.onCreate = (res2) => { data.res = res2; delete ctx.onCreate; }; const res = value.toJSON(arg, ctx); if (ctx.onCreate) ctx.onCreate(res); return res; } if (typeof value === "bigint" && !(ctx == null ? void 0 : ctx.keep)) return Number(value); return value; } // node_modules/yaml/browser/dist/nodes/Scalar.js var isScalarValue = (value) => !value || typeof value !== "function" && typeof value !== "object"; var Scalar = class extends NodeBase { constructor(value) { super(SCALAR); this.value = value; } toJSON(arg, ctx) { return (ctx == null ? void 0 : ctx.keep) ? this.value : toJS(this.value, arg, ctx); } toString() { return String(this.value); } }; Scalar.BLOCK_FOLDED = "BLOCK_FOLDED"; Scalar.BLOCK_LITERAL = "BLOCK_LITERAL"; Scalar.PLAIN = "PLAIN"; Scalar.QUOTE_DOUBLE = "QUOTE_DOUBLE"; Scalar.QUOTE_SINGLE = "QUOTE_SINGLE"; // node_modules/yaml/browser/dist/doc/createNode.js var defaultTagPrefix = "tag:yaml.org,2002:"; function findTagObject(value, tagName, tags) { var _a; if (tagName) { const match = tags.filter((t) => t.tag === tagName); const tagObj = (_a = match.find((t) => !t.format)) != null ? _a : match[0]; if (!tagObj) throw new Error(`Tag ${tagName} not found`); return tagObj; } return tags.find((t) => { var _a2; return ((_a2 = t.identify) == null ? void 0 : _a2.call(t, value)) && !t.format; }); } function createNode(value, tagName, ctx) { var _a, _b; if (isDocument(value)) value = value.contents; if (isNode(value)) return value; if (isPair(value)) { const map2 = (_b = (_a = ctx.schema[MAP]).createNode) == null ? void 0 : _b.call(_a, ctx.schema, null, ctx); map2.items.push(value); return map2; } if (value instanceof String || value instanceof Number || value instanceof Boolean || typeof BigInt === "function" && value instanceof BigInt) { value = value.valueOf(); } const { aliasDuplicateObjects, onAnchor, onTagObj, schema: schema4, sourceObjects } = ctx; let ref = void 0; if (aliasDuplicateObjects && value && typeof value === "object") { ref = sourceObjects.get(value); if (ref) { if (!ref.anchor) ref.anchor = onAnchor(value); return new Alias(ref.anchor); } else { ref = { anchor: null, node: null }; sourceObjects.set(value, ref); } } if (tagName == null ? void 0 : tagName.startsWith("!!")) tagName = defaultTagPrefix + tagName.slice(2); let tagObj = findTagObject(value, tagName, schema4.tags); if (!tagObj) { if (value && typeof value.toJSON === "function") { value = value.toJSON(); } if (!value || typeof value !== "object") { const node2 = new Scalar(value); if (ref) ref.node = node2; return node2; } tagObj = value instanceof Map ? schema4[MAP] : Symbol.iterator in Object(value) ? schema4[SEQ] : schema4[MAP]; } if (onTagObj) { onTagObj(tagObj); delete ctx.onTagObj; } const node = (tagObj == null ? void 0 : tagObj.createNode) ? tagObj.createNode(ctx.schema, value, ctx) : new Scalar(value); if (tagName) node.tag = tagName; if (ref) ref.node = node; return node; } // node_modules/yaml/browser/dist/nodes/Collection.js function collectionFromPath(schema4, path, value) { let v = value; for (let i = path.length - 1; i >= 0; --i) { const k = path[i]; if (typeof k === "number" && Number.isInteger(k) && k >= 0) { const a = []; a[k] = v; v = a; } else { v = new Map([[k, v]]); } } return createNode(v, void 0, { aliasDuplicateObjects: false, keepUndefined: false, onAnchor: () => { throw new Error("This should not happen, please report a bug."); }, schema: schema4, sourceObjects: new Map() }); } var isEmptyPath = (path) => path == null || typeof path === "object" && !!path[Symbol.iterator]().next().done; var Collection = class extends NodeBase { constructor(type, schema4) { super(type); Object.defineProperty(this, "schema", { value: schema4, configurable: true, enumerable: false, writable: true }); } clone(schema4) { const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this)); if (schema4) copy.schema = schema4; copy.items = copy.items.map((it) => isNode(it) || isPair(it) ? it.clone(schema4) : it); if (this.range) copy.range = this.range.slice(); return copy; } addIn(path, value) { if (isEmptyPath(path)) this.add(value); else { const [key, ...rest] = path; const node = this.get(key, true); if (isCollection(node)) node.addIn(rest, value); else if (node === void 0 && this.schema) this.set(key, collectionFromPath(this.schema, rest, value)); else throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`); } } deleteIn(path) { const [key, ...rest] = path; if (rest.length === 0) return this.delete(key); const node = this.get(key, true); if (isCollection(node)) return node.deleteIn(rest); else throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`); } getIn(path, keepScalar) { const [key, ...rest] = path; const node = this.get(key, true); if (rest.length === 0) return !keepScalar && isScalar(node) ? node.value : node; else return isCollection(node) ? node.getIn(rest, keepScalar) : void 0; } hasAllNullValues(allowScalar) { return this.items.every((node) => { if (!isPair(node)) return false; const n = node.value; return n == null || allowScalar && isScalar(n) && n.value == null && !n.commentBefore && !n.comment && !n.tag; }); } hasIn(path) { const [key, ...rest] = path; if (rest.length === 0) return this.has(key); const node = this.get(key, true); return isCollection(node) ? node.hasIn(rest) : false; } setIn(path, value) { const [key, ...rest] = path; if (rest.length === 0) { this.set(key, value); } else { const node = this.get(key, true); if (isCollection(node)) node.setIn(rest, value); else if (node === void 0 && this.schema) this.set(key, collectionFromPath(this.schema, rest, value)); else throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`); } } }; Collection.maxFlowStringSingleLineLength = 60; // node_modules/yaml/browser/dist/stringify/stringifyComment.js var stringifyComment = (str) => str.replace(/^(?!$)(?: $)?/gm, "#"); function indentComment(comment, indent) { if (/^\n+$/.test(comment)) return comment.substring(1); return indent ? comment.replace(/^(?! *$)/gm, indent) : comment; } var lineComment = (str, indent, comment) => str.endsWith("\n") ? indentComment(comment, indent) : comment.includes("\n") ? "\n" + indentComment(comment, indent) : (str.endsWith(" ") ? "" : " ") + comment; // node_modules/yaml/browser/dist/stringify/foldFlowLines.js var FOLD_FLOW = "flow"; var FOLD_BLOCK = "block"; var FOLD_QUOTED = "quoted"; function foldFlowLines(text, indent, mode = "flow", { indentAtStart, lineWidth = 80, minContentWidth = 20, onFold, onOverflow } = {}) { if (!lineWidth || lineWidth < 0) return text; const endStep = Math.max(1 + minContentWidth, 1 + lineWidth - indent.length); if (text.length <= endStep) return text; const folds = []; const escapedFolds = {}; let end = lineWidth - indent.length; if (typeof indentAtStart === "number") { if (indentAtStart > lineWidth - Math.max(2, minContentWidth)) folds.push(0); else end = lineWidth - indentAtStart; } let split = void 0; let prev = void 0; let overflow = false; let i = -1; let escStart = -1; let escEnd = -1; if (mode === FOLD_BLOCK) { i = consumeMoreIndentedLines(text, i); if (i !== -1) end = i + endStep; } for (let ch; ch = text[i += 1]; ) { if (mode === FOLD_QUOTED && ch === "\\") { escStart = i; switch (text[i + 1]) { case "x": i += 3; break; case "u": i += 5; break; case "U": i += 9; break; default: i += 1; } escEnd = i; } if (ch === "\n") { if (mode === FOLD_BLOCK) i = consumeMoreIndentedLines(text, i); end = i + endStep; split = void 0; } else { if (ch === " " && prev && prev !== " " && prev !== "\n" && prev !== " ") { const next = text[i + 1]; if (next && next !== " " && next !== "\n" && next !== " ") split = i; } if (i >= end) { if (split) { folds.push(split); end = split + endStep; split = void 0; } else if (mode === FOLD_QUOTED) { while (prev === " " || prev === " ") { prev = ch; ch = text[i += 1]; overflow = true; } const j = i > escEnd + 1 ? i - 2 : escStart - 1; if (escapedFolds[j]) return text; folds.push(j); escapedFolds[j] = true; end = j + endStep; split = void 0; } else { overflow = true; } } } prev = ch; } if (overflow && onOverflow) onOverflow(); if (folds.length === 0) return text; if (onFold) onFold(); let res = text.slice(0, folds[0]); for (let i2 = 0; i2 < folds.length; ++i2) { const fold = folds[i2]; const end2 = folds[i2 + 1] || text.length; if (fold === 0) res = ` ${indent}${text.slice(0, end2)}`; else { if (mode === FOLD_QUOTED && escapedFolds[fold]) res += `${text[fold]}\\`; res += ` ${indent}${text.slice(fold + 1, end2)}`; } } return res; } function consumeMoreIndentedLines(text, i) { let ch = text[i + 1]; while (ch === " " || ch === " ") { do { ch = text[i += 1]; } while (ch && ch !== "\n"); ch = text[i + 1]; } return i; } // node_modules/yaml/browser/dist/stringify/stringifyString.js var getFoldOptions = (ctx) => ({ indentAtStart: ctx.indentAtStart, lineWidth: ctx.options.lineWidth, minContentWidth: ctx.options.minContentWidth }); var containsDocumentMarker = (str) => /^(%|---|\.\.\.)/m.test(str); function lineLengthOverLimit(str, lineWidth, indentLength) { if (!lineWidth || lineWidth < 0) return false; const limit = lineWidth - indentLength; const strLen = str.length; if (strLen <= limit) return false; for (let i = 0, start = 0; i < strLen; ++i) { if (str[i] === "\n") { if (i - start > limit) return true; start = i + 1; if (strLen - start <= limit) return false; } } return true; } function doubleQuotedString(value, ctx) { const json = JSON.stringify(value); if (ctx.options.doubleQuotedAsJSON) return json; const { implicitKey } = ctx; const minMultiLineLength = ctx.options.doubleQuotedMinMultiLineLength; const indent = ctx.indent || (containsDocumentMarker(value) ? " " : ""); let str = ""; let start = 0; for (let i = 0, ch = json[i]; ch; ch = json[++i]) { if (ch === " " && json[i + 1] === "\\" && json[i + 2] === "n") { str += json.slice(start, i) + "\\ "; i += 1; start = i; ch = "\\"; } if (ch === "\\") switch (json[i + 1]) { case "u": { str += json.slice(start, i); const code = json.substr(i + 2, 4); switch (code) { case "0000": str += "\\0"; break; case "0007": str += "\\a"; break; case "000b": str += "\\v"; break; case "001b": str += "\\e"; break; case "0085": str += "\\N"; break; case "00a0": str += "\\_"; break; case "2028": str += "\\L"; break; case "2029": str += "\\P"; break; default: if (code.substr(0, 2) === "00") str += "\\x" + code.substr(2); else str += json.substr(i, 6); } i += 5; start = i + 1; } break; case "n": if (implicitKey || json[i + 2] === '"' || json.length < minMultiLineLength) { i += 1; } else { str += json.slice(start, i) + "\n\n"; while (json[i + 2] === "\\" && json[i + 3] === "n" && json[i + 4] !== '"') { str += "\n"; i += 2; } str += indent; if (json[i + 2] === " ") str += "\\"; i += 1; start = i + 1; } break; default: i += 1; } } str = start ? str + json.slice(start) : json; return implicitKey ? str : foldFlowLines(str, indent, FOLD_QUOTED, getFoldOptions(ctx)); } function singleQuotedString(value, ctx) { if (ctx.options.singleQuote === false || ctx.implicitKey && value.includes("\n") || /[ \t]\n|\n[ \t]/.test(value)) return doubleQuotedString(value, ctx); const indent = ctx.indent || (containsDocumentMarker(value) ? " " : ""); const res = "'" + value.replace(/'/g, "''").replace(/\n+/g, `$& ${indent}`) + "'"; return ctx.implicitKey ? res : foldFlowLines(res, indent, FOLD_FLOW, getFoldOptions(ctx)); } function quotedString(value, ctx) { const { singleQuote } = ctx.options; let qs; if (singleQuote === false) qs = doubleQuotedString; else { const hasDouble = value.includes('"'); const hasSingle = value.includes("'"); if (hasDouble && !hasSingle) qs = singleQuotedString; else if (hasSingle && !hasDouble) qs = doubleQuotedString; else qs = singleQuote ? singleQuotedString : doubleQuotedString; } return qs(value, ctx); } function blockString({ comment, type, value }, ctx, onComment, onChompKeep) { const { blockQuote, commentString, lineWidth } = ctx.options; if (!blockQuote || /\n[\t ]+$/.test(value) || /^\s*$/.test(value)) { return quotedString(value, ctx); } const indent = ctx.indent || (ctx.forceBlockIndent || containsDocumentMarker(value) ? " " : ""); const literal = blockQuote === "literal" ? true : blockQuote === "folded" || type === Scalar.BLOCK_FOLDED ? false : type === Scalar.BLOCK_LITERAL ? true : !lineLengthOverLimit(value, lineWidth, indent.length); if (!value) return literal ? "|\n" : ">\n"; let chomp; let endStart; for (endStart = value.length; endStart > 0; --endStart) { const ch = value[endStart - 1]; if (ch !== "\n" && ch !== " " && ch !== " ") break; } let end = value.substring(endStart); const endNlPos = end.indexOf("\n"); if (endNlPos === -1) { chomp = "-"; } else if (value === end || endNlPos !== end.length - 1) { chomp = "+"; if (onChompKeep) onChompKeep(); } else { chomp = ""; } if (end) { value = value.slice(0, -end.length); if (end[end.length - 1] === "\n") end = end.slice(0, -1); end = end.replace(/\n+(?!\n|$)/g, `$&${indent}`); } let startWithSpace = false; let startEnd; let startNlPos = -1; for (startEnd = 0; startEnd < value.length; ++startEnd) { const ch = value[startEnd]; if (ch === " ") startWithSpace = true; else if (ch === "\n") startNlPos = startEnd; else break; } let start = value.substring(0, startNlPos < startEnd ? startNlPos + 1 : startEnd); if (start) { value = value.substring(start.length); start = start.replace(/\n+/g, `$&${indent}`); } const indentSize = indent ? "2" : "1"; let header = (literal ? "|" : ">") + (startWithSpace ? indentSize : "") + chomp; if (comment) { header += " " + commentString(comment.replace(/ ?[\r\n]+/g, " ")); if (onComment) onComment(); } if (literal) { value = value.replace(/\n+/g, `$&${indent}`); return `${header} ${indent}${start}${value}${end}`; } value = value.replace(/\n+/g, "\n$&").replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g, "$1$2").replace(/\n+/g, `$&${indent}`); const body = foldFlowLines(`${start}${value}${end}`, indent, FOLD_BLOCK, getFoldOptions(ctx)); return `${header} ${indent}${body}`; } function plainString(item, ctx, onComment, onChompKeep) { const { type, value } = item; const { actualString, implicitKey, indent, inFlow } = ctx; if (implicitKey && /[\n[\]{},]/.test(value) || inFlow && /[[\]{},]/.test(value)) { return quotedString(value, ctx); } if (!value || /^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(value)) { return implicitKey || inFlow || !value.includes("\n") ? quotedString(value, ctx) : blockString(item, ctx, onComment, onChompKeep); } if (!implicitKey && !inFlow && type !== Scalar.PLAIN && value.includes("\n")) { return blockString(item, ctx, onComment, onChompKeep); } if (indent === "" && containsDocumentMarker(value)) { ctx.forceBlockIndent = true; return blockString(item, ctx, onComment, onChompKeep); } const str = value.replace(/\n+/g, `$& ${indent}`); if (actualString) { const test = (tag) => { var _a; return tag.default && tag.tag !== "tag:yaml.org,2002:str" && ((_a = tag.test) == null ? void 0 : _a.test(str)); }; const { compat, tags } = ctx.doc.schema; if (tags.some(test) || (compat == null ? void 0 : compat.some(test))) return quotedString(value, ctx); } return implicitKey ? str : foldFlowLines(str, indent, FOLD_FLOW, getFoldOptions(ctx)); } function stringifyString(item, ctx, onComment, onChompKeep) { const { implicitKey, inFlow } = ctx; const ss = typeof item.value === "string" ? item : Object.assign({}, item, { value: String(item.value) }); let { type } = item; if (type !== Scalar.QUOTE_DOUBLE) { if (/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(ss.value)) type = Scalar.QUOTE_DOUBLE; } const _stringify = (_type) => { switch (_type) { case Scalar.BLOCK_FOLDED: case Scalar.BLOCK_LITERAL: return implicitKey || inFlow ? quotedString(ss.value, ctx) : blockString(ss, ctx, onComment, onChompKeep); case Scalar.QUOTE_DOUBLE: return doubleQuotedString(ss.value, ctx); case Scalar.QUOTE_SINGLE: return singleQuotedString(ss.value, ctx); case Scalar.PLAIN: return plainString(ss, ctx, onComment, onChompKeep); default: return null; } }; let res = _stringify(type); if (res === null) { const { defaultKeyType, defaultStringType } = ctx.options; const t = implicitKey && defaultKeyType || defaultStringType; res = _stringify(t); if (res === null) throw new Error(`Unsupported default string type ${t}`); } return res; } // node_modules/yaml/browser/dist/stringify/stringify.js function createStringifyContext(doc, options) { const opt = Object.assign({ blockQuote: true, commentString: stringifyComment, defaultKeyType: null, defaultStringType: "PLAIN", directives: null, doubleQuotedAsJSON: false, doubleQuotedMinMultiLineLength: 40, falseStr: "false", indentSeq: true, lineWidth: 80, minContentWidth: 20, nullStr: "null", simpleKeys: false, singleQuote: null, trueStr: "true", verifyAliasOrder: true }, doc.schema.toStringOptions, options); let inFlow; switch (opt.collectionStyle) { case "block": inFlow = false; break; case "flow": inFlow = true; break; default: inFlow = null; } return { anchors: new Set(), doc, indent: "", indentStep: typeof opt.indent === "number" ? " ".repeat(opt.indent) : " ", inFlow, options: opt }; } function getTagObject(tags, item) { var _a, _b, _c, _d; if (item.tag) { const match = tags.filter((t) => t.tag === item.tag); if (match.length > 0) return (_a = match.find((t) => t.format === item.format)) != null ? _a : match[0]; } let tagObj = void 0; let obj; if (isScalar(item)) { obj = item.value; const match = tags.filter((t) => { var _a2; return (_a2 = t.identify) == null ? void 0 : _a2.call(t, obj); }); tagObj = (_b = match.find((t) => t.format === item.format)) != null ? _b : match.find((t) => !t.format); } else { obj = item; tagObj = tags.find((t) => t.nodeClass && obj instanceof t.nodeClass); } if (!tagObj) { const name = (_d = (_c = obj == null ? void 0 : obj.constructor) == null ? void 0 : _c.name) != null ? _d : typeof obj; throw new Error(`Tag not resolved for ${name} value`); } return tagObj; } function stringifyProps(node, tagObj, { anchors, doc }) { if (!doc.directives) return ""; const props = []; const anchor = (isScalar(node) || isCollection(node)) && node.anchor; if (anchor && anchorIsValid(anchor)) { anchors.add(anchor); props.push(`&${anchor}`); } const tag = node.tag ? node.tag : tagObj.default ? null : tagObj.tag; if (tag) props.push(doc.directives.tagString(tag)); return props.join(" "); } function stringify(item, ctx, onComment, onChompKeep) { var _a, _b; if (isPair(item)) return item.toString(ctx, onComment, onChompKeep); if (isAlias(item)) { if (ctx.doc.directives) return item.toString(ctx); if ((_a = ctx.resolvedAliases) == null ? void 0 : _a.has(item)) { throw new TypeError(`Cannot stringify circular structure without alias nodes`); } else { if (ctx.resolvedAliases) ctx.resolvedAliases.add(item); else ctx.resolvedAliases = new Set([item]); item = item.resolve(ctx.doc); } } let tagObj = void 0; const node = isNode(item) ? item : ctx.doc.createNode(item, { onTagObj: (o) => tagObj = o }); if (!tagObj) tagObj = getTagObject(ctx.doc.schema.tags, node); const props = stringifyProps(node, tagObj, ctx); if (props.length > 0) ctx.indentAtStart = ((_b = ctx.indentAtStart) != null ? _b : 0) + props.length + 1; const str = typeof tagObj.stringify === "function" ? tagObj.stringify(node, ctx, onComment, onChompKeep) : isScalar(node) ? stringifyString(node, ctx, onComment, onChompKeep) : node.toString(ctx, onComment, onChompKeep); if (!props) return str; return isScalar(node) || str[0] === "{" || str[0] === "[" ? `${props} ${str}` : `${props} ${ctx.indent}${str}`; } // node_modules/yaml/browser/dist/stringify/stringifyPair.js function stringifyPair({ key, value }, ctx, onComment, onChompKeep) { const { allNullValues, doc, indent, indentStep, options: { commentString, indentSeq, simpleKeys } } = ctx; let keyComment = isNode(key) && key.comment || null; if (simpleKeys) { if (keyComment) { throw new Error("With simple keys, key nodes cannot have comments"); } if (isCollection(key)) { const msg = "With simple keys, collection cannot be used as a key value"; throw new Error(msg); } } let explicitKey = !simpleKeys && (!key || keyComment && value == null && !ctx.inFlow || isCollection(key) || (isScalar(key) ? key.type === Scalar.BLOCK_FOLDED || key.type === Scalar.BLOCK_LITERAL : typeof key === "object")); ctx = Object.assign({}, ctx, { allNullValues: false, implicitKey: !explicitKey && (simpleKeys || !allNullValues), indent: indent + indentStep }); let keyCommentDone = false; let chompKeep = false; let str = stringify(key, ctx, () => keyCommentDone = true, () => chompKeep = true); if (!explicitKey && !ctx.inFlow && str.length > 1024) { if (simpleKeys) throw new Error("With simple keys, single line scalar must not span more than 1024 characters"); explicitKey = true; } if (ctx.inFlow) { if (allNullValues || value == null) { if (keyCommentDone && onComment) onComment(); return str === "" ? "?" : explicitKey ? `? ${str}` : str; } } else if (allNullValues && !simpleKeys || value == null && explicitKey) { str = `? ${str}`; if (keyComment && !keyCommentDone) { str += lineComment(str, ctx.indent, commentString(keyComment)); } else if (chompKeep && onChompKeep) onChompKeep(); return str; } if (keyCommentDone) keyComment = null; if (explicitKey) { if (keyComment) str += lineComment(str, ctx.indent, commentString(keyComment)); str = `? ${str} ${indent}:`; } else { str = `${str}:`; if (keyComment) str += lineComment(str, ctx.indent, commentString(keyComment)); } let vcb = ""; let valueComment = null; if (isNode(value)) { if (value.spaceBefore) vcb = "\n"; if (value.commentBefore) { const cs = commentString(value.commentBefore); vcb += ` ${indentComment(cs, ctx.indent)}`; } valueComment = value.comment; } else if (value && typeof value === "object") { value = doc.createNode(value); } ctx.implicitKey = false; if (!explicitKey && !keyComment && isScalar(value)) ctx.indentAtStart = str.length + 1; chompKeep = false; if (!indentSeq && indentStep.length >= 2 && !ctx.inFlow && !explicitKey && isSeq(value) && !value.flow && !value.tag && !value.anchor) { ctx.indent = ctx.indent.substr(2); } let valueCommentDone = false; const valueStr = stringify(value, ctx, () => valueCommentDone = true, () => chompKeep = true); let ws = " "; if (vcb || keyComment) { if (valueStr === "" && !ctx.inFlow) ws = vcb === "\n" ? "\n\n" : vcb; else ws = `${vcb} ${ctx.indent}`; } else if (!explicitKey && isCollection(value)) { const flow = valueStr[0] === "[" || valueStr[0] === "{"; if (!flow || valueStr.includes("\n")) ws = ` ${ctx.indent}`; } else if (valueStr === "" || valueStr[0] === "\n") ws = ""; str += ws + valueStr; if (ctx.inFlow) { if (valueCommentDone && onComment) onComment(); } else if (valueComment && !valueCommentDone) { str += lineComment(str, ctx.indent, commentString(valueComment)); } else if (chompKeep && onChompKeep) { onChompKeep(); } return str; } // node_modules/yaml/browser/dist/log.js function warn(logLevel, warning) { if (logLevel === "debug" || logLevel === "warn") { if (typeof process !== "undefined" && process.emitWarning) process.emitWarning(warning); else console.warn(warning); } } // node_modules/yaml/browser/dist/nodes/addPairToJSMap.js var MERGE_KEY = "<<"; function addPairToJSMap(ctx, map2, { key, value }) { if ((ctx == null ? void 0 : ctx.doc.schema.merge) && isMergeKey(key)) { value = isAlias(value) ? value.resolve(ctx.doc) : value; if (isSeq(value)) for (const it of value.items) mergeToJSMap(ctx, map2, it); else if (Array.isArray(value)) for (const it of value) mergeToJSMap(ctx, map2, it); else mergeToJSMap(ctx, map2, value); } else { const jsKey = toJS(key, "", ctx); if (map2 instanceof Map) { map2.set(jsKey, toJS(value, jsKey, ctx)); } else if (map2 instanceof Set) { map2.add(jsKey); } else { const stringKey = stringifyKey(key, jsKey, ctx); const jsValue = toJS(value, stringKey, ctx); if (stringKey in map2) Object.defineProperty(map2, stringKey, { value: jsValue, writable: true, enumerable: true, configurable: true }); else map2[stringKey] = jsValue; } } return map2; } var isMergeKey = (key) => key === MERGE_KEY || isScalar(key) && key.value === MERGE_KEY && (!key.type || key.type === Scalar.PLAIN); function mergeToJSMap(ctx, map2, value) { const source = ctx && isAlias(value) ? value.resolve(ctx.doc) : value; if (!isMap(source)) throw new Error("Merge sources must be maps or map aliases"); const srcMap = source.toJSON(null, ctx, Map); for (const [key, value2] of srcMap) { if (map2 instanceof Map) { if (!map2.has(key)) map2.set(key, value2); } else if (map2 instanceof Set) { map2.add(key); } else if (!Object.prototype.hasOwnProperty.call(map2, key)) { Object.defineProperty(map2, key, { value: value2, writable: true, enumerable: true, configurable: true }); } } return map2; } function stringifyKey(key, jsKey, ctx) { if (jsKey === null) return ""; if (typeof jsKey !== "object") return String(jsKey); if (isNode(key) && ctx && ctx.doc) { const strCtx = createStringifyContext(ctx.doc, {}); strCtx.anchors = new Set(); for (const node of ctx.anchors.keys()) strCtx.anchors.add(node.anchor); strCtx.inFlow = true; strCtx.inStringifyKey = true; const strKey = key.toString(strCtx); if (!ctx.mapKeyWarned) { let jsonStr = JSON.stringify(strKey); if (jsonStr.length > 40) jsonStr = jsonStr.substring(0, 36) + '..."'; warn(ctx.doc.options.logLevel, `Keys with collection values will be stringified due to JS Object restrictions: ${jsonStr}. Set mapAsMap: true to use object keys.`); ctx.mapKeyWarned = true; } return strKey; } return JSON.stringify(jsKey); } // node_modules/yaml/browser/dist/nodes/Pair.js function createPair(key, value, ctx) { const k = createNode(key, void 0, ctx); const v = createNode(value, void 0, ctx); return new Pair(k, v); } var Pair = class { constructor(key, value = null) { Object.defineProperty(this, NODE_TYPE, { value: PAIR }); this.key = key; this.value = value; } clone(schema4) { let { key, value } = this; if (isNode(key)) key = key.clone(schema4); if (isNode(value)) value = value.clone(schema4); return new Pair(key, value); } toJSON(_, ctx) { const pair = (ctx == null ? void 0 : ctx.mapAsMap) ? new Map() : {}; return addPairToJSMap(ctx, pair, this); } toString(ctx, onComment, onChompKeep) { return (ctx == null ? void 0 : ctx.doc) ? stringifyPair(this, ctx, onComment, onChompKeep) : JSON.stringify(this); } }; // node_modules/yaml/browser/dist/stringify/stringifyCollection.js function stringifyCollection(collection, ctx, options) { var _a; const flow = (_a = ctx.inFlow) != null ? _a : collection.flow; const stringify4 = flow ? stringifyFlowCollection : stringifyBlockCollection; return stringify4(collection, ctx, options); } function stringifyBlockCollection({ comment, items }, ctx, { blockItemPrefix, flowChars, itemIndent, onChompKeep, onComment }) { const { indent, options: { commentString } } = ctx; const itemCtx = Object.assign({}, ctx, { indent: itemIndent, type: null }); let chompKeep = false; const lines = []; for (let i = 0; i < items.length; ++i) { const item = items[i]; let comment2 = null; if (isNode(item)) { if (!chompKeep && item.spaceBefore) lines.push(""); addCommentBefore(ctx, lines, item.commentBefore, chompKeep); if (item.comment) comment2 = item.comment; } else if (isPair(item)) { const ik = isNode(item.key) ? item.key : null; if (ik) { if (!chompKeep && ik.spaceBefore) lines.push(""); addCommentBefore(ctx, lines, ik.commentBefore, chompKeep); } } chompKeep = false; let str2 = stringify(item, itemCtx, () => comment2 = null, () => chompKeep = true); if (comment2) str2 += lineComment(str2, itemIndent, commentString(comment2)); if (chompKeep && comment2) chompKeep = false; lines.push(blockItemPrefix + str2); } let str; if (lines.length === 0) { str = flowChars.start + flowChars.end; } else { str = lines[0]; for (let i = 1; i < lines.length; ++i) { const line = lines[i]; str += line ? ` ${indent}${line}` : "\n"; } } if (comment) { str += "\n" + indentComment(commentString(comment), indent); if (onComment) onComment(); } else if (chompKeep && onChompKeep) onChompKeep(); return str; } function stringifyFlowCollection({ comment, items }, ctx, { flowChars, itemIndent, onComment }) { const { indent, indentStep, options: { commentString } } = ctx; itemIndent += indentStep; const itemCtx = Object.assign({}, ctx, { indent: itemIndent, inFlow: true, type: null }); let reqNewline = false; let linesAtValue = 0; const lines = []; for (let i = 0; i < items.length; ++i) { const item = items[i]; let comment2 = null; if (isNode(item)) { if (item.spaceBefore) lines.push(""); addCommentBefore(ctx, lines, item.commentBefore, false); if (item.comment) comment2 = item.comment; } else if (isPair(item)) { const ik = isNode(item.key) ? item.key : null; if (ik) { if (ik.spaceBefore) lines.push(""); addCommentBefore(ctx, lines, ik.commentBefore, false); if (ik.comment) reqNewline = true; } const iv = isNode(item.value) ? item.value : null; if (iv) { if (iv.comment) comment2 = iv.comment; if (iv.commentBefore) reqNewline = true; } else if (item.value == null && ik && ik.comment) { comment2 = ik.comment; } } if (comment2) reqNewline = true; let str2 = stringify(item, itemCtx, () => comment2 = null); if (i < items.length - 1) str2 += ","; if (comment2) str2 += lineComment(str2, itemIndent, commentString(comment2)); if (!reqNewline && (lines.length > linesAtValue || str2.includes("\n"))) reqNewline = true; lines.push(str2); linesAtValue = lines.length; } let str; const { start, end } = flowChars; if (lines.length === 0) { str = start + end; } else { if (!reqNewline) { const len = lines.reduce((sum, line) => sum + line.length + 2, 2); reqNewline = len > Collection.maxFlowStringSingleLineLength; } if (reqNewline) { str = start; for (const line of lines) str += line ? ` ${indentStep}${indent}${line}` : "\n"; str += ` ${indent}${end}`; } else { str = `${start} ${lines.join(" ")} ${end}`; } } if (comment) { str += lineComment(str, commentString(comment), indent); if (onComment) onComment(); } return str; } function addCommentBefore({ indent, options: { commentString } }, lines, comment, chompKeep) { if (comment && chompKeep) comment = comment.replace(/^\n+/, ""); if (comment) { const ic = indentComment(commentString(comment), indent); lines.push(ic.trimStart()); } } // node_modules/yaml/browser/dist/nodes/YAMLMap.js function findPair(items, key) { const k = isScalar(key) ? key.value : key; for (const it of items) { if (isPair(it)) { if (it.key === key || it.key === k) return it; if (isScalar(it.key) && it.key.value === k) return it; } } return void 0; } var YAMLMap = class extends Collection { constructor(schema4) { super(MAP, schema4); this.items = []; } static get tagName() { return "tag:yaml.org,2002:map"; } add(pair, overwrite) { var _a; let _pair; if (isPair(pair)) _pair = pair; else if (!pair || typeof pair !== "object" || !("key" in pair)) { _pair = new Pair(pair, pair == null ? void 0 : pair.value); } else _pair = new Pair(pair.key, pair.value); const prev = findPair(this.items, _pair.key); const sortEntries = (_a = this.schema) == null ? void 0 : _a.sortMapEntries; if (prev) { if (!overwrite) throw new Error(`Key ${_pair.key} already set`); if (isScalar(prev.value) && isScalarValue(_pair.value)) prev.value.value = _pair.value; else prev.value = _pair.value; } else if (sortEntries) { const i = this.items.findIndex((item) => sortEntries(_pair, item) < 0); if (i === -1) this.items.push(_pair); else this.items.splice(i, 0, _pair); } else { this.items.push(_pair); } } delete(key) { const it = findPair(this.items, key); if (!it) return false; const del = this.items.splice(this.items.indexOf(it), 1); return del.length > 0; } get(key, keepScalar) { var _a; const it = findPair(this.items, key); const node = it == null ? void 0 : it.value; return (_a = !keepScalar && isScalar(node) ? node.value : node) != null ? _a : void 0; } has(key) { return !!findPair(this.items, key); } set(key, value) { this.add(new Pair(key, value), true); } toJSON(_, ctx, Type) { const map2 = Type ? new Type() : (ctx == null ? void 0 : ctx.mapAsMap) ? new Map() : {}; if (ctx == null ? void 0 : ctx.onCreate) ctx.onCreate(map2); for (const item of this.items) addPairToJSMap(ctx, map2, item); return map2; } toString(ctx, onComment, onChompKeep) { if (!ctx) return JSON.stringify(this); for (const item of this.items) { if (!isPair(item)) throw new Error(`Map items must all be pairs; found ${JSON.stringify(item)} instead`); } if (!ctx.allNullValues && this.hasAllNullValues(false)) ctx = Object.assign({}, ctx, { allNullValues: true }); return stringifyCollection(this, ctx, { blockItemPrefix: "", flowChars: { start: "{", end: "}" }, itemIndent: ctx.indent || "", onChompKeep, onComment }); } }; // node_modules/yaml/browser/dist/schema/common/map.js function createMap(schema4, obj, ctx) { const { keepUndefined, replacer } = ctx; const map2 = new YAMLMap(schema4); const add = (key, value) => { if (typeof replacer === "function") value = replacer.call(obj, key, value); else if (Array.isArray(replacer) && !replacer.includes(key)) return; if (value !== void 0 || keepUndefined) map2.items.push(createPair(key, value, ctx)); }; if (obj instanceof Map) { for (const [key, value] of obj) add(key, value); } else if (obj && typeof obj === "object") { for (const key of Object.keys(obj)) add(key, obj[key]); } if (typeof schema4.sortMapEntries === "function") { map2.items.sort(schema4.sortMapEntries); } return map2; } var map = { collection: "map", createNode: createMap, default: true, nodeClass: YAMLMap, tag: "tag:yaml.org,2002:map", resolve(map2, onError) { if (!isMap(map2)) onError("Expected a mapping for this tag"); return map2; } }; // node_modules/yaml/browser/dist/nodes/YAMLSeq.js var YAMLSeq = class extends Collection { constructor(schema4) { super(SEQ, schema4); this.items = []; } static get tagName() { return "tag:yaml.org,2002:seq"; } add(value) { this.items.push(value); } delete(key) { const idx = asItemIndex(key); if (typeof idx !== "number") return false; const del = this.items.splice(idx, 1); return del.length > 0; } get(key, keepScalar) { const idx = asItemIndex(key); if (typeof idx !== "number") return void 0; const it = this.items[idx]; return !keepScalar && isScalar(it) ? it.value : it; } has(key) { const idx = asItemIndex(key); return typeof idx === "number" && idx < this.items.length; } set(key, value) { const idx = asItemIndex(key); if (typeof idx !== "number") throw new Error(`Expected a valid index, not ${key}.`); const prev = this.items[idx]; if (isScalar(prev) && isScalarValue(value)) prev.value = value; else this.items[idx] = value; } toJSON(_, ctx) { const seq2 = []; if (ctx == null ? void 0 : ctx.onCreate) ctx.onCreate(seq2); let i = 0; for (const item of this.items) seq2.push(toJS(item, String(i++), ctx)); return seq2; } toString(ctx, onComment, onChompKeep) { if (!ctx) return JSON.stringify(this); return stringifyCollection(this, ctx, { blockItemPrefix: "- ", flowChars: { start: "[", end: "]" }, itemIndent: (ctx.indent || "") + " ", onChompKeep, onComment }); } }; function asItemIndex(key) { let idx = isScalar(key) ? key.value : key; if (idx && typeof idx === "string") idx = Number(idx); return typeof idx === "number" && Number.isInteger(idx) && idx >= 0 ? idx : null; } // node_modules/yaml/browser/dist/schema/common/seq.js function createSeq(schema4, obj, ctx) { const { replacer } = ctx; const seq2 = new YAMLSeq(schema4); if (obj && Symbol.iterator in Object(obj)) { let i = 0; for (let it of obj) { if (typeof replacer === "function") { const key = obj instanceof Set ? it : String(i++); it = replacer.call(obj, key, it); } seq2.items.push(createNode(it, void 0, ctx)); } } return seq2; } var seq = { collection: "seq", createNode: createSeq, default: true, nodeClass: YAMLSeq, tag: "tag:yaml.org,2002:seq", resolve(seq2, onError) { if (!isSeq(seq2)) onError("Expected a sequence for this tag"); return seq2; } }; // node_modules/yaml/browser/dist/schema/common/string.js var string = { identify: (value) => typeof value === "string", default: true, tag: "tag:yaml.org,2002:str", resolve: (str) => str, stringify(item, ctx, onComment, onChompKeep) { ctx = Object.assign({ actualString: true }, ctx); return stringifyString(item, ctx, onComment, onChompKeep); } }; // node_modules/yaml/browser/dist/schema/common/null.js var nullTag = { identify: (value) => value == null, createNode: () => new Scalar(null), default: true, tag: "tag:yaml.org,2002:null", test: /^(?:~|[Nn]ull|NULL)?$/, resolve: () => new Scalar(null), stringify: ({ source }, ctx) => typeof source === "string" && nullTag.test.test(source) ? source : ctx.options.nullStr }; // node_modules/yaml/browser/dist/schema/core/bool.js var boolTag = { identify: (value) => typeof value === "boolean", default: true, tag: "tag:yaml.org,2002:bool", test: /^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/, resolve: (str) => new Scalar(str[0] === "t" || str[0] === "T"), stringify({ source, value }, ctx) { if (source && boolTag.test.test(source)) { const sv = source[0] === "t" || source[0] === "T"; if (value === sv) return source; } return value ? ctx.options.trueStr : ctx.options.falseStr; } }; // node_modules/yaml/browser/dist/stringify/stringifyNumber.js function stringifyNumber({ format, minFractionDigits, tag, value }) { if (typeof value === "bigint") return String(value); const num = typeof value === "number" ? value : Number(value); if (!isFinite(num)) return isNaN(num) ? ".nan" : num < 0 ? "-.inf" : ".inf"; let n = JSON.stringify(value); if (!format && minFractionDigits && (!tag || tag === "tag:yaml.org,2002:float") && /^\d/.test(n)) { let i = n.indexOf("."); if (i < 0) { i = n.length; n += "."; } let d = minFractionDigits - (n.length - i - 1); while (d-- > 0) n += "0"; } return n; } // node_modules/yaml/browser/dist/schema/core/float.js var floatNaN = { identify: (value) => typeof value === "number", default: true, tag: "tag:yaml.org,2002:float", test: /^(?:[-+]?\.(?:inf|Inf|INF|nan|NaN|NAN))$/, resolve: (str) => str.slice(-3).toLowerCase() === "nan" ? NaN : str[0] === "-" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY, stringify: stringifyNumber }; var floatExp = { identify: (value) => typeof value === "number", default: true, tag: "tag:yaml.org,2002:float", format: "EXP", test: /^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/, resolve: (str) => parseFloat(str), stringify(node) { const num = Number(node.value); return isFinite(num) ? num.toExponential() : stringifyNumber(node); } }; var float = { identify: (value) => typeof value === "number", default: true, tag: "tag:yaml.org,2002:float", test: /^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/, resolve(str) { const node = new Scalar(parseFloat(str)); const dot = str.indexOf("."); if (dot !== -1 && str[str.length - 1] === "0") node.minFractionDigits = str.length - dot - 1; return node; }, stringify: stringifyNumber }; // node_modules/yaml/browser/dist/schema/core/int.js var intIdentify = (value) => typeof value === "bigint" || Number.isInteger(value); var intResolve = (str, offset, radix, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str.substring(offset), radix); function intStringify(node, radix, prefix) { const { value } = node; if (intIdentify(value) && value >= 0) return prefix + value.toString(radix); return stringifyNumber(node); } var intOct = { identify: (value) => intIdentify(value) && value >= 0, default: true, tag: "tag:yaml.org,2002:int", format: "OCT", test: /^0o[0-7]+$/, resolve: (str, _onError, opt) => intResolve(str, 2, 8, opt), stringify: (node) => intStringify(node, 8, "0o") }; var int = { identify: intIdentify, default: true, tag: "tag:yaml.org,2002:int", test: /^[-+]?[0-9]+$/, resolve: (str, _onError, opt) => intResolve(str, 0, 10, opt), stringify: stringifyNumber }; var intHex = { identify: (value) => intIdentify(value) && value >= 0, default: true, tag: "tag:yaml.org,2002:int", format: "HEX", test: /^0x[0-9a-fA-F]+$/, resolve: (str, _onError, opt) => intResolve(str, 2, 16, opt), stringify: (node) => intStringify(node, 16, "0x") }; // node_modules/yaml/browser/dist/schema/core/schema.js var schema = [ map, seq, string, nullTag, boolTag, intOct, int, intHex, floatNaN, floatExp, float ]; // node_modules/yaml/browser/dist/schema/json/schema.js function intIdentify2(value) { return typeof value === "bigint" || Number.isInteger(value); } var stringifyJSON = ({ value }) => JSON.stringify(value); var jsonScalars = [ { identify: (value) => typeof value === "string", default: true, tag: "tag:yaml.org,2002:str", resolve: (str) => str, stringify: stringifyJSON }, { identify: (value) => value == null, createNode: () => new Scalar(null), default: true, tag: "tag:yaml.org,2002:null", test: /^null$/, resolve: () => null, stringify: stringifyJSON }, { identify: (value) => typeof value === "boolean", default: true, tag: "tag:yaml.org,2002:bool", test: /^true|false$/, resolve: (str) => str === "true", stringify: stringifyJSON }, { identify: intIdentify2, default: true, tag: "tag:yaml.org,2002:int", test: /^-?(?:0|[1-9][0-9]*)$/, resolve: (str, _onError, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str, 10), stringify: ({ value }) => intIdentify2(value) ? value.toString() : JSON.stringify(value) }, { identify: (value) => typeof value === "number", default: true, tag: "tag:yaml.org,2002:float", test: /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/, resolve: (str) => parseFloat(str), stringify: stringifyJSON } ]; var jsonError = { default: true, tag: "", test: /^/, resolve(str, onError) { onError(`Unresolved plain scalar ${JSON.stringify(str)}`); return str; } }; var schema2 = [map, seq].concat(jsonScalars, jsonError); // node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js var binary = { identify: (value) => value instanceof Uint8Array, default: false, tag: "tag:yaml.org,2002:binary", resolve(src, onError) { if (typeof Buffer === "function") { return Buffer.from(src, "base64"); } else if (typeof atob === "function") { const str = atob(src.replace(/[\n\r]/g, "")); const buffer = new Uint8Array(str.length); for (let i = 0; i < str.length; ++i) buffer[i] = str.charCodeAt(i); return buffer; } else { onError("This environment does not support reading binary tags; either Buffer or atob is required"); return src; } }, stringify({ comment, type, value }, ctx, onComment, onChompKeep) { const buf = value; let str; if (typeof Buffer === "function") { str = buf instanceof Buffer ? buf.toString("base64") : Buffer.from(buf.buffer).toString("base64"); } else if (typeof btoa === "function") { let s = ""; for (let i = 0; i < buf.length; ++i) s += String.fromCharCode(buf[i]); str = btoa(s); } else { throw new Error("This environment does not support writing binary tags; either Buffer or btoa is required"); } if (!type) type = Scalar.BLOCK_LITERAL; if (type !== Scalar.QUOTE_DOUBLE) { const lineWidth = Math.max(ctx.options.lineWidth - ctx.indent.length, ctx.options.minContentWidth); const n = Math.ceil(str.length / lineWidth); const lines = new Array(n); for (let i = 0, o = 0; i < n; ++i, o += lineWidth) { lines[i] = str.substr(o, lineWidth); } str = lines.join(type === Scalar.BLOCK_LITERAL ? "\n" : " "); } return stringifyString({ comment, type, value: str }, ctx, onComment, onChompKeep); } }; // node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js function resolvePairs(seq2, onError) { var _a; if (isSeq(seq2)) { for (let i = 0; i < seq2.items.length; ++i) { let item = seq2.items[i]; if (isPair(item)) continue; else if (isMap(item)) { if (item.items.length > 1) onError("Each pair must have its own sequence indicator"); const pair = item.items[0] || new Pair(new Scalar(null)); if (item.commentBefore) pair.key.commentBefore = pair.key.commentBefore ? `${item.commentBefore} ${pair.key.commentBefore}` : item.commentBefore; if (item.comment) { const cn = (_a = pair.value) != null ? _a : pair.key; cn.comment = cn.comment ? `${item.comment} ${cn.comment}` : item.comment; } item = pair; } seq2.items[i] = isPair(item) ? item : new Pair(item); } } else onError("Expected a sequence for this tag"); return seq2; } function createPairs(schema4, iterable, ctx) { const { replacer } = ctx; const pairs2 = new YAMLSeq(schema4); pairs2.tag = "tag:yaml.org,2002:pairs"; let i = 0; if (iterable && Symbol.iterator in Object(iterable)) for (let it of iterable) { if (typeof replacer === "function") it = replacer.call(iterable, String(i++), it); let key, value; if (Array.isArray(it)) { if (it.length === 2) { key = it[0]; value = it[1]; } else throw new TypeError(`Expected [key, value] tuple: ${it}`); } else if (it && it instanceof Object) { const keys = Object.keys(it); if (keys.length === 1) { key = keys[0]; value = it[key]; } else throw new TypeError(`Expected { key: value } tuple: ${it}`); } else { key = it; } pairs2.items.push(createPair(key, value, ctx)); } return pairs2; } var pairs = { collection: "seq", default: false, tag: "tag:yaml.org,2002:pairs", resolve: resolvePairs, createNode: createPairs }; // node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js var YAMLOMap = class extends YAMLSeq { constructor() { super(); this.add = YAMLMap.prototype.add.bind(this); this.delete = YAMLMap.prototype.delete.bind(this); this.get = YAMLMap.prototype.get.bind(this); this.has = YAMLMap.prototype.has.bind(this); this.set = YAMLMap.prototype.set.bind(this); this.tag = YAMLOMap.tag; } toJSON(_, ctx) { if (!ctx) return super.toJSON(_); const map2 = new Map(); if (ctx == null ? void 0 : ctx.onCreate) ctx.onCreate(map2); for (const pair of this.items) { let key, value; if (isPair(pair)) { key = toJS(pair.key, "", ctx); value = toJS(pair.value, key, ctx); } else { key = toJS(pair, "", ctx); } if (map2.has(key)) throw new Error("Ordered maps must not include duplicate keys"); map2.set(key, value); } return map2; } }; YAMLOMap.tag = "tag:yaml.org,2002:omap"; var omap = { collection: "seq", identify: (value) => value instanceof Map, nodeClass: YAMLOMap, default: false, tag: "tag:yaml.org,2002:omap", resolve(seq2, onError) { const pairs2 = resolvePairs(seq2, onError); const seenKeys = []; for (const { key } of pairs2.items) { if (isScalar(key)) { if (seenKeys.includes(key.value)) { onError(`Ordered maps must not include duplicate keys: ${key.value}`); } else { seenKeys.push(key.value); } } } return Object.assign(new YAMLOMap(), pairs2); }, createNode(schema4, iterable, ctx) { const pairs2 = createPairs(schema4, iterable, ctx); const omap2 = new YAMLOMap(); omap2.items = pairs2.items; return omap2; } }; // node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js function boolStringify({ value, source }, ctx) { const boolObj = value ? trueTag : falseTag; if (source && boolObj.test.test(source)) return source; return value ? ctx.options.trueStr : ctx.options.falseStr; } var trueTag = { identify: (value) => value === true, default: true, tag: "tag:yaml.org,2002:bool", test: /^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/, resolve: () => new Scalar(true), stringify: boolStringify }; var falseTag = { identify: (value) => value === false, default: true, tag: "tag:yaml.org,2002:bool", test: /^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/i, resolve: () => new Scalar(false), stringify: boolStringify }; // node_modules/yaml/browser/dist/schema/yaml-1.1/float.js var floatNaN2 = { identify: (value) => typeof value === "number", default: true, tag: "tag:yaml.org,2002:float", test: /^[-+]?\.(?:inf|Inf|INF|nan|NaN|NAN)$/, resolve: (str) => str.slice(-3).toLowerCase() === "nan" ? NaN : str[0] === "-" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY, stringify: stringifyNumber }; var floatExp2 = { identify: (value) => typeof value === "number", default: true, tag: "tag:yaml.org,2002:float", format: "EXP", test: /^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/, resolve: (str) => parseFloat(str.replace(/_/g, "")), stringify(node) { const num = Number(node.value); return isFinite(num) ? num.toExponential() : stringifyNumber(node); } }; var float2 = { identify: (value) => typeof value === "number", default: true, tag: "tag:yaml.org,2002:float", test: /^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/, resolve(str) { const node = new Scalar(parseFloat(str.replace(/_/g, ""))); const dot = str.indexOf("."); if (dot !== -1) { const f = str.substring(dot + 1).replace(/_/g, ""); if (f[f.length - 1] === "0") node.minFractionDigits = f.length; } return node; }, stringify: stringifyNumber }; // node_modules/yaml/browser/dist/schema/yaml-1.1/int.js var intIdentify3 = (value) => typeof value === "bigint" || Number.isInteger(value); function intResolve2(str, offset, radix, { intAsBigInt }) { const sign = str[0]; if (sign === "-" || sign === "+") offset += 1; str = str.substring(offset).replace(/_/g, ""); if (intAsBigInt) { switch (radix) { case 2: str = `0b${str}`; break; case 8: str = `0o${str}`; break; case 16: str = `0x${str}`; break; } const n2 = BigInt(str); return sign === "-" ? BigInt(-1) * n2 : n2; } const n = parseInt(str, radix); return sign === "-" ? -1 * n : n; } function intStringify2(node, radix, prefix) { const { value } = node; if (intIdentify3(value)) { const str = value.toString(radix); return value < 0 ? "-" + prefix + str.substr(1) : prefix + str; } return stringifyNumber(node); } var intBin = { identify: intIdentify3, default: true, tag: "tag:yaml.org,2002:int", format: "BIN", test: /^[-+]?0b[0-1_]+$/, resolve: (str, _onError, opt) => intResolve2(str, 2, 2, opt), stringify: (node) => intStringify2(node, 2, "0b") }; var intOct2 = { identify: intIdentify3, default: true, tag: "tag:yaml.org,2002:int", format: "OCT", test: /^[-+]?0[0-7_]+$/, resolve: (str, _onError, opt) => intResolve2(str, 1, 8, opt), stringify: (node) => intStringify2(node, 8, "0") }; var int2 = { identify: intIdentify3, default: true, tag: "tag:yaml.org,2002:int", test: /^[-+]?[0-9][0-9_]*$/, resolve: (str, _onError, opt) => intResolve2(str, 0, 10, opt), stringify: stringifyNumber }; var intHex2 = { identify: intIdentify3, default: true, tag: "tag:yaml.org,2002:int", format: "HEX", test: /^[-+]?0x[0-9a-fA-F_]+$/, resolve: (str, _onError, opt) => intResolve2(str, 2, 16, opt), stringify: (node) => intStringify2(node, 16, "0x") }; // node_modules/yaml/browser/dist/schema/yaml-1.1/set.js var YAMLSet = class extends YAMLMap { constructor(schema4) { super(schema4); this.tag = YAMLSet.tag; } add(key) { let pair; if (isPair(key)) pair = key; else if (typeof key === "object" && "key" in key && "value" in key && key.value === null) pair = new Pair(key.key, null); else pair = new Pair(key, null); const prev = findPair(this.items, pair.key); if (!prev) this.items.push(pair); } get(key, keepPair) { const pair = findPair(this.items, key); return !keepPair && isPair(pair) ? isScalar(pair.key) ? pair.key.value : pair.key : pair; } set(key, value) { if (typeof value !== "boolean") throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof value}`); const prev = findPair(this.items, key); if (prev && !value) { this.items.splice(this.items.indexOf(prev), 1); } else if (!prev && value) { this.items.push(new Pair(key)); } } toJSON(_, ctx) { return super.toJSON(_, ctx, Set); } toString(ctx, onComment, onChompKeep) { if (!ctx) return JSON.stringify(this); if (this.hasAllNullValues(true)) return super.toString(Object.assign({}, ctx, { allNullValues: true }), onComment, onChompKeep); else throw new Error("Set items must all have null values"); } }; YAMLSet.tag = "tag:yaml.org,2002:set"; var set = { collection: "map", identify: (value) => value instanceof Set, nodeClass: YAMLSet, default: false, tag: "tag:yaml.org,2002:set", resolve(map2, onError) { if (isMap(map2)) { if (map2.hasAllNullValues(true)) return Object.assign(new YAMLSet(), map2); else onError("Set items must all have null values"); } else onError("Expected a mapping for this tag"); return map2; }, createNode(schema4, iterable, ctx) { const { replacer } = ctx; const set2 = new YAMLSet(schema4); if (iterable && Symbol.iterator in Object(iterable)) for (let value of iterable) { if (typeof replacer === "function") value = replacer.call(iterable, value, value); set2.items.push(createPair(value, null, ctx)); } return set2; } }; // node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js function parseSexagesimal(str, asBigInt) { const sign = str[0]; const parts = sign === "-" || sign === "+" ? str.substring(1) : str; const num = (n) => asBigInt ? BigInt(n) : Number(n); const res = parts.replace(/_/g, "").split(":").reduce((res2, p) => res2 * num(60) + num(p), num(0)); return sign === "-" ? num(-1) * res : res; } function stringifySexagesimal(node) { let { value } = node; let num = (n) => n; if (typeof value === "bigint") num = (n) => BigInt(n); else if (isNaN(value) || !isFinite(value)) return stringifyNumber(node); let sign = ""; if (value < 0) { sign = "-"; value *= num(-1); } const _60 = num(60); const parts = [value % _60]; if (value < 60) { parts.unshift(0); } else { value = (value - parts[0]) / _60; parts.unshift(value % _60); if (value >= 60) { value = (value - parts[0]) / _60; parts.unshift(value); } } return sign + parts.map((n) => n < 10 ? "0" + String(n) : String(n)).join(":").replace(/000000\d*$/, ""); } var intTime = { identify: (value) => typeof value === "bigint" || Number.isInteger(value), default: true, tag: "tag:yaml.org,2002:int", format: "TIME", test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/, resolve: (str, _onError, { intAsBigInt }) => parseSexagesimal(str, intAsBigInt), stringify: stringifySexagesimal }; var floatTime = { identify: (value) => typeof value === "number", default: true, tag: "tag:yaml.org,2002:float", format: "TIME", test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/, resolve: (str) => parseSexagesimal(str, false), stringify: stringifySexagesimal }; var timestamp = { identify: (value) => value instanceof Date, default: true, tag: "tag:yaml.org,2002:timestamp", test: RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"), resolve(str) { const match = str.match(timestamp.test); if (!match) throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd"); const [, year, month, day, hour, minute, second] = match.map(Number); const millisec = match[7] ? Number((match[7] + "00").substr(1, 3)) : 0; let date = Date.UTC(year, month - 1, day, hour || 0, minute || 0, second || 0, millisec); const tz = match[8]; if (tz && tz !== "Z") { let d = parseSexagesimal(tz, false); if (Math.abs(d) < 30) d *= 60; date -= 6e4 * d; } return new Date(date); }, stringify: ({ value }) => value.toISOString().replace(/((T00:00)?:00)?\.000Z$/, "") }; // node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js var schema3 = [ map, seq, string, nullTag, trueTag, falseTag, intBin, intOct2, int2, intHex2, floatNaN2, floatExp2, float2, binary, omap, pairs, set, intTime, floatTime, timestamp ]; // node_modules/yaml/browser/dist/schema/tags.js var schemas = new Map([ ["core", schema], ["failsafe", [map, seq, string]], ["json", schema2], ["yaml11", schema3], ["yaml-1.1", schema3] ]); var tagsByName = { binary, bool: boolTag, float, floatExp, floatNaN, floatTime, int, intHex, intOct, intTime, map, null: nullTag, omap, pairs, seq, set, timestamp }; var coreKnownTags = { "tag:yaml.org,2002:binary": binary, "tag:yaml.org,2002:omap": omap, "tag:yaml.org,2002:pairs": pairs, "tag:yaml.org,2002:set": set, "tag:yaml.org,2002:timestamp": timestamp }; function getTags(customTags, schemaName) { let tags = schemas.get(schemaName); if (!tags) { if (Array.isArray(customTags)) tags = []; else { const keys = Array.from(schemas.keys()).filter((key) => key !== "yaml11").map((key) => JSON.stringify(key)).join(", "); throw new Error(`Unknown schema "${schemaName}"; use one of ${keys} or define customTags array`); } } if (Array.isArray(customTags)) { for (const tag of customTags) tags = tags.concat(tag); } else if (typeof customTags === "function") { tags = customTags(tags.slice()); } return tags.map((tag) => { if (typeof tag !== "string") return tag; const tagObj = tagsByName[tag]; if (tagObj) return tagObj; const keys = Object.keys(tagsByName).map((key) => JSON.stringify(key)).join(", "); throw new Error(`Unknown custom tag "${tag}"; use one of ${keys}`); }); } // node_modules/yaml/browser/dist/schema/Schema.js var sortMapEntriesByKey = (a, b) => a.key < b.key ? -1 : a.key > b.key ? 1 : 0; var Schema = class { constructor({ compat, customTags, merge, resolveKnownTags, schema: schema4, sortMapEntries, toStringDefaults }) { this.compat = Array.isArray(compat) ? getTags(compat, "compat") : compat ? getTags(null, compat) : null; this.merge = !!merge; this.name = typeof schema4 === "string" && schema4 || "core"; this.knownTags = resolveKnownTags ? coreKnownTags : {}; this.tags = getTags(customTags, this.name); this.toStringOptions = toStringDefaults != null ? toStringDefaults : null; Object.defineProperty(this, MAP, { value: map }); Object.defineProperty(this, SCALAR, { value: string }); Object.defineProperty(this, SEQ, { value: seq }); this.sortMapEntries = typeof sortMapEntries === "function" ? sortMapEntries : sortMapEntries === true ? sortMapEntriesByKey : null; } clone() { const copy = Object.create(Schema.prototype, Object.getOwnPropertyDescriptors(this)); copy.tags = this.tags.slice(); return copy; } }; // node_modules/yaml/browser/dist/stringify/stringifyDocument.js function stringifyDocument(doc, options) { var _a; const lines = []; let hasDirectives = options.directives === true; if (options.directives !== false && doc.directives) { const dir = doc.directives.toString(doc); if (dir) { lines.push(dir); hasDirectives = true; } else if (doc.directives.docStart) hasDirectives = true; } if (hasDirectives) lines.push("---"); const ctx = createStringifyContext(doc, options); const { commentString } = ctx.options; if (doc.commentBefore) { if (lines.length !== 1) lines.unshift(""); const cs = commentString(doc.commentBefore); lines.unshift(indentComment(cs, "")); } let chompKeep = false; let contentComment = null; if (doc.contents) { if (isNode(doc.contents)) { if (doc.contents.spaceBefore && hasDirectives) lines.push(""); if (doc.contents.commentBefore) { const cs = commentString(doc.contents.commentBefore); lines.push(indentComment(cs, "")); } ctx.forceBlockIndent = !!doc.comment; contentComment = doc.contents.comment; } const onChompKeep = contentComment ? void 0 : () => chompKeep = true; let body = stringify(doc.contents, ctx, () => contentComment = null, onChompKeep); if (contentComment) body += lineComment(body, "", commentString(contentComment)); if ((body[0] === "|" || body[0] === ">") && lines[lines.length - 1] === "---") { lines[lines.length - 1] = `--- ${body}`; } else lines.push(body); } else { lines.push(stringify(doc.contents, ctx)); } if ((_a = doc.directives) == null ? void 0 : _a.docEnd) { if (doc.comment) { const cs = commentString(doc.comment); if (cs.includes("\n")) { lines.push("..."); lines.push(indentComment(cs, "")); } else { lines.push(`... ${cs}`); } } else { lines.push("..."); } } else { let dc = doc.comment; if (dc && chompKeep) dc = dc.replace(/^\n+/, ""); if (dc) { if ((!chompKeep || contentComment) && lines[lines.length - 1] !== "") lines.push(""); lines.push(indentComment(commentString(dc), "")); } } return lines.join("\n") + "\n"; } // node_modules/yaml/browser/dist/doc/applyReviver.js function applyReviver(reviver, obj, key, val) { if (val && typeof val === "object") { if (Array.isArray(val)) { for (let i = 0, len = val.length; i < len; ++i) { const v0 = val[i]; const v1 = applyReviver(reviver, val, String(i), v0); if (v1 === void 0) delete val[i]; else if (v1 !== v0) val[i] = v1; } } else if (val instanceof Map) { for (const k of Array.from(val.keys())) { const v0 = val.get(k); const v1 = applyReviver(reviver, val, k, v0); if (v1 === void 0) val.delete(k); else if (v1 !== v0) val.set(k, v1); } } else if (val instanceof Set) { for (const v0 of Array.from(val)) { const v1 = applyReviver(reviver, val, v0, v0); if (v1 === void 0) val.delete(v0); else if (v1 !== v0) { val.delete(v0); val.add(v1); } } } else { for (const [k, v0] of Object.entries(val)) { const v1 = applyReviver(reviver, val, k, v0); if (v1 === void 0) delete val[k]; else if (v1 !== v0) val[k] = v1; } } } return reviver.call(obj, key, val); } // node_modules/yaml/browser/dist/doc/Document.js var Document = class { constructor(value, replacer, options) { this.commentBefore = null; this.comment = null; this.errors = []; this.warnings = []; Object.defineProperty(this, NODE_TYPE, { value: DOC }); let _replacer = null; if (typeof replacer === "function" || Array.isArray(replacer)) { _replacer = replacer; } else if (options === void 0 && replacer) { options = replacer; replacer = void 0; } const opt = Object.assign({ intAsBigInt: false, keepSourceTokens: false, logLevel: "warn", prettyErrors: true, strict: true, uniqueKeys: true, version: "1.2" }, options); this.options = opt; let { version } = opt; if (options == null ? void 0 : options._directives) { this.directives = options._directives.atDocument(); if (this.directives.yaml.explicit) version = this.directives.yaml.version; } else this.directives = new Directives({ version }); this.setSchema(version, options); if (value === void 0) this.contents = null; else { this.contents = this.createNode(value, _replacer, options); } } clone() { const copy = Object.create(Document.prototype, { [NODE_TYPE]: { value: DOC } }); copy.commentBefore = this.commentBefore; copy.comment = this.comment; copy.errors = this.errors.slice(); copy.warnings = this.warnings.slice(); copy.options = Object.assign({}, this.options); if (this.directives) copy.directives = this.directives.clone(); copy.schema = this.schema.clone(); copy.contents = isNode(this.contents) ? this.contents.clone(copy.schema) : this.contents; if (this.range) copy.range = this.range.slice(); return copy; } add(value) { if (assertCollection(this.contents)) this.contents.add(value); } addIn(path, value) { if (assertCollection(this.contents)) this.contents.addIn(path, value); } createAlias(node, name) { if (!node.anchor) { const prev = anchorNames(this); node.anchor = !name || prev.has(name) ? findNewAnchor(name || "a", prev) : name; } return new Alias(node.anchor); } createNode(value, replacer, options) { let _replacer = void 0; if (typeof replacer === "function") { value = replacer.call({ "": value }, "", value); _replacer = replacer; } else if (Array.isArray(replacer)) { const keyToStr = (v) => typeof v === "number" || v instanceof String || v instanceof Number; const asStr = replacer.filter(keyToStr).map(String); if (asStr.length > 0) replacer = replacer.concat(asStr); _replacer = replacer; } else if (options === void 0 && replacer) { options = replacer; replacer = void 0; } const { aliasDuplicateObjects, anchorPrefix, flow, keepUndefined, onTagObj, tag } = options != null ? options : {}; const { onAnchor, setAnchors, sourceObjects } = createNodeAnchors(this, anchorPrefix || "a"); const ctx = { aliasDuplicateObjects: aliasDuplicateObjects != null ? aliasDuplicateObjects : true, keepUndefined: keepUndefined != null ? keepUndefined : false, onAnchor, onTagObj, replacer: _replacer, schema: this.schema, sourceObjects }; const node = createNode(value, tag, ctx); if (flow && isCollection(node)) node.flow = true; setAnchors(); return node; } createPair(key, value, options = {}) { const k = this.createNode(key, null, options); const v = this.createNode(value, null, options); return new Pair(k, v); } delete(key) { return assertCollection(this.contents) ? this.contents.delete(key) : false; } deleteIn(path) { if (isEmptyPath(path)) { if (this.contents == null) return false; this.contents = null; return true; } return assertCollection(this.contents) ? this.contents.deleteIn(path) : false; } get(key, keepScalar) { return isCollection(this.contents) ? this.contents.get(key, keepScalar) : void 0; } getIn(path, keepScalar) { if (isEmptyPath(path)) return !keepScalar && isScalar(this.contents) ? this.contents.value : this.contents; return isCollection(this.contents) ? this.contents.getIn(path, keepScalar) : void 0; } has(key) { return isCollection(this.contents) ? this.contents.has(key) : false; } hasIn(path) { if (isEmptyPath(path)) return this.contents !== void 0; return isCollection(this.contents) ? this.contents.hasIn(path) : false; } set(key, value) { if (this.contents == null) { this.contents = collectionFromPath(this.schema, [key], value); } else if (assertCollection(this.contents)) { this.contents.set(key, value); } } setIn(path, value) { if (isEmptyPath(path)) this.contents = value; else if (this.contents == null) { this.contents = collectionFromPath(this.schema, Array.from(path), value); } else if (assertCollection(this.contents)) { this.contents.setIn(path, value); } } setSchema(version, options = {}) { if (typeof version === "number") version = String(version); let opt; switch (version) { case "1.1": if (this.directives) this.directives.yaml.version = "1.1"; else this.directives = new Directives({ version: "1.1" }); opt = { merge: true, resolveKnownTags: false, schema: "yaml-1.1" }; break; case "1.2": case "next": if (this.directives) this.directives.yaml.version = version; else this.directives = new Directives({ version }); opt = { merge: false, resolveKnownTags: true, schema: "core" }; break; case null: if (this.directives) delete this.directives; opt = null; break; default: { const sv = JSON.stringify(version); throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${sv}`); } } if (options.schema instanceof Object) this.schema = options.schema; else if (opt) this.schema = new Schema(Object.assign(opt, options)); else throw new Error(`With a null YAML version, the { schema: Schema } option is required`); } toJS({ json, jsonArg, mapAsMap, maxAliasCount, onAnchor, reviver } = {}) { const ctx = { anchors: new Map(), doc: this, keep: !json, mapAsMap: mapAsMap === true, mapKeyWarned: false, maxAliasCount: typeof maxAliasCount === "number" ? maxAliasCount : 100, stringify }; const res = toJS(this.contents, jsonArg != null ? jsonArg : "", ctx); if (typeof onAnchor === "function") for (const { count, res: res2 } of ctx.anchors.values()) onAnchor(res2, count); return typeof reviver === "function" ? applyReviver(reviver, { "": res }, "", res) : res; } toJSON(jsonArg, onAnchor) { return this.toJS({ json: true, jsonArg, mapAsMap: false, onAnchor }); } toString(options = {}) { if (this.errors.length > 0) throw new Error("Document with errors cannot be stringified"); if ("indent" in options && (!Number.isInteger(options.indent) || Number(options.indent) <= 0)) { const s = JSON.stringify(options.indent); throw new Error(`"indent" option must be a positive integer, not ${s}`); } return stringifyDocument(this, options); } }; function assertCollection(contents) { if (isCollection(contents)) return true; throw new Error("Expected a YAML collection as document contents"); } // node_modules/yaml/browser/dist/parse/cst-visit.js var BREAK2 = Symbol("break visit"); var SKIP2 = Symbol("skip children"); var REMOVE2 = Symbol("remove item"); function visit2(cst, visitor) { if ("type" in cst && cst.type === "document") cst = { start: cst.start, value: cst.value }; _visit(Object.freeze([]), cst, visitor); } visit2.BREAK = BREAK2; visit2.SKIP = SKIP2; visit2.REMOVE = REMOVE2; visit2.itemAtPath = (cst, path) => { let item = cst; for (const [field, index] of path) { const tok = item == null ? void 0 : item[field]; if (tok && "items" in tok) { item = tok.items[index]; } else return void 0; } return item; }; visit2.parentCollection = (cst, path) => { const parent = visit2.itemAtPath(cst, path.slice(0, -1)); const field = path[path.length - 1][0]; const coll = parent == null ? void 0 : parent[field]; if (coll && "items" in coll) return coll; throw new Error("Parent collection not found"); }; function _visit(path, item, visitor) { let ctrl = visitor(item, path); if (typeof ctrl === "symbol") return ctrl; for (const field of ["key", "value"]) { const token = item[field]; if (token && "items" in token) { for (let i = 0; i < token.items.length; ++i) { const ci = _visit(Object.freeze(path.concat([[field, i]])), token.items[i], visitor); if (typeof ci === "number") i = ci - 1; else if (ci === BREAK2) return BREAK2; else if (ci === REMOVE2) { token.items.splice(i, 1); i -= 1; } } if (typeof ctrl === "function" && field === "key") ctrl = ctrl(item, path); } } return typeof ctrl === "function" ? ctrl(item, path) : ctrl; } // node_modules/yaml/browser/dist/parse/lexer.js var hexDigits = "0123456789ABCDEFabcdef".split(""); var tagChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()".split(""); var invalidFlowScalarChars = ",[]{}".split(""); var invalidAnchorChars = " ,[]{}\n\r ".split(""); // node_modules/yaml/browser/dist/public-api.js function stringify3(value, replacer, options) { var _a; let _replacer = null; if (typeof replacer === "function" || Array.isArray(replacer)) { _replacer = replacer; } else if (options === void 0 && replacer) { options = replacer; } if (typeof options === "string") options = options.length; if (typeof options === "number") { const indent = Math.round(options); options = indent < 1 ? void 0 : indent > 8 ? { indent: 8 } : { indent }; } if (value === void 0) { const { keepUndefined } = (_a = options != null ? options : replacer) != null ? _a : {}; if (!keepUndefined) return void 0; } return new Document(value, _replacer, options).toString(options); } // Upload2Notion.ts var Upload2Notion = class { constructor(app) { this.app = app; } createPage(title, childArr) { return __async(this, null, function* () { const bodyString = { parent: { database_id: this.app.settings.databaseID }, properties: { Name: { title: [ { text: { content: title } } ] } }, children: childArr }; const response = yield (0, import_obsidian2.requestUrl)({ url: `https://api.notion.com/v1/pages`, method: "POST", headers: { "Content-Type": "application/json", "Authorization": "Bearer " + this.app.settings.notionAPI, "Notion-Version": "2021-08-16" }, body: JSON.stringify(bodyString) }); return response; }); } syncMarkdownToNotion(title, markdown, fullPath) { return __async(this, null, function* () { const yamlObj = loadFront(markdown); const __content = yamlObj.__content; const file2md = (0, import_martian.markdownToBlocks)(__content); const res = yield this.createPage(title, file2md); if (res.status === 200) { this.updateYamlInfo(markdown, fullPath, res); } return res; }); } updateYamlInfo(yamlContent, fullPath, res) { return __async(this, null, function* () { const yamlObj = loadFront(yamlContent); const { url } = res.json; yamlObj.link = url; const __content = yamlObj.__content; delete yamlObj.__content; const yamlhead = stringify3(yamlObj); const yamlhead_remove_n = yamlhead.replace(/\n$/, ""); const __content_remove_n = __content.replace(/^\n/, ""); const content = "---\n" + yamlhead_remove_n + "\n---\n" + __content_remove_n; fs.writeFileSync(fullPath, content); return res; }); } }; // main.ts var DEFAULT_SETTINGS = { notionAPI: "", databaseID: "", proxy: "" }; var MyPlugin = class extends import_obsidian3.Plugin { onload() { return __async(this, null, function* () { yield this.loadSettings(); addIcons(); const ribbonIconEl = this.addRibbonIcon("notion-logo", "Share to notion", (evt) => __async(this, null, function* () { this.upload(); })); ribbonIconEl.addClass("my-plugin-ribbon-class"); const statusBarItemEl = this.addStatusBarItem(); this.addCommand({ id: "share-to-notion", name: "share to notion", editorCallback: (editor, view) => __async(this, null, function* () { this.upload(); }) }); this.addSettingTab(new SampleSettingTab(this.app, this)); }); } onunload() { } upload() { return __async(this, null, function* () { const { notionAPI, databaseID } = this.settings; if (notionAPI === "" || databaseID === "") { new import_obsidian3.Notice("Please set up the notion API and database ID in the settings tab."); return; } const { nowFile, fileData, fullPath } = yield this.getNowFileMarkdwonContent(this.app); const { basename } = nowFile; if (fileData) { const upload = new Upload2Notion(this); const res = yield upload.syncMarkdownToNotion(basename, fileData, fullPath); console.log(res); if (res.status === 200) { new import_obsidian3.Notice(`${basename} \u540C\u6B65\u6210\u529F`); } else { new import_obsidian3.Notice(`${basename} \u540C\u6B65\u5931\u8D25`); } } }); } getNowFileMarkdwonContent(app) { return __async(this, null, function* () { const nowFile = app.workspace.getActiveFile(); if (nowFile) { const filePath = nowFile.path; const basePath = nowFile.vault.adapter.basePath; const fullPath = (0, import_path.join)(basePath, filePath); console.log("fullpath", fullPath); const fileData = fs2.readFileSync(fullPath, "utf8"); return { fileData, nowFile, fullPath }; } else { new import_obsidian3.Notice("\u8BF7\u6253\u5F00\u9700\u8981\u540C\u6B65\u7684\u6587\u4EF6"); return; } }); } loadSettings() { return __async(this, null, function* () { this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData()); }); } saveSettings() { return __async(this, null, function* () { yield this.saveData(this.settings); }); } }; var SampleSettingTab = class extends import_obsidian3.PluginSettingTab { constructor(app, plugin) { super(app, plugin); this.plugin = plugin; } display() { const { containerEl } = this; containerEl.empty(); containerEl.createEl("h2", { text: "Settings for obsidian to notion plugin." }); new import_obsidian3.Setting(containerEl).setName("Notion API Token").setDesc("It's a secret").addText((text) => text.setPlaceholder("Enter your Notion API Token").setValue(this.plugin.settings.notionAPI).onChange((value) => __async(this, null, function* () { console.log("Secret: " + value); this.plugin.settings.notionAPI = value; yield this.plugin.saveSettings(); }))); new import_obsidian3.Setting(containerEl).setName("Database ID").setDesc("It's a secret").addText((text) => text.setPlaceholder("Enter your Database ID").setValue(this.plugin.settings.databaseID).onChange((value) => __async(this, null, function* () { console.log("Secret: " + value); this.plugin.settings.databaseID = value; yield this.plugin.saveSettings(); }))); } }; /*! * Determine if an object is a Buffer * * @author Feross Aboukhadijeh * @license MIT */ /*! * repeat-string * * Copyright (c) 2014-2015, Jon Schlinkert. * Licensed under the MIT License. */ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL2JhaWwvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2lzLWJ1ZmZlci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZXh0ZW5kL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9pcy1wbGFpbi1vYmovaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3Ryb3VnaC93cmFwLmpzIiwgIm5vZGVfbW9kdWxlcy90cm91Z2gvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtc3RyaW5naWZ5LXBvc2l0aW9uL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy92ZmlsZS1tZXNzYWdlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy92ZmlsZS9saWIvbWlucGF0aC5icm93c2VyLmpzIiwgIm5vZGVfbW9kdWxlcy92ZmlsZS9saWIvbWlucHJvYy5icm93c2VyLmpzIiwgIm5vZGVfbW9kdWxlcy92ZmlsZS9saWIvY29yZS5qcyIsICJub2RlX21vZHVsZXMvdmZpbGUvbGliL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy92ZmlsZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvdW5pZmllZC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1zdHJpbmcvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L2NvbnN0YW50L2Fzc2lnbi5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvY29uc3RhbnQvaGFzLW93bi1wcm9wZXJ0eS5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdXRpbC9ub3JtYWxpemUtaWRlbnRpZmllci5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvY29uc3RhbnQvZnJvbS1jaGFyLWNvZGUuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3V0aWwvc2FmZS1mcm9tLWludC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9jaGFyYWN0ZXIvbWFya2Rvd24tc3BhY2UuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3Rva2VuaXplL2ZhY3Rvcnktc3BhY2UuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L2luaXRpYWxpemUvY29udGVudC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdG9rZW5pemUvcGFydGlhbC1ibGFuay1saW5lLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9pbml0aWFsaXplL2RvY3VtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC91dGlsL3NpemUtY2h1bmtzLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC91dGlsL3ByZWZpeC1zaXplLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9jb25zdGFudC9zcGxpY2UuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3V0aWwvY2h1bmtlZC1zcGxpY2UuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3V0aWwvc2hhbGxvdy5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdXRpbC9zdWJ0b2tlbml6ZS5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdG9rZW5pemUvY29udGVudC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvaW5pdGlhbGl6ZS9mbG93LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9pbml0aWFsaXplL3RleHQuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3V0aWwvbWluaWZsYXQuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3V0aWwvY29tYmluZS1leHRlbnNpb25zLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC91dGlsL2NodW5rZWQtcHVzaC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdXRpbC9yZXNvbHZlLWFsbC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdXRpbC9zZXJpYWxpemUtY2h1bmtzLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC91dGlsL3NsaWNlLWNodW5rcy5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdXRpbC9jcmVhdGUtdG9rZW5pemVyLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmctb3Itc3BhY2UuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L2NvbnN0YW50L3VuaWNvZGUtcHVuY3R1YXRpb24tcmVnZXguanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3V0aWwvcmVnZXgtY2hlY2suanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L2NoYXJhY3Rlci91bmljb2RlLXB1bmN0dWF0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9jaGFyYWN0ZXIvdW5pY29kZS13aGl0ZXNwYWNlLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC91dGlsL2NsYXNzaWZ5LWNoYXJhY3Rlci5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdXRpbC9tb3ZlLXBvaW50LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC90b2tlbml6ZS9hdHRlbnRpb24uanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L2NoYXJhY3Rlci9hc2NpaS1hbHBoYS5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvY2hhcmFjdGVyL2FzY2lpLWFscGhhbnVtZXJpYy5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvY2hhcmFjdGVyL2FzY2lpLWF0ZXh0LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9jaGFyYWN0ZXIvYXNjaWktY29udHJvbC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdG9rZW5pemUvYXV0b2xpbmsuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3Rva2VuaXplL2Jsb2NrLXF1b3RlLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9jaGFyYWN0ZXIvYXNjaWktcHVuY3R1YXRpb24uanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3Rva2VuaXplL2NoYXJhY3Rlci1lc2NhcGUuanMiLCAibm9kZV9tb2R1bGVzL3BhcnNlLWVudGl0aWVzL2RlY29kZS1lbnRpdHkuYnJvd3Nlci5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvY2hhcmFjdGVyL2FzY2lpLWRpZ2l0LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9jaGFyYWN0ZXIvYXNjaWktaGV4LWRpZ2l0LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC90b2tlbml6ZS9jaGFyYWN0ZXItcmVmZXJlbmNlLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC90b2tlbml6ZS9jb2RlLWZlbmNlZC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdG9rZW5pemUvY29kZS1pbmRlbnRlZC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdG9rZW5pemUvY29kZS10ZXh0LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC90b2tlbml6ZS9mYWN0b3J5LWRlc3RpbmF0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC90b2tlbml6ZS9mYWN0b3J5LWxhYmVsLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC90b2tlbml6ZS9mYWN0b3J5LXdoaXRlc3BhY2UuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3Rva2VuaXplL2ZhY3RvcnktdGl0bGUuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3Rva2VuaXplL2RlZmluaXRpb24uanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3Rva2VuaXplL2hhcmQtYnJlYWstZXNjYXBlLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC90b2tlbml6ZS9oZWFkaW5nLWF0eC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvY29uc3RhbnQvaHRtbC1ibG9jay1uYW1lcy5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvY29uc3RhbnQvaHRtbC1yYXctbmFtZXMuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3Rva2VuaXplL2h0bWwtZmxvdy5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdG9rZW5pemUvaHRtbC10ZXh0LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC90b2tlbml6ZS9sYWJlbC1lbmQuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3Rva2VuaXplL2xhYmVsLXN0YXJ0LWltYWdlLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC90b2tlbml6ZS9sYWJlbC1zdGFydC1saW5rLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC90b2tlbml6ZS9saW5lLWVuZGluZy5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrL2Rpc3QvdG9rZW5pemUvdGhlbWF0aWMtYnJlYWsuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3Rva2VuaXplL2xpc3QuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3Rva2VuaXplL3NldGV4dC11bmRlcmxpbmUuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L2NvbnN0cnVjdHMuanMiLCAibm9kZV9tb2R1bGVzL21pY3JvbWFyay9kaXN0L3BhcnNlLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9wcmVwcm9jZXNzLmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmsvZGlzdC9wb3N0cHJvY2Vzcy5qcyIsICJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1mcm9tLW1hcmtkb3duL2Rpc3QvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZnJvbS1tYXJrZG93bi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvcmVtYXJrLXBhcnNlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9AdHJ5ZmFicmljL21hcnRpYW4vc3JjL25vdGlvbi9ibG9ja3MudHMiLCAibm9kZV9tb2R1bGVzL0B0cnlmYWJyaWMvbWFydGlhbi9zcmMvbm90aW9uL2NvbW1vbi50cyIsICJub2RlX21vZHVsZXMvQHRyeWZhYnJpYy9tYXJ0aWFuL3NyYy9ub3Rpb24vaW5kZXgudHMiLCAibm9kZV9tb2R1bGVzL0B0cnlmYWJyaWMvbWFydGlhbi9zcmMvcGFyc2VyL2ludGVybmFsLnRzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS1hdXRvbGluay1saXRlcmFsL3N5bnRheC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tYXV0b2xpbmstbGl0ZXJhbC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tc3RyaWtldGhyb3VnaC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGUvc3ludGF4LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YWJsZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFzay1saXN0LWl0ZW0vc3ludGF4LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS10YXNrLWxpc3QtaXRlbS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0vc3ludGF4LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hcmstZXh0ZW5zaW9uLWdmbS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvY2NvdW50L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy91bmlzdC11dGlsLWlzL2NvbnZlcnQuanMiLCAibm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50cy9jb2xvci5icm93c2VyLmpzIiwgIm5vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0LXBhcmVudHMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2VzY2FwZS1zdHJpbmctcmVnZXhwL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWZpbmQtYW5kLXJlcGxhY2UvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLWF1dG9saW5rLWxpdGVyYWwvZnJvbS1tYXJrZG93bi5qcyIsICJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0tc3RyaWtldGhyb3VnaC9mcm9tLW1hcmtkb3duLmpzIiwgIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS10YWJsZS9mcm9tLW1hcmtkb3duLmpzIiwgIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS10YXNrLWxpc3QtaXRlbS9mcm9tLW1hcmtkb3duLmpzIiwgIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS9mcm9tLW1hcmtkb3duLmpzIiwgIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLWdmbS1hdXRvbGluay1saXRlcmFsL3RvLW1hcmtkb3duLmpzIiwgIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NvbnRhaW5lci1waHJhc2luZy5qcyIsICJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0tc3RyaWtldGhyb3VnaC90by1tYXJrZG93bi5qcyIsICJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9wYXR0ZXJuLWNvbXBpbGUuanMiLCAibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9pbmxpbmUtY29kZS5qcyIsICJub2RlX21vZHVsZXMvcmVwZWF0LXN0cmluZy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvbWFya2Rvd24tdGFibGUvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZ2ZtLXRhYmxlL3RvLW1hcmtkb3duLmpzIiwgIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NoZWNrLWJ1bGxldC5qcyIsICJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jaGVjay1saXN0LWl0ZW0taW5kZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NvbnRhaW5lci1mbG93LmpzIiwgIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2luZGVudC1saW5lcy5qcyIsICJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2xpc3QtaXRlbS5qcyIsICJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0tdGFzay1saXN0LWl0ZW0vdG8tbWFya2Rvd24uanMiLCAibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2NvbmZpZ3VyZS5qcyIsICJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1nZm0vdG8tbWFya2Rvd24uanMiLCAibm9kZV9tb2R1bGVzL3JlbWFyay1nZm0vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0B0cnlmYWJyaWMvbWFydGlhbi9zcmMvaW5kZXgudHMiLCAibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvY29tbW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2V4Y2VwdGlvbi5qcyIsICJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9tYXJrLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUuanMiLCAibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc3RyLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc2VxLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbWFwLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9mYWlsc2FmZS5qcyIsICJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL251bGwuanMiLCAibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9ib29sLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvaW50LmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvZmxvYXQuanMiLCAibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2pzb24uanMiLCAibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2NvcmUuanMiLCAibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS90aW1lc3RhbXAuanMiLCAibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9tZXJnZS5qcyIsICJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2JpbmFyeS5qcyIsICJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL29tYXAuanMiLCAibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9wYWlycy5qcyIsICJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3NldC5qcyIsICJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZGVmYXVsdF9zYWZlLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvdW5kZWZpbmVkLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvcmVnZXhwLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvZnVuY3Rpb24uanMiLCAibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfZnVsbC5qcyIsICJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9sb2FkZXIuanMiLCAibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvZHVtcGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sLmpzIiwgIm5vZGVfbW9kdWxlcy9qcy15YW1sL2luZGV4LmpzIiwgIm1haW4udHMiLCAiaWNvbi50cyIsICJVcGxvYWQyTm90aW9uLnRzIiwgIm5vZGVfbW9kdWxlcy95YW1sLWZyb250LW1hdHRlci9zcmMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L25vZGVzL05vZGUuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3Zpc2l0LmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9kb2MvZGlyZWN0aXZlcy5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvZG9jL2FuY2hvcnMuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L25vZGVzL0FsaWFzLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy90b0pTLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9TY2FsYXIuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2RvYy9jcmVhdGVOb2RlLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9Db2xsZWN0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zdHJpbmdpZnkvc3RyaW5naWZ5Q29tbWVudC5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc3RyaW5naWZ5L2ZvbGRGbG93TGluZXMuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3N0cmluZ2lmeS9zdHJpbmdpZnlTdHJpbmcuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3N0cmluZ2lmeS9zdHJpbmdpZnkuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3N0cmluZ2lmeS9zdHJpbmdpZnlQYWlyLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9sb2cuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L25vZGVzL2FkZFBhaXJUb0pTTWFwLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9QYWlyLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zdHJpbmdpZnkvc3RyaW5naWZ5Q29sbGVjdGlvbi5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvbm9kZXMvWUFNTE1hcC5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2NvbW1vbi9tYXAuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L25vZGVzL1lBTUxTZXEuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9jb21tb24vc2VxLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29tbW9uL3N0cmluZy5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2NvbW1vbi9udWxsLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29yZS9ib29sLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zdHJpbmdpZnkvc3RyaW5naWZ5TnVtYmVyLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29yZS9mbG9hdC5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2NvcmUvaW50LmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29yZS9zY2hlbWEuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9qc29uL3NjaGVtYS5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL2JpbmFyeS5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL3BhaXJzLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEveWFtbC0xLjEvb21hcC5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL2Jvb2wuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS95YW1sLTEuMS9mbG9hdC5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL2ludC5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL3NldC5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL3RpbWVzdGFtcC5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL3NjaGVtYS5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3RhZ3MuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9TY2hlbWEuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3N0cmluZ2lmeS9zdHJpbmdpZnlEb2N1bWVudC5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvZG9jL2FwcGx5UmV2aXZlci5qcyIsICJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvZG9jL0RvY3VtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9wYXJzZS9jc3QtdmlzaXQuanMiLCAibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3BhcnNlL2xleGVyLmpzIiwgIm5vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9wdWJsaWMtYXBpLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSBiYWlsXG5cbmZ1bmN0aW9uIGJhaWwoZXJyKSB7XG4gIGlmIChlcnIpIHtcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuIiwgIi8qIVxuICogRGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIEJ1ZmZlclxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IgIT0gbnVsbCAmJlxuICAgIHR5cGVvZiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iailcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxudmFyIGlzQXJyYXkgPSBmdW5jdGlvbiBpc0FycmF5KGFycikge1xuXHRpZiAodHlwZW9mIEFycmF5LmlzQXJyYXkgPT09ICdmdW5jdGlvbicpIHtcblx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheShhcnIpO1xuXHR9XG5cblx0cmV0dXJuIHRvU3RyLmNhbGwoYXJyKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG5cbnZhciBpc1BsYWluT2JqZWN0ID0gZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcblx0aWYgKCFvYmogfHwgdG9TdHIuY2FsbChvYmopICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHZhciBoYXNPd25Db25zdHJ1Y3RvciA9IGhhc093bi5jYWxsKG9iaiwgJ2NvbnN0cnVjdG9yJyk7XG5cdHZhciBoYXNJc1Byb3RvdHlwZU9mID0gb2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgJiYgaGFzT3duLmNhbGwob2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgJ2lzUHJvdG90eXBlT2YnKTtcblx0Ly8gTm90IG93biBjb25zdHJ1Y3RvciBwcm9wZXJ0eSBtdXN0IGJlIE9iamVjdFxuXHRpZiAob2JqLmNvbnN0cnVjdG9yICYmICFoYXNPd25Db25zdHJ1Y3RvciAmJiAhaGFzSXNQcm90b3R5cGVPZikge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8vIE93biBwcm9wZXJ0aWVzIGFyZSBlbnVtZXJhdGVkIGZpcnN0bHksIHNvIHRvIHNwZWVkIHVwLFxuXHQvLyBpZiBsYXN0IG9uZSBpcyBvd24sIHRoZW4gYWxsIHByb3BlcnRpZXMgYXJlIG93bi5cblx0dmFyIGtleTtcblx0Zm9yIChrZXkgaW4gb2JqKSB7IC8qKi8gfVxuXG5cdHJldHVybiB0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJyB8fCBoYXNPd24uY2FsbChvYmosIGtleSk7XG59O1xuXG4vLyBJZiBuYW1lIGlzICdfX3Byb3RvX18nLCBhbmQgT2JqZWN0LmRlZmluZVByb3BlcnR5IGlzIGF2YWlsYWJsZSwgZGVmaW5lIF9fcHJvdG9fXyBhcyBhbiBvd24gcHJvcGVydHkgb24gdGFyZ2V0XG52YXIgc2V0UHJvcGVydHkgPSBmdW5jdGlvbiBzZXRQcm9wZXJ0eSh0YXJnZXQsIG9wdGlvbnMpIHtcblx0aWYgKGRlZmluZVByb3BlcnR5ICYmIG9wdGlvbnMubmFtZSA9PT0gJ19fcHJvdG9fXycpIHtcblx0XHRkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIG9wdGlvbnMubmFtZSwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiBvcHRpb25zLm5ld1ZhbHVlLFxuXHRcdFx0d3JpdGFibGU6IHRydWVcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHR0YXJnZXRbb3B0aW9ucy5uYW1lXSA9IG9wdGlvbnMubmV3VmFsdWU7XG5cdH1cbn07XG5cbi8vIFJldHVybiB1bmRlZmluZWQgaW5zdGVhZCBvZiBfX3Byb3RvX18gaWYgJ19fcHJvdG9fXycgaXMgbm90IGFuIG93biBwcm9wZXJ0eVxudmFyIGdldFByb3BlcnR5ID0gZnVuY3Rpb24gZ2V0UHJvcGVydHkob2JqLCBuYW1lKSB7XG5cdGlmIChuYW1lID09PSAnX19wcm90b19fJykge1xuXHRcdGlmICghaGFzT3duLmNhbGwob2JqLCBuYW1lKSkge1xuXHRcdFx0cmV0dXJuIHZvaWQgMDtcblx0XHR9IGVsc2UgaWYgKGdPUEQpIHtcblx0XHRcdC8vIEluIGVhcmx5IHZlcnNpb25zIG9mIG5vZGUsIG9ialsnX19wcm90b19fJ10gaXMgYnVnZ3kgd2hlbiBvYmogaGFzXG5cdFx0XHQvLyBfX3Byb3RvX18gYXMgYW4gb3duIHByb3BlcnR5LiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKCkgd29ya3MuXG5cdFx0XHRyZXR1cm4gZ09QRChvYmosIG5hbWUpLnZhbHVlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBvYmpbbmFtZV07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGV4dGVuZCgpIHtcblx0dmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJyYXksIGNsb25lO1xuXHR2YXIgdGFyZ2V0ID0gYXJndW1lbnRzWzBdO1xuXHR2YXIgaSA9IDE7XG5cdHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuXHR2YXIgZGVlcCA9IGZhbHNlO1xuXG5cdC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb25cblx0aWYgKHR5cGVvZiB0YXJnZXQgPT09ICdib29sZWFuJykge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWzFdIHx8IHt9O1xuXHRcdC8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXRcblx0XHRpID0gMjtcblx0fVxuXHRpZiAodGFyZ2V0ID09IG51bGwgfHwgKHR5cGVvZiB0YXJnZXQgIT09ICdvYmplY3QnICYmIHR5cGVvZiB0YXJnZXQgIT09ICdmdW5jdGlvbicpKSB7XG5cdFx0dGFyZ2V0ID0ge307XG5cdH1cblxuXHRmb3IgKDsgaSA8IGxlbmd0aDsgKytpKSB7XG5cdFx0b3B0aW9ucyA9IGFyZ3VtZW50c1tpXTtcblx0XHQvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzXG5cdFx0aWYgKG9wdGlvbnMgIT0gbnVsbCkge1xuXHRcdFx0Ly8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxuXHRcdFx0Zm9yIChuYW1lIGluIG9wdGlvbnMpIHtcblx0XHRcdFx0c3JjID0gZ2V0UHJvcGVydHkodGFyZ2V0LCBuYW1lKTtcblx0XHRcdFx0Y29weSA9IGdldFByb3BlcnR5KG9wdGlvbnMsIG5hbWUpO1xuXG5cdFx0XHRcdC8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3Bcblx0XHRcdFx0aWYgKHRhcmdldCAhPT0gY29weSkge1xuXHRcdFx0XHRcdC8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBwbGFpbiBvYmplY3RzIG9yIGFycmF5c1xuXHRcdFx0XHRcdGlmIChkZWVwICYmIGNvcHkgJiYgKGlzUGxhaW5PYmplY3QoY29weSkgfHwgKGNvcHlJc0FycmF5ID0gaXNBcnJheShjb3B5KSkpKSB7XG5cdFx0XHRcdFx0XHRpZiAoY29weUlzQXJyYXkpIHtcblx0XHRcdFx0XHRcdFx0Y29weUlzQXJyYXkgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgaXNBcnJheShzcmMpID8gc3JjIDogW107XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBpc1BsYWluT2JqZWN0KHNyYykgPyBzcmMgOiB7fTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gTmV2ZXIgbW92ZSBvcmlnaW5hbCBvYmplY3RzLCBjbG9uZSB0aGVtXG5cdFx0XHRcdFx0XHRzZXRQcm9wZXJ0eSh0YXJnZXQsIHsgbmFtZTogbmFtZSwgbmV3VmFsdWU6IGV4dGVuZChkZWVwLCBjbG9uZSwgY29weSkgfSk7XG5cblx0XHRcdFx0XHQvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzXG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgY29weSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0XHRcdHNldFByb3BlcnR5KHRhcmdldCwgeyBuYW1lOiBuYW1lLCBuZXdWYWx1ZTogY29weSB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gdmFsdWUgPT4ge1xuXHRpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuXHRyZXR1cm4gcHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBzbGljZSA9IFtdLnNsaWNlXG5cbm1vZHVsZS5leHBvcnRzID0gd3JhcFxuXG4vLyBXcmFwIGBmbmAuXG4vLyBDYW4gYmUgc3luYyBvciBhc3luYzsgcmV0dXJuIGEgcHJvbWlzZSwgcmVjZWl2ZSBhIGNvbXBsZXRpb24gaGFuZGxlciwgcmV0dXJuXG4vLyBuZXcgdmFsdWVzIGFuZCBlcnJvcnMuXG5mdW5jdGlvbiB3cmFwKGZuLCBjYWxsYmFjaykge1xuICB2YXIgaW52b2tlZFxuXG4gIHJldHVybiB3cmFwcGVkXG5cbiAgZnVuY3Rpb24gd3JhcHBlZCgpIHtcbiAgICB2YXIgcGFyYW1zID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDApXG4gICAgdmFyIGNhbGxiYWNrID0gZm4ubGVuZ3RoID4gcGFyYW1zLmxlbmd0aFxuICAgIHZhciByZXN1bHRcblxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgcGFyYW1zLnB1c2goZG9uZSlcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZm4uYXBwbHkobnVsbCwgcGFyYW1zKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBXZWxsLCB0aGlzIGlzIHF1aXRlIHRoZSBwaWNrbGUuXG4gICAgICAvLyBgZm5gIHJlY2VpdmVkIGEgY2FsbGJhY2sgYW5kIGludm9rZWQgaXQgKHRodXMgY29udGludWluZyB0aGUgcGlwZWxpbmUpLFxuICAgICAgLy8gYnV0IGxhdGVyIGFsc28gdGhyZXcgYW4gZXJyb3IuXG4gICAgICAvLyBXZVx1MjAxOXJlIG5vdCBhYm91dCB0byByZXN0YXJ0IHRoZSBwaXBlbGluZSBhZ2Fpbiwgc28gdGhlIG9ubHkgdGhpbmcgbGVmdFxuICAgICAgLy8gdG8gZG8gaXMgdG8gdGhyb3cgdGhlIHRoaW5nIGluc3RlYWQuXG4gICAgICBpZiAoY2FsbGJhY2sgJiYgaW52b2tlZCkge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZG9uZShlcnJvcilcbiAgICB9XG5cbiAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICBpZiAocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXN1bHQudGhlbih0aGVuLCBkb25lKVxuICAgICAgfSBlbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBkb25lKHJlc3VsdClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoZW4ocmVzdWx0KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEludm9rZSBgbmV4dGAsIG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICBpZiAoIWludm9rZWQpIHtcbiAgICAgIGludm9rZWQgPSB0cnVlXG5cbiAgICAgIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cylcbiAgICB9XG4gIH1cblxuICAvLyBJbnZva2UgYGRvbmVgIHdpdGggb25lIHZhbHVlLlxuICAvLyBUcmFja3MgaWYgYW4gZXJyb3IgaXMgcGFzc2VkLCB0b28uXG4gIGZ1bmN0aW9uIHRoZW4odmFsdWUpIHtcbiAgICBkb25lKG51bGwsIHZhbHVlKVxuICB9XG59XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciB3cmFwID0gcmVxdWlyZSgnLi93cmFwLmpzJylcblxubW9kdWxlLmV4cG9ydHMgPSB0cm91Z2hcblxudHJvdWdoLndyYXAgPSB3cmFwXG5cbnZhciBzbGljZSA9IFtdLnNsaWNlXG5cbi8vIENyZWF0ZSBuZXcgbWlkZGxld2FyZS5cbmZ1bmN0aW9uIHRyb3VnaCgpIHtcbiAgdmFyIGZucyA9IFtdXG4gIHZhciBtaWRkbGV3YXJlID0ge31cblxuICBtaWRkbGV3YXJlLnJ1biA9IHJ1blxuICBtaWRkbGV3YXJlLnVzZSA9IHVzZVxuXG4gIHJldHVybiBtaWRkbGV3YXJlXG5cbiAgLy8gUnVuIGBmbnNgLiAgTGFzdCBhcmd1bWVudCBtdXN0IGJlIGEgY29tcGxldGlvbiBoYW5kbGVyLlxuICBmdW5jdGlvbiBydW4oKSB7XG4gICAgdmFyIGluZGV4ID0gLTFcbiAgICB2YXIgaW5wdXQgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgLTEpXG4gICAgdmFyIGRvbmUgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdXG5cbiAgICBpZiAodHlwZW9mIGRvbmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZnVuY3Rpb24gYXMgbGFzdCBhcmd1bWVudCwgbm90ICcgKyBkb25lKVxuICAgIH1cblxuICAgIG5leHQuYXBwbHkobnVsbCwgW251bGxdLmNvbmNhdChpbnB1dCkpXG5cbiAgICAvLyBSdW4gdGhlIG5leHQgYGZuYCwgaWYgYW55LlxuICAgIGZ1bmN0aW9uIG5leHQoZXJyKSB7XG4gICAgICB2YXIgZm4gPSBmbnNbKytpbmRleF1cbiAgICAgIHZhciBwYXJhbXMgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMClcbiAgICAgIHZhciB2YWx1ZXMgPSBwYXJhbXMuc2xpY2UoMSlcbiAgICAgIHZhciBsZW5ndGggPSBpbnB1dC5sZW5ndGhcbiAgICAgIHZhciBwb3MgPSAtMVxuXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGRvbmUoZXJyKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gQ29weSBub24tbnVsbHkgaW5wdXQgaW50byB2YWx1ZXMuXG4gICAgICB3aGlsZSAoKytwb3MgPCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKHZhbHVlc1twb3NdID09PSBudWxsIHx8IHZhbHVlc1twb3NdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2YWx1ZXNbcG9zXSA9IGlucHV0W3Bvc11cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpbnB1dCA9IHZhbHVlc1xuXG4gICAgICAvLyBOZXh0IG9yIGRvbmUuXG4gICAgICBpZiAoZm4pIHtcbiAgICAgICAgd3JhcChmbiwgbmV4dCkuYXBwbHkobnVsbCwgaW5wdXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb25lLmFwcGx5KG51bGwsIFtudWxsXS5jb25jYXQoaW5wdXQpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCBgZm5gIHRvIHRoZSBsaXN0LlxuICBmdW5jdGlvbiB1c2UoZm4pIHtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGBmbmAgdG8gYmUgYSBmdW5jdGlvbiwgbm90ICcgKyBmbilcbiAgICB9XG5cbiAgICBmbnMucHVzaChmbilcblxuICAgIHJldHVybiBtaWRkbGV3YXJlXG4gIH1cbn1cbiIsICIndXNlIHN0cmljdCdcblxudmFyIG93biA9IHt9Lmhhc093blByb3BlcnR5XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaW5naWZ5XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeSh2YWx1ZSkge1xuICAvLyBOb3RoaW5nLlxuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIE5vZGUuXG4gIGlmIChvd24uY2FsbCh2YWx1ZSwgJ3Bvc2l0aW9uJykgfHwgb3duLmNhbGwodmFsdWUsICd0eXBlJykpIHtcbiAgICByZXR1cm4gcG9zaXRpb24odmFsdWUucG9zaXRpb24pXG4gIH1cblxuICAvLyBQb3NpdGlvbi5cbiAgaWYgKG93bi5jYWxsKHZhbHVlLCAnc3RhcnQnKSB8fCBvd24uY2FsbCh2YWx1ZSwgJ2VuZCcpKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uKHZhbHVlKVxuICB9XG5cbiAgLy8gUG9pbnQuXG4gIGlmIChvd24uY2FsbCh2YWx1ZSwgJ2xpbmUnKSB8fCBvd24uY2FsbCh2YWx1ZSwgJ2NvbHVtbicpKSB7XG4gICAgcmV0dXJuIHBvaW50KHZhbHVlKVxuICB9XG5cbiAgLy8gP1xuICByZXR1cm4gJydcbn1cblxuZnVuY3Rpb24gcG9pbnQocG9pbnQpIHtcbiAgaWYgKCFwb2ludCB8fCB0eXBlb2YgcG9pbnQgIT09ICdvYmplY3QnKSB7XG4gICAgcG9pbnQgPSB7fVxuICB9XG5cbiAgcmV0dXJuIGluZGV4KHBvaW50LmxpbmUpICsgJzonICsgaW5kZXgocG9pbnQuY29sdW1uKVxufVxuXG5mdW5jdGlvbiBwb3NpdGlvbihwb3MpIHtcbiAgaWYgKCFwb3MgfHwgdHlwZW9mIHBvcyAhPT0gJ29iamVjdCcpIHtcbiAgICBwb3MgPSB7fVxuICB9XG5cbiAgcmV0dXJuIHBvaW50KHBvcy5zdGFydCkgKyAnLScgKyBwb2ludChwb3MuZW5kKVxufVxuXG5mdW5jdGlvbiBpbmRleCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogMVxufVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgc3RyaW5naWZ5ID0gcmVxdWlyZSgndW5pc3QtdXRpbC1zdHJpbmdpZnktcG9zaXRpb24nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IFZNZXNzYWdlXG5cbi8vIEluaGVyaXQgZnJvbSBgRXJyb3IjYC5cbmZ1bmN0aW9uIFZNZXNzYWdlUHJvdG90eXBlKCkge31cblZNZXNzYWdlUHJvdG90eXBlLnByb3RvdHlwZSA9IEVycm9yLnByb3RvdHlwZVxuVk1lc3NhZ2UucHJvdG90eXBlID0gbmV3IFZNZXNzYWdlUHJvdG90eXBlKClcblxuLy8gTWVzc2FnZSBwcm9wZXJ0aWVzLlxudmFyIHByb3RvID0gVk1lc3NhZ2UucHJvdG90eXBlXG5cbnByb3RvLmZpbGUgPSAnJ1xucHJvdG8ubmFtZSA9ICcnXG5wcm90by5yZWFzb24gPSAnJ1xucHJvdG8ubWVzc2FnZSA9ICcnXG5wcm90by5zdGFjayA9ICcnXG5wcm90by5mYXRhbCA9IG51bGxcbnByb3RvLmNvbHVtbiA9IG51bGxcbnByb3RvLmxpbmUgPSBudWxsXG5cbi8vIENvbnN0cnVjdCBhIG5ldyBWTWVzc2FnZS5cbi8vXG4vLyBOb3RlOiBXZSBjYW5ub3QgaW52b2tlIGBFcnJvcmAgb24gdGhlIGNyZWF0ZWQgY29udGV4dCwgYXMgdGhhdCBhZGRzIHJlYWRvbmx5XG4vLyBgbGluZWAgYW5kIGBjb2x1bW5gIGF0dHJpYnV0ZXMgb24gU2FmYXJpIDksIHRodXMgdGhyb3dpbmcgYW5kIGZhaWxpbmcgdGhlXG4vLyBkYXRhLlxuZnVuY3Rpb24gVk1lc3NhZ2UocmVhc29uLCBwb3NpdGlvbiwgb3JpZ2luKSB7XG4gIHZhciBwYXJ0c1xuICB2YXIgcmFuZ2VcbiAgdmFyIGxvY2F0aW9uXG5cbiAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICBvcmlnaW4gPSBwb3NpdGlvblxuICAgIHBvc2l0aW9uID0gbnVsbFxuICB9XG5cbiAgcGFydHMgPSBwYXJzZU9yaWdpbihvcmlnaW4pXG4gIHJhbmdlID0gc3RyaW5naWZ5KHBvc2l0aW9uKSB8fCAnMToxJ1xuXG4gIGxvY2F0aW9uID0ge1xuICAgIHN0YXJ0OiB7bGluZTogbnVsbCwgY29sdW1uOiBudWxsfSxcbiAgICBlbmQ6IHtsaW5lOiBudWxsLCBjb2x1bW46IG51bGx9XG4gIH1cblxuICAvLyBOb2RlLlxuICBpZiAocG9zaXRpb24gJiYgcG9zaXRpb24ucG9zaXRpb24pIHtcbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uLnBvc2l0aW9uXG4gIH1cblxuICBpZiAocG9zaXRpb24pIHtcbiAgICAvLyBQb3NpdGlvbi5cbiAgICBpZiAocG9zaXRpb24uc3RhcnQpIHtcbiAgICAgIGxvY2F0aW9uID0gcG9zaXRpb25cbiAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24uc3RhcnRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUG9pbnQuXG4gICAgICBsb2NhdGlvbi5zdGFydCA9IHBvc2l0aW9uXG4gICAgfVxuICB9XG5cbiAgaWYgKHJlYXNvbi5zdGFjaykge1xuICAgIHRoaXMuc3RhY2sgPSByZWFzb24uc3RhY2tcbiAgICByZWFzb24gPSByZWFzb24ubWVzc2FnZVxuICB9XG5cbiAgdGhpcy5tZXNzYWdlID0gcmVhc29uXG4gIHRoaXMubmFtZSA9IHJhbmdlXG4gIHRoaXMucmVhc29uID0gcmVhc29uXG4gIHRoaXMubGluZSA9IHBvc2l0aW9uID8gcG9zaXRpb24ubGluZSA6IG51bGxcbiAgdGhpcy5jb2x1bW4gPSBwb3NpdGlvbiA/IHBvc2l0aW9uLmNvbHVtbiA6IG51bGxcbiAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uXG4gIHRoaXMuc291cmNlID0gcGFydHNbMF1cbiAgdGhpcy5ydWxlSWQgPSBwYXJ0c1sxXVxufVxuXG5mdW5jdGlvbiBwYXJzZU9yaWdpbihvcmlnaW4pIHtcbiAgdmFyIHJlc3VsdCA9IFtudWxsLCBudWxsXVxuICB2YXIgaW5kZXhcblxuICBpZiAodHlwZW9mIG9yaWdpbiA9PT0gJ3N0cmluZycpIHtcbiAgICBpbmRleCA9IG9yaWdpbi5pbmRleE9mKCc6JylcblxuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJlc3VsdFsxXSA9IG9yaWdpblxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRbMF0gPSBvcmlnaW4uc2xpY2UoMCwgaW5kZXgpXG4gICAgICByZXN1bHRbMV0gPSBvcmlnaW4uc2xpY2UoaW5kZXggKyAxKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cbiIsICIndXNlIHN0cmljdCdcblxuLy8gQSBkZXJpdmF0aXZlIHdvcmsgYmFzZWQgb246XG4vLyA8aHR0cHM6Ly9naXRodWIuY29tL2Jyb3dzZXJpZnkvcGF0aC1icm93c2VyaWZ5Pi5cbi8vIFdoaWNoIGlzIGxpY2Vuc2VkOlxuLy9cbi8vIE1JVCBMaWNlbnNlXG4vL1xuLy8gQ29weXJpZ2h0IChjKSAyMDEzIEphbWVzIEhhbGxpZGF5XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZlxuLy8gdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpblxuLy8gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0b1xuLy8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2Zcbi8vIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxcbi8vIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuLy8gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTU1xuLy8gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SXG4vLyBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVJcbi8vIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOXG4vLyBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuLy8gQSBkZXJpdmF0aXZlIHdvcmsgYmFzZWQgb246XG4vL1xuLy8gUGFydHMgb2YgdGhhdCBhcmUgZXh0cmFjdGVkIGZyb20gTm9kZVx1MjAxOXMgaW50ZXJuYWwgYHBhdGhgIG1vZHVsZTpcbi8vIDxodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9tYXN0ZXIvbGliL3BhdGguanM+LlxuLy8gV2hpY2ggaXMgbGljZW5zZWQ6XG4vL1xuLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbmV4cG9ydHMuYmFzZW5hbWUgPSBiYXNlbmFtZVxuZXhwb3J0cy5kaXJuYW1lID0gZGlybmFtZVxuZXhwb3J0cy5leHRuYW1lID0gZXh0bmFtZVxuZXhwb3J0cy5qb2luID0gam9pblxuZXhwb3J0cy5zZXAgPSAnLydcblxuZnVuY3Rpb24gYmFzZW5hbWUocGF0aCwgZXh0KSB7XG4gIHZhciBzdGFydCA9IDBcbiAgdmFyIGVuZCA9IC0xXG4gIHZhciBpbmRleFxuICB2YXIgZmlyc3ROb25TbGFzaEVuZFxuICB2YXIgc2Vlbk5vblNsYXNoXG4gIHZhciBleHRJbmRleFxuXG4gIGlmIChleHQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZXh0ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZXh0XCIgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZycpXG4gIH1cblxuICBhc3NlcnRQYXRoKHBhdGgpXG4gIGluZGV4ID0gcGF0aC5sZW5ndGhcblxuICBpZiAoZXh0ID09PSB1bmRlZmluZWQgfHwgIWV4dC5sZW5ndGggfHwgZXh0Lmxlbmd0aCA+IHBhdGgubGVuZ3RoKSB7XG4gICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgIGlmIChwYXRoLmNoYXJDb2RlQXQoaW5kZXgpID09PSA0NyAvKiBgL2AgKi8pIHtcbiAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBhIHBhdGggc2VwYXJhdG9yIHRoYXQgd2FzIG5vdCBwYXJ0IG9mIGEgc2V0IG9mIHBhdGhcbiAgICAgICAgLy8gc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHN0b3Agbm93LlxuICAgICAgICBpZiAoc2Vlbk5vblNsYXNoKSB7XG4gICAgICAgICAgc3RhcnQgPSBpbmRleCArIDFcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGVuZCA8IDApIHtcbiAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3IsIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91clxuICAgICAgICAvLyBwYXRoIGNvbXBvbmVudC5cbiAgICAgICAgc2Vlbk5vblNsYXNoID0gdHJ1ZVxuICAgICAgICBlbmQgPSBpbmRleCArIDFcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW5kIDwgMCA/ICcnIDogcGF0aC5zbGljZShzdGFydCwgZW5kKVxuICB9XG5cbiAgaWYgKGV4dCA9PT0gcGF0aCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgZmlyc3ROb25TbGFzaEVuZCA9IC0xXG4gIGV4dEluZGV4ID0gZXh0Lmxlbmd0aCAtIDFcblxuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIGlmIChwYXRoLmNoYXJDb2RlQXQoaW5kZXgpID09PSA0NyAvKiBgL2AgKi8pIHtcbiAgICAgIC8vIElmIHdlIHJlYWNoZWQgYSBwYXRoIHNlcGFyYXRvciB0aGF0IHdhcyBub3QgcGFydCBvZiBhIHNldCBvZiBwYXRoXG4gICAgICAvLyBzZXBhcmF0b3JzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZywgc3RvcCBub3cuXG4gICAgICBpZiAoc2Vlbk5vblNsYXNoKSB7XG4gICAgICAgIHN0YXJ0ID0gaW5kZXggKyAxXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChmaXJzdE5vblNsYXNoRW5kIDwgMCkge1xuICAgICAgICAvLyBXZSBzYXcgdGhlIGZpcnN0IG5vbi1wYXRoIHNlcGFyYXRvciwgcmVtZW1iZXIgdGhpcyBpbmRleCBpbiBjYXNlXG4gICAgICAgIC8vIHdlIG5lZWQgaXQgaWYgdGhlIGV4dGVuc2lvbiBlbmRzIHVwIG5vdCBtYXRjaGluZy5cbiAgICAgICAgc2Vlbk5vblNsYXNoID0gdHJ1ZVxuICAgICAgICBmaXJzdE5vblNsYXNoRW5kID0gaW5kZXggKyAxXG4gICAgICB9XG5cbiAgICAgIGlmIChleHRJbmRleCA+IC0xKSB7XG4gICAgICAgIC8vIFRyeSB0byBtYXRjaCB0aGUgZXhwbGljaXQgZXh0ZW5zaW9uLlxuICAgICAgICBpZiAocGF0aC5jaGFyQ29kZUF0KGluZGV4KSA9PT0gZXh0LmNoYXJDb2RlQXQoZXh0SW5kZXgtLSkpIHtcbiAgICAgICAgICBpZiAoZXh0SW5kZXggPCAwKSB7XG4gICAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBleHRlbnNpb24sIHNvIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91ciBwYXRoXG4gICAgICAgICAgICAvLyBjb21wb25lbnRcbiAgICAgICAgICAgIGVuZCA9IGluZGV4XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEV4dGVuc2lvbiBkb2VzIG5vdCBtYXRjaCwgc28gb3VyIHJlc3VsdCBpcyB0aGUgZW50aXJlIHBhdGhcbiAgICAgICAgICAvLyBjb21wb25lbnRcbiAgICAgICAgICBleHRJbmRleCA9IC0xXG4gICAgICAgICAgZW5kID0gZmlyc3ROb25TbGFzaEVuZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcbiAgICBlbmQgPSBmaXJzdE5vblNsYXNoRW5kXG4gIH0gZWxzZSBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCA9IHBhdGgubGVuZ3RoXG4gIH1cblxuICByZXR1cm4gcGF0aC5zbGljZShzdGFydCwgZW5kKVxufVxuXG5mdW5jdGlvbiBkaXJuYW1lKHBhdGgpIHtcbiAgdmFyIGVuZFxuICB2YXIgdW5tYXRjaGVkU2xhc2hcbiAgdmFyIGluZGV4XG5cbiAgYXNzZXJ0UGF0aChwYXRoKVxuXG4gIGlmICghcGF0aC5sZW5ndGgpIHtcbiAgICByZXR1cm4gJy4nXG4gIH1cblxuICBlbmQgPSAtMVxuICBpbmRleCA9IHBhdGgubGVuZ3RoXG5cbiAgLy8gUHJlZml4IGAtLWAgaXMgaW1wb3J0YW50IHRvIG5vdCBydW4gb24gYDBgLlxuICB3aGlsZSAoLS1pbmRleCkge1xuICAgIGlmIChwYXRoLmNoYXJDb2RlQXQoaW5kZXgpID09PSA0NyAvKiBgL2AgKi8pIHtcbiAgICAgIGlmICh1bm1hdGNoZWRTbGFzaCkge1xuICAgICAgICBlbmQgPSBpbmRleFxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXVubWF0Y2hlZFNsYXNoKSB7XG4gICAgICAvLyBXZSBzYXcgdGhlIGZpcnN0IG5vbi1wYXRoIHNlcGFyYXRvclxuICAgICAgdW5tYXRjaGVkU2xhc2ggPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVuZCA8IDBcbiAgICA/IHBhdGguY2hhckNvZGVBdCgwKSA9PT0gNDcgLyogYC9gICovXG4gICAgICA/ICcvJ1xuICAgICAgOiAnLidcbiAgICA6IGVuZCA9PT0gMSAmJiBwYXRoLmNoYXJDb2RlQXQoMCkgPT09IDQ3IC8qIGAvYCAqL1xuICAgID8gJy8vJ1xuICAgIDogcGF0aC5zbGljZSgwLCBlbmQpXG59XG5cbmZ1bmN0aW9uIGV4dG5hbWUocGF0aCkge1xuICB2YXIgc3RhcnREb3QgPSAtMVxuICB2YXIgc3RhcnRQYXJ0ID0gMFxuICB2YXIgZW5kID0gLTFcbiAgLy8gVHJhY2sgdGhlIHN0YXRlIG9mIGNoYXJhY3RlcnMgKGlmIGFueSkgd2Ugc2VlIGJlZm9yZSBvdXIgZmlyc3QgZG90IGFuZFxuICAvLyBhZnRlciBhbnkgcGF0aCBzZXBhcmF0b3Igd2UgZmluZC5cbiAgdmFyIHByZURvdFN0YXRlID0gMFxuICB2YXIgdW5tYXRjaGVkU2xhc2hcbiAgdmFyIGNvZGVcbiAgdmFyIGluZGV4XG5cbiAgYXNzZXJ0UGF0aChwYXRoKVxuXG4gIGluZGV4ID0gcGF0aC5sZW5ndGhcblxuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaW5kZXgpXG5cbiAgICBpZiAoY29kZSA9PT0gNDcgLyogYC9gICovKSB7XG4gICAgICAvLyBJZiB3ZSByZWFjaGVkIGEgcGF0aCBzZXBhcmF0b3IgdGhhdCB3YXMgbm90IHBhcnQgb2YgYSBzZXQgb2YgcGF0aFxuICAgICAgLy8gc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHN0b3Agbm93LlxuICAgICAgaWYgKHVubWF0Y2hlZFNsYXNoKSB7XG4gICAgICAgIHN0YXJ0UGFydCA9IGluZGV4ICsgMVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICAvLyBXZSBzYXcgdGhlIGZpcnN0IG5vbi1wYXRoIHNlcGFyYXRvciwgbWFyayB0aGlzIGFzIHRoZSBlbmQgb2Ygb3VyXG4gICAgICAvLyBleHRlbnNpb24uXG4gICAgICB1bm1hdGNoZWRTbGFzaCA9IHRydWVcbiAgICAgIGVuZCA9IGluZGV4ICsgMVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA0NiAvKiBgLmAgKi8pIHtcbiAgICAgIC8vIElmIHRoaXMgaXMgb3VyIGZpcnN0IGRvdCwgbWFyayBpdCBhcyB0aGUgc3RhcnQgb2Ygb3VyIGV4dGVuc2lvbi5cbiAgICAgIGlmIChzdGFydERvdCA8IDApIHtcbiAgICAgICAgc3RhcnREb3QgPSBpbmRleFxuICAgICAgfSBlbHNlIGlmIChwcmVEb3RTdGF0ZSAhPT0gMSkge1xuICAgICAgICBwcmVEb3RTdGF0ZSA9IDFcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0YXJ0RG90ID4gLTEpIHtcbiAgICAgIC8vIFdlIHNhdyBhIG5vbi1kb3QgYW5kIG5vbi1wYXRoIHNlcGFyYXRvciBiZWZvcmUgb3VyIGRvdCwgc28gd2Ugc2hvdWxkXG4gICAgICAvLyBoYXZlIGEgZ29vZCBjaGFuY2UgYXQgaGF2aW5nIGEgbm9uLWVtcHR5IGV4dGVuc2lvbi5cbiAgICAgIHByZURvdFN0YXRlID0gLTFcbiAgICB9XG4gIH1cblxuICBpZiAoXG4gICAgc3RhcnREb3QgPCAwIHx8XG4gICAgZW5kIDwgMCB8fFxuICAgIC8vIFdlIHNhdyBhIG5vbi1kb3QgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgZG90LlxuICAgIHByZURvdFN0YXRlID09PSAwIHx8XG4gICAgLy8gVGhlIChyaWdodC1tb3N0KSB0cmltbWVkIHBhdGggY29tcG9uZW50IGlzIGV4YWN0bHkgYC4uYC5cbiAgICAocHJlRG90U3RhdGUgPT09IDEgJiYgc3RhcnREb3QgPT09IGVuZCAtIDEgJiYgc3RhcnREb3QgPT09IHN0YXJ0UGFydCArIDEpXG4gICkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgcmV0dXJuIHBhdGguc2xpY2Uoc3RhcnREb3QsIGVuZClcbn1cblxuZnVuY3Rpb24gam9pbigpIHtcbiAgdmFyIGluZGV4ID0gLTFcbiAgdmFyIGpvaW5lZFxuXG4gIHdoaWxlICgrK2luZGV4IDwgYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGFzc2VydFBhdGgoYXJndW1lbnRzW2luZGV4XSlcblxuICAgIGlmIChhcmd1bWVudHNbaW5kZXhdKSB7XG4gICAgICBqb2luZWQgPVxuICAgICAgICBqb2luZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gYXJndW1lbnRzW2luZGV4XVxuICAgICAgICAgIDogam9pbmVkICsgJy8nICsgYXJndW1lbnRzW2luZGV4XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBqb2luZWQgPT09IHVuZGVmaW5lZCA/ICcuJyA6IG5vcm1hbGl6ZShqb2luZWQpXG59XG5cbi8vIE5vdGU6IGBub3JtYWxpemVgIGlzIG5vdCBleHBvc2VkIGFzIGBwYXRoLm5vcm1hbGl6ZWAsIHNvIHNvbWUgY29kZSBpc1xuLy8gbWFudWFsbHkgcmVtb3ZlZCBmcm9tIGl0LlxuZnVuY3Rpb24gbm9ybWFsaXplKHBhdGgpIHtcbiAgdmFyIGFic29sdXRlXG4gIHZhciB2YWx1ZVxuXG4gIGFzc2VydFBhdGgocGF0aClcblxuICBhYnNvbHV0ZSA9IHBhdGguY2hhckNvZGVBdCgwKSA9PT0gNDcgLyogYC9gICovXG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoIGFjY29yZGluZyB0byBQT1NJWCBydWxlcy5cbiAgdmFsdWUgPSBub3JtYWxpemVTdHJpbmcocGF0aCwgIWFic29sdXRlKVxuXG4gIGlmICghdmFsdWUubGVuZ3RoICYmICFhYnNvbHV0ZSkge1xuICAgIHZhbHVlID0gJy4nXG4gIH1cblxuICBpZiAodmFsdWUubGVuZ3RoICYmIHBhdGguY2hhckNvZGVBdChwYXRoLmxlbmd0aCAtIDEpID09PSA0NyAvKiAvICovKSB7XG4gICAgdmFsdWUgKz0gJy8nXG4gIH1cblxuICByZXR1cm4gYWJzb2x1dGUgPyAnLycgKyB2YWx1ZSA6IHZhbHVlXG59XG5cbi8vIFJlc29sdmUgYC5gIGFuZCBgLi5gIGVsZW1lbnRzIGluIGEgcGF0aCB3aXRoIGRpcmVjdG9yeSBuYW1lcy5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZyhwYXRoLCBhbGxvd0Fib3ZlUm9vdCkge1xuICB2YXIgcmVzdWx0ID0gJydcbiAgdmFyIGxhc3RTZWdtZW50TGVuZ3RoID0gMFxuICB2YXIgbGFzdFNsYXNoID0gLTFcbiAgdmFyIGRvdHMgPSAwXG4gIHZhciBpbmRleCA9IC0xXG4gIHZhciBjb2RlXG4gIHZhciBsYXN0U2xhc2hJbmRleFxuXG4gIHdoaWxlICgrK2luZGV4IDw9IHBhdGgubGVuZ3RoKSB7XG4gICAgaWYgKGluZGV4IDwgcGF0aC5sZW5ndGgpIHtcbiAgICAgIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaW5kZXgpXG4gICAgfSBlbHNlIGlmIChjb2RlID09PSA0NyAvKiBgL2AgKi8pIHtcbiAgICAgIGJyZWFrXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUgPSA0NyAvKiBgL2AgKi9cbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gNDcgLyogYC9gICovKSB7XG4gICAgICBpZiAobGFzdFNsYXNoID09PSBpbmRleCAtIDEgfHwgZG90cyA9PT0gMSkge1xuICAgICAgICAvLyBFbXB0eS5cbiAgICAgIH0gZWxzZSBpZiAobGFzdFNsYXNoICE9PSBpbmRleCAtIDEgJiYgZG90cyA9PT0gMikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzdWx0Lmxlbmd0aCA8IDIgfHxcbiAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCAhPT0gMiB8fFxuICAgICAgICAgIHJlc3VsdC5jaGFyQ29kZUF0KHJlc3VsdC5sZW5ndGggLSAxKSAhPT0gNDYgLyogYC5gICovIHx8XG4gICAgICAgICAgcmVzdWx0LmNoYXJDb2RlQXQocmVzdWx0Lmxlbmd0aCAtIDIpICE9PSA0NiAvKiBgLmAgKi9cbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICBsYXN0U2xhc2hJbmRleCA9IHJlc3VsdC5sYXN0SW5kZXhPZignLycpXG5cbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlIC0gTm8gY2x1ZSBob3cgdG8gY292ZXIgaXQuICovXG4gICAgICAgICAgICBpZiAobGFzdFNsYXNoSW5kZXggIT09IHJlc3VsdC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgIGlmIChsYXN0U2xhc2hJbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAnJ1xuICAgICAgICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gMFxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBsYXN0U2xhc2hJbmRleClcbiAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IHJlc3VsdC5sZW5ndGggLSAxIC0gcmVzdWx0Lmxhc3RJbmRleE9mKCcvJylcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGxhc3RTbGFzaCA9IGluZGV4XG4gICAgICAgICAgICAgIGRvdHMgPSAwXG4gICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSAnJ1xuICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAwXG4gICAgICAgICAgICBsYXN0U2xhc2ggPSBpbmRleFxuICAgICAgICAgICAgZG90cyA9IDBcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFsbG93QWJvdmVSb290KSB7XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lmxlbmd0aCA/IHJlc3VsdCArICcvLi4nIDogJy4uJ1xuICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gMlxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAgIHJlc3VsdCArPSAnLycgKyBwYXRoLnNsaWNlKGxhc3RTbGFzaCArIDEsIGluZGV4KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IHBhdGguc2xpY2UobGFzdFNsYXNoICsgMSwgaW5kZXgpXG4gICAgICAgIH1cblxuICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IGluZGV4IC0gbGFzdFNsYXNoIC0gMVxuICAgICAgfVxuXG4gICAgICBsYXN0U2xhc2ggPSBpbmRleFxuICAgICAgZG90cyA9IDBcbiAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDQ2IC8qIGAuYCAqLyAmJiBkb3RzID4gLTEpIHtcbiAgICAgIGRvdHMrK1xuICAgIH0gZWxzZSB7XG4gICAgICBkb3RzID0gLTFcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGFzc2VydFBhdGgocGF0aCkge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdQYXRoIG11c3QgYmUgYSBzdHJpbmcuIFJlY2VpdmVkICcgKyBKU09OLnN0cmluZ2lmeShwYXRoKVxuICAgIClcbiAgfVxufVxuIiwgIid1c2Ugc3RyaWN0J1xuXG4vLyBTb21ld2hhdCBiYXNlZCBvbjpcbi8vIDxodHRwczovL2dpdGh1Yi5jb20vZGVmdW5jdHpvbWJpZS9ub2RlLXByb2Nlc3MvYmxvYi9tYXN0ZXIvYnJvd3Nlci5qcz4uXG4vLyBCdXQgSSBkb25cdTIwMTl0IHRoaW5rIG9uZSB0aW55IGxpbmUgb2YgY29kZSBjYW4gYmUgY29weXJpZ2h0ZWQuIFx1RDgzRFx1REUwNVxuZXhwb3J0cy5jd2QgPSBjd2RcblxuZnVuY3Rpb24gY3dkKCkge1xuICByZXR1cm4gJy8nXG59XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBwID0gcmVxdWlyZSgnLi9taW5wYXRoJylcbnZhciBwcm9jID0gcmVxdWlyZSgnLi9taW5wcm9jJylcbnZhciBidWZmZXIgPSByZXF1aXJlKCdpcy1idWZmZXInKVxuXG5tb2R1bGUuZXhwb3J0cyA9IFZGaWxlXG5cbnZhciBvd24gPSB7fS5oYXNPd25Qcm9wZXJ0eVxuXG4vLyBPcmRlciBvZiBzZXR0aW5nIChsZWFzdCBzcGVjaWZpYyB0byBtb3N0KSwgd2UgbmVlZCB0aGlzIGJlY2F1c2Ugb3RoZXJ3aXNlXG4vLyBge3N0ZW06ICdhJywgcGF0aDogJ34vYi5qcyd9YCB3b3VsZCB0aHJvdywgYXMgYSBwYXRoIGlzIG5lZWRlZCBiZWZvcmUgYVxuLy8gc3RlbSBjYW4gYmUgc2V0LlxudmFyIG9yZGVyID0gWydoaXN0b3J5JywgJ3BhdGgnLCAnYmFzZW5hbWUnLCAnc3RlbScsICdleHRuYW1lJywgJ2Rpcm5hbWUnXVxuXG5WRmlsZS5wcm90b3R5cGUudG9TdHJpbmcgPSB0b1N0cmluZ1xuXG4vLyBBY2Nlc3MgZnVsbCBwYXRoIChgfi9pbmRleC5taW4uanNgKS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWRmlsZS5wcm90b3R5cGUsICdwYXRoJywge2dldDogZ2V0UGF0aCwgc2V0OiBzZXRQYXRofSlcblxuLy8gQWNjZXNzIHBhcmVudCBwYXRoIChgfmApLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZGaWxlLnByb3RvdHlwZSwgJ2Rpcm5hbWUnLCB7XG4gIGdldDogZ2V0RGlybmFtZSxcbiAgc2V0OiBzZXREaXJuYW1lXG59KVxuXG4vLyBBY2Nlc3MgYmFzZW5hbWUgKGBpbmRleC5taW4uanNgKS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWRmlsZS5wcm90b3R5cGUsICdiYXNlbmFtZScsIHtcbiAgZ2V0OiBnZXRCYXNlbmFtZSxcbiAgc2V0OiBzZXRCYXNlbmFtZVxufSlcblxuLy8gQWNjZXNzIGV4dG5hbWUgKGAuanNgKS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWRmlsZS5wcm90b3R5cGUsICdleHRuYW1lJywge1xuICBnZXQ6IGdldEV4dG5hbWUsXG4gIHNldDogc2V0RXh0bmFtZVxufSlcblxuLy8gQWNjZXNzIHN0ZW0gKGBpbmRleC5taW5gKS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWRmlsZS5wcm90b3R5cGUsICdzdGVtJywge2dldDogZ2V0U3RlbSwgc2V0OiBzZXRTdGVtfSlcblxuLy8gQ29uc3RydWN0IGEgbmV3IGZpbGUuXG5mdW5jdGlvbiBWRmlsZShvcHRpb25zKSB7XG4gIHZhciBwcm9wXG4gIHZhciBpbmRleFxuXG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7fVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJyB8fCBidWZmZXIob3B0aW9ucykpIHtcbiAgICBvcHRpb25zID0ge2NvbnRlbnRzOiBvcHRpb25zfVxuICB9IGVsc2UgaWYgKCdtZXNzYWdlJyBpbiBvcHRpb25zICYmICdtZXNzYWdlcycgaW4gb3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zXG4gIH1cblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVkZpbGUpKSB7XG4gICAgcmV0dXJuIG5ldyBWRmlsZShvcHRpb25zKVxuICB9XG5cbiAgdGhpcy5kYXRhID0ge31cbiAgdGhpcy5tZXNzYWdlcyA9IFtdXG4gIHRoaXMuaGlzdG9yeSA9IFtdXG4gIHRoaXMuY3dkID0gcHJvYy5jd2QoKVxuXG4gIC8vIFNldCBwYXRoIHJlbGF0ZWQgcHJvcGVydGllcyBpbiB0aGUgY29ycmVjdCBvcmRlci5cbiAgaW5kZXggPSAtMVxuXG4gIHdoaWxlICgrK2luZGV4IDwgb3JkZXIubGVuZ3RoKSB7XG4gICAgcHJvcCA9IG9yZGVyW2luZGV4XVxuXG4gICAgaWYgKG93bi5jYWxsKG9wdGlvbnMsIHByb3ApKSB7XG4gICAgICB0aGlzW3Byb3BdID0gb3B0aW9uc1twcm9wXVxuICAgIH1cbiAgfVxuXG4gIC8vIFNldCBub24tcGF0aCByZWxhdGVkIHByb3BlcnRpZXMuXG4gIGZvciAocHJvcCBpbiBvcHRpb25zKSB7XG4gICAgaWYgKG9yZGVyLmluZGV4T2YocHJvcCkgPCAwKSB7XG4gICAgICB0aGlzW3Byb3BdID0gb3B0aW9uc1twcm9wXVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQYXRoKCkge1xuICByZXR1cm4gdGhpcy5oaXN0b3J5W3RoaXMuaGlzdG9yeS5sZW5ndGggLSAxXVxufVxuXG5mdW5jdGlvbiBzZXRQYXRoKHBhdGgpIHtcbiAgYXNzZXJ0Tm9uRW1wdHkocGF0aCwgJ3BhdGgnKVxuXG4gIGlmICh0aGlzLnBhdGggIT09IHBhdGgpIHtcbiAgICB0aGlzLmhpc3RvcnkucHVzaChwYXRoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldERpcm5hbWUoKSB7XG4gIHJldHVybiB0eXBlb2YgdGhpcy5wYXRoID09PSAnc3RyaW5nJyA/IHAuZGlybmFtZSh0aGlzLnBhdGgpIDogdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIHNldERpcm5hbWUoZGlybmFtZSkge1xuICBhc3NlcnRQYXRoKHRoaXMucGF0aCwgJ2Rpcm5hbWUnKVxuICB0aGlzLnBhdGggPSBwLmpvaW4oZGlybmFtZSB8fCAnJywgdGhpcy5iYXNlbmFtZSlcbn1cblxuZnVuY3Rpb24gZ2V0QmFzZW5hbWUoKSB7XG4gIHJldHVybiB0eXBlb2YgdGhpcy5wYXRoID09PSAnc3RyaW5nJyA/IHAuYmFzZW5hbWUodGhpcy5wYXRoKSA6IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBzZXRCYXNlbmFtZShiYXNlbmFtZSkge1xuICBhc3NlcnROb25FbXB0eShiYXNlbmFtZSwgJ2Jhc2VuYW1lJylcbiAgYXNzZXJ0UGFydChiYXNlbmFtZSwgJ2Jhc2VuYW1lJylcbiAgdGhpcy5wYXRoID0gcC5qb2luKHRoaXMuZGlybmFtZSB8fCAnJywgYmFzZW5hbWUpXG59XG5cbmZ1bmN0aW9uIGdldEV4dG5hbWUoKSB7XG4gIHJldHVybiB0eXBlb2YgdGhpcy5wYXRoID09PSAnc3RyaW5nJyA/IHAuZXh0bmFtZSh0aGlzLnBhdGgpIDogdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIHNldEV4dG5hbWUoZXh0bmFtZSkge1xuICBhc3NlcnRQYXJ0KGV4dG5hbWUsICdleHRuYW1lJylcbiAgYXNzZXJ0UGF0aCh0aGlzLnBhdGgsICdleHRuYW1lJylcblxuICBpZiAoZXh0bmFtZSkge1xuICAgIGlmIChleHRuYW1lLmNoYXJDb2RlQXQoMCkgIT09IDQ2IC8qIGAuYCAqLykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdgZXh0bmFtZWAgbXVzdCBzdGFydCB3aXRoIGAuYCcpXG4gICAgfVxuXG4gICAgaWYgKGV4dG5hbWUuaW5kZXhPZignLicsIDEpID4gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYGV4dG5hbWVgIGNhbm5vdCBjb250YWluIG11bHRpcGxlIGRvdHMnKVxuICAgIH1cbiAgfVxuXG4gIHRoaXMucGF0aCA9IHAuam9pbih0aGlzLmRpcm5hbWUsIHRoaXMuc3RlbSArIChleHRuYW1lIHx8ICcnKSlcbn1cblxuZnVuY3Rpb24gZ2V0U3RlbSgpIHtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzLnBhdGggPT09ICdzdHJpbmcnXG4gICAgPyBwLmJhc2VuYW1lKHRoaXMucGF0aCwgdGhpcy5leHRuYW1lKVxuICAgIDogdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIHNldFN0ZW0oc3RlbSkge1xuICBhc3NlcnROb25FbXB0eShzdGVtLCAnc3RlbScpXG4gIGFzc2VydFBhcnQoc3RlbSwgJ3N0ZW0nKVxuICB0aGlzLnBhdGggPSBwLmpvaW4odGhpcy5kaXJuYW1lIHx8ICcnLCBzdGVtICsgKHRoaXMuZXh0bmFtZSB8fCAnJykpXG59XG5cbi8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGZpbGUuXG5mdW5jdGlvbiB0b1N0cmluZyhlbmNvZGluZykge1xuICByZXR1cm4gKHRoaXMuY29udGVudHMgfHwgJycpLnRvU3RyaW5nKGVuY29kaW5nKVxufVxuXG4vLyBBc3NlcnQgdGhhdCBgcGFydGAgaXMgbm90IGEgcGF0aCAoaS5lLiwgZG9lcyBub3QgY29udGFpbiBgcC5zZXBgKS5cbmZ1bmN0aW9uIGFzc2VydFBhcnQocGFydCwgbmFtZSkge1xuICBpZiAocGFydCAmJiBwYXJ0LmluZGV4T2YocC5zZXApID4gLTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnYCcgKyBuYW1lICsgJ2AgY2Fubm90IGJlIGEgcGF0aDogZGlkIG5vdCBleHBlY3QgYCcgKyBwLnNlcCArICdgJ1xuICAgIClcbiAgfVxufVxuXG4vLyBBc3NlcnQgdGhhdCBgcGFydGAgaXMgbm90IGVtcHR5LlxuZnVuY3Rpb24gYXNzZXJ0Tm9uRW1wdHkocGFydCwgbmFtZSkge1xuICBpZiAoIXBhcnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2AnICsgbmFtZSArICdgIGNhbm5vdCBiZSBlbXB0eScpXG4gIH1cbn1cblxuLy8gQXNzZXJ0IGBwYXRoYCBleGlzdHMuXG5mdW5jdGlvbiBhc3NlcnRQYXRoKHBhdGgsIG5hbWUpIHtcbiAgaWYgKCFwYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTZXR0aW5nIGAnICsgbmFtZSArICdgIHJlcXVpcmVzIGBwYXRoYCB0byBiZSBzZXQgdG9vJylcbiAgfVxufVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgVk1lc3NhZ2UgPSByZXF1aXJlKCd2ZmlsZS1tZXNzYWdlJylcbnZhciBWRmlsZSA9IHJlcXVpcmUoJy4vY29yZS5qcycpXG5cbm1vZHVsZS5leHBvcnRzID0gVkZpbGVcblxuVkZpbGUucHJvdG90eXBlLm1lc3NhZ2UgPSBtZXNzYWdlXG5WRmlsZS5wcm90b3R5cGUuaW5mbyA9IGluZm9cblZGaWxlLnByb3RvdHlwZS5mYWlsID0gZmFpbFxuXG4vLyBDcmVhdGUgYSBtZXNzYWdlIHdpdGggYHJlYXNvbmAgYXQgYHBvc2l0aW9uYC5cbi8vIFdoZW4gYW4gZXJyb3IgaXMgcGFzc2VkIGluIGFzIGByZWFzb25gLCBjb3BpZXMgdGhlIHN0YWNrLlxuZnVuY3Rpb24gbWVzc2FnZShyZWFzb24sIHBvc2l0aW9uLCBvcmlnaW4pIHtcbiAgdmFyIG1lc3NhZ2UgPSBuZXcgVk1lc3NhZ2UocmVhc29uLCBwb3NpdGlvbiwgb3JpZ2luKVxuXG4gIGlmICh0aGlzLnBhdGgpIHtcbiAgICBtZXNzYWdlLm5hbWUgPSB0aGlzLnBhdGggKyAnOicgKyBtZXNzYWdlLm5hbWVcbiAgICBtZXNzYWdlLmZpbGUgPSB0aGlzLnBhdGhcbiAgfVxuXG4gIG1lc3NhZ2UuZmF0YWwgPSBmYWxzZVxuXG4gIHRoaXMubWVzc2FnZXMucHVzaChtZXNzYWdlKVxuXG4gIHJldHVybiBtZXNzYWdlXG59XG5cbi8vIEZhaWw6IGNyZWF0ZXMgYSB2bWVzc2FnZSwgYXNzb2NpYXRlcyBpdCB3aXRoIHRoZSBmaWxlLCBhbmQgdGhyb3dzIGl0LlxuZnVuY3Rpb24gZmFpbCgpIHtcbiAgdmFyIG1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2UuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXG4gIG1lc3NhZ2UuZmF0YWwgPSB0cnVlXG5cbiAgdGhyb3cgbWVzc2FnZVxufVxuXG4vLyBJbmZvOiBjcmVhdGVzIGEgdm1lc3NhZ2UsIGFzc29jaWF0ZXMgaXQgd2l0aCB0aGUgZmlsZSwgYW5kIG1hcmtzIHRoZSBmYXRhbGl0eVxuLy8gYXMgbnVsbC5cbmZ1bmN0aW9uIGluZm8oKSB7XG4gIHZhciBtZXNzYWdlID0gdGhpcy5tZXNzYWdlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblxuICBtZXNzYWdlLmZhdGFsID0gbnVsbFxuXG4gIHJldHVybiBtZXNzYWdlXG59XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWInKVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgYmFpbCA9IHJlcXVpcmUoJ2JhaWwnKVxudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJ2lzLWJ1ZmZlcicpXG52YXIgZXh0ZW5kID0gcmVxdWlyZSgnZXh0ZW5kJylcbnZhciBwbGFpbiA9IHJlcXVpcmUoJ2lzLXBsYWluLW9iaicpXG52YXIgdHJvdWdoID0gcmVxdWlyZSgndHJvdWdoJylcbnZhciB2ZmlsZSA9IHJlcXVpcmUoJ3ZmaWxlJylcblxuLy8gRXhwb3NlIGEgZnJvemVuIHByb2Nlc3Nvci5cbm1vZHVsZS5leHBvcnRzID0gdW5pZmllZCgpLmZyZWV6ZSgpXG5cbnZhciBzbGljZSA9IFtdLnNsaWNlXG52YXIgb3duID0ge30uaGFzT3duUHJvcGVydHlcblxuLy8gUHJvY2VzcyBwaXBlbGluZS5cbnZhciBwaXBlbGluZSA9IHRyb3VnaCgpXG4gIC51c2UocGlwZWxpbmVQYXJzZSlcbiAgLnVzZShwaXBlbGluZVJ1bilcbiAgLnVzZShwaXBlbGluZVN0cmluZ2lmeSlcblxuZnVuY3Rpb24gcGlwZWxpbmVQYXJzZShwLCBjdHgpIHtcbiAgY3R4LnRyZWUgPSBwLnBhcnNlKGN0eC5maWxlKVxufVxuXG5mdW5jdGlvbiBwaXBlbGluZVJ1bihwLCBjdHgsIG5leHQpIHtcbiAgcC5ydW4oY3R4LnRyZWUsIGN0eC5maWxlLCBkb25lKVxuXG4gIGZ1bmN0aW9uIGRvbmUoZXJyb3IsIHRyZWUsIGZpbGUpIHtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIG5leHQoZXJyb3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIGN0eC50cmVlID0gdHJlZVxuICAgICAgY3R4LmZpbGUgPSBmaWxlXG4gICAgICBuZXh0KClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcGlwZWxpbmVTdHJpbmdpZnkocCwgY3R4KSB7XG4gIHZhciByZXN1bHQgPSBwLnN0cmluZ2lmeShjdHgudHJlZSwgY3R4LmZpbGUpXG5cbiAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkIHx8IHJlc3VsdCA9PT0gbnVsbCkge1xuICAgIC8vIEVtcHR5LlxuICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnIHx8IGJ1ZmZlcihyZXN1bHQpKSB7XG4gICAgaWYgKCd2YWx1ZScgaW4gY3R4LmZpbGUpIHtcbiAgICAgIGN0eC5maWxlLnZhbHVlID0gcmVzdWx0XG4gICAgfVxuXG4gICAgY3R4LmZpbGUuY29udGVudHMgPSByZXN1bHRcbiAgfSBlbHNlIHtcbiAgICBjdHguZmlsZS5yZXN1bHQgPSByZXN1bHRcbiAgfVxufVxuXG4vLyBGdW5jdGlvbiB0byBjcmVhdGUgdGhlIGZpcnN0IHByb2Nlc3Nvci5cbmZ1bmN0aW9uIHVuaWZpZWQoKSB7XG4gIHZhciBhdHRhY2hlcnMgPSBbXVxuICB2YXIgdHJhbnNmb3JtZXJzID0gdHJvdWdoKClcbiAgdmFyIG5hbWVzcGFjZSA9IHt9XG4gIHZhciBmcmVlemVJbmRleCA9IC0xXG4gIHZhciBmcm96ZW5cblxuICAvLyBEYXRhIG1hbmFnZW1lbnQuXG4gIHByb2Nlc3Nvci5kYXRhID0gZGF0YVxuXG4gIC8vIExvY2suXG4gIHByb2Nlc3Nvci5mcmVlemUgPSBmcmVlemVcblxuICAvLyBQbHVnaW5zLlxuICBwcm9jZXNzb3IuYXR0YWNoZXJzID0gYXR0YWNoZXJzXG4gIHByb2Nlc3Nvci51c2UgPSB1c2VcblxuICAvLyBBUEkuXG4gIHByb2Nlc3Nvci5wYXJzZSA9IHBhcnNlXG4gIHByb2Nlc3Nvci5zdHJpbmdpZnkgPSBzdHJpbmdpZnlcbiAgcHJvY2Vzc29yLnJ1biA9IHJ1blxuICBwcm9jZXNzb3IucnVuU3luYyA9IHJ1blN5bmNcbiAgcHJvY2Vzc29yLnByb2Nlc3MgPSBwcm9jZXNzXG4gIHByb2Nlc3Nvci5wcm9jZXNzU3luYyA9IHByb2Nlc3NTeW5jXG5cbiAgLy8gRXhwb3NlLlxuICByZXR1cm4gcHJvY2Vzc29yXG5cbiAgLy8gQ3JlYXRlIGEgbmV3IHByb2Nlc3NvciBiYXNlZCBvbiB0aGUgcHJvY2Vzc29yIGluIHRoZSBjdXJyZW50IHNjb3BlLlxuICBmdW5jdGlvbiBwcm9jZXNzb3IoKSB7XG4gICAgdmFyIGRlc3RpbmF0aW9uID0gdW5pZmllZCgpXG4gICAgdmFyIGluZGV4ID0gLTFcblxuICAgIHdoaWxlICgrK2luZGV4IDwgYXR0YWNoZXJzLmxlbmd0aCkge1xuICAgICAgZGVzdGluYXRpb24udXNlLmFwcGx5KG51bGwsIGF0dGFjaGVyc1tpbmRleF0pXG4gICAgfVxuXG4gICAgZGVzdGluYXRpb24uZGF0YShleHRlbmQodHJ1ZSwge30sIG5hbWVzcGFjZSkpXG5cbiAgICByZXR1cm4gZGVzdGluYXRpb25cbiAgfVxuXG4gIC8vIEZyZWV6ZTogdXNlZCB0byBzaWduYWwgYSBwcm9jZXNzb3IgdGhhdCBoYXMgZmluaXNoZWQgY29uZmlndXJhdGlvbi5cbiAgLy9cbiAgLy8gRm9yIGV4YW1wbGUsIHRha2UgdW5pZmllZCBpdHNlbGY6IGl0XHUyMDE5cyBmcm96ZW4uXG4gIC8vIFBsdWdpbnMgc2hvdWxkIG5vdCBiZSBhZGRlZCB0byBpdC5cbiAgLy8gUmF0aGVyLCBpdCBzaG91bGQgYmUgZXh0ZW5kZWQsIGJ5IGludm9raW5nIGl0LCBiZWZvcmUgbW9kaWZ5aW5nIGl0LlxuICAvL1xuICAvLyBJbiBlc3NlbmNlLCBhbHdheXMgaW52b2tlIHRoaXMgd2hlbiBleHBvcnRpbmcgYSBwcm9jZXNzb3IuXG4gIGZ1bmN0aW9uIGZyZWV6ZSgpIHtcbiAgICB2YXIgdmFsdWVzXG4gICAgdmFyIHRyYW5zZm9ybWVyXG5cbiAgICBpZiAoZnJvemVuKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc29yXG4gICAgfVxuXG4gICAgd2hpbGUgKCsrZnJlZXplSW5kZXggPCBhdHRhY2hlcnMubGVuZ3RoKSB7XG4gICAgICB2YWx1ZXMgPSBhdHRhY2hlcnNbZnJlZXplSW5kZXhdXG5cbiAgICAgIGlmICh2YWx1ZXNbMV0gPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZXNbMV0gPT09IHRydWUpIHtcbiAgICAgICAgdmFsdWVzWzFdID0gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIHRyYW5zZm9ybWVyID0gdmFsdWVzWzBdLmFwcGx5KHByb2Nlc3NvciwgdmFsdWVzLnNsaWNlKDEpKVxuXG4gICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybWVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRyYW5zZm9ybWVycy51c2UodHJhbnNmb3JtZXIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnJvemVuID0gdHJ1ZVxuICAgIGZyZWV6ZUluZGV4ID0gSW5maW5pdHlcblxuICAgIHJldHVybiBwcm9jZXNzb3JcbiAgfVxuXG4gIC8vIERhdGEgbWFuYWdlbWVudC5cbiAgLy8gR2V0dGVyIC8gc2V0dGVyIGZvciBwcm9jZXNzb3Itc3BlY2lmaWMgaW5mb3JtdGlvbi5cbiAgZnVuY3Rpb24gZGF0YShrZXksIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBTZXQgYGtleWAuXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBhc3NlcnRVbmZyb3plbignZGF0YScsIGZyb3plbilcbiAgICAgICAgbmFtZXNwYWNlW2tleV0gPSB2YWx1ZVxuICAgICAgICByZXR1cm4gcHJvY2Vzc29yXG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBga2V5YC5cbiAgICAgIHJldHVybiAob3duLmNhbGwobmFtZXNwYWNlLCBrZXkpICYmIG5hbWVzcGFjZVtrZXldKSB8fCBudWxsXG4gICAgfVxuXG4gICAgLy8gU2V0IHNwYWNlLlxuICAgIGlmIChrZXkpIHtcbiAgICAgIGFzc2VydFVuZnJvemVuKCdkYXRhJywgZnJvemVuKVxuICAgICAgbmFtZXNwYWNlID0ga2V5XG4gICAgICByZXR1cm4gcHJvY2Vzc29yXG4gICAgfVxuXG4gICAgLy8gR2V0IHNwYWNlLlxuICAgIHJldHVybiBuYW1lc3BhY2VcbiAgfVxuXG4gIC8vIFBsdWdpbiBtYW5hZ2VtZW50LlxuICAvL1xuICAvLyBQYXNzIGl0OlxuICAvLyAqICAgYW4gYXR0YWNoZXIgYW5kIG9wdGlvbnMsXG4gIC8vICogICBhIHByZXNldCxcbiAgLy8gKiAgIGEgbGlzdCBvZiBwcmVzZXRzLCBhdHRhY2hlcnMsIGFuZCBhcmd1bWVudHMgKGxpc3Qgb2YgYXR0YWNoZXJzIGFuZFxuICAvLyAgICAgb3B0aW9ucykuXG4gIGZ1bmN0aW9uIHVzZSh2YWx1ZSkge1xuICAgIHZhciBzZXR0aW5nc1xuXG4gICAgYXNzZXJ0VW5mcm96ZW4oJ3VzZScsIGZyb3plbilcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFbXB0eS5cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYWRkUGx1Z2luLmFwcGx5KG51bGwsIGFyZ3VtZW50cylcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICgnbGVuZ3RoJyBpbiB2YWx1ZSkge1xuICAgICAgICBhZGRMaXN0KHZhbHVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkUHJlc2V0KHZhbHVlKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHVzYWJsZSB2YWx1ZSwgbm90IGAnICsgdmFsdWUgKyAnYCcpXG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzKSB7XG4gICAgICBuYW1lc3BhY2Uuc2V0dGluZ3MgPSBleHRlbmQobmFtZXNwYWNlLnNldHRpbmdzIHx8IHt9LCBzZXR0aW5ncylcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvY2Vzc29yXG5cbiAgICBmdW5jdGlvbiBhZGRQcmVzZXQocmVzdWx0KSB7XG4gICAgICBhZGRMaXN0KHJlc3VsdC5wbHVnaW5zKVxuXG4gICAgICBpZiAocmVzdWx0LnNldHRpbmdzKSB7XG4gICAgICAgIHNldHRpbmdzID0gZXh0ZW5kKHNldHRpbmdzIHx8IHt9LCByZXN1bHQuc2V0dGluZ3MpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGFkZFBsdWdpbih2YWx1ZSlcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoJ2xlbmd0aCcgaW4gdmFsdWUpIHtcbiAgICAgICAgICBhZGRQbHVnaW4uYXBwbHkobnVsbCwgdmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkUHJlc2V0KHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHVzYWJsZSB2YWx1ZSwgbm90IGAnICsgdmFsdWUgKyAnYCcpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkTGlzdChwbHVnaW5zKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMVxuXG4gICAgICBpZiAocGx1Z2lucyA9PT0gbnVsbCB8fCBwbHVnaW5zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gRW1wdHkuXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwbHVnaW5zID09PSAnb2JqZWN0JyAmJiAnbGVuZ3RoJyBpbiBwbHVnaW5zKSB7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgcGx1Z2lucy5sZW5ndGgpIHtcbiAgICAgICAgICBhZGQocGx1Z2luc1tpbmRleF0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSBsaXN0IG9mIHBsdWdpbnMsIG5vdCBgJyArIHBsdWdpbnMgKyAnYCcpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkUGx1Z2luKHBsdWdpbiwgdmFsdWUpIHtcbiAgICAgIHZhciBlbnRyeSA9IGZpbmQocGx1Z2luKVxuXG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgaWYgKHBsYWluKGVudHJ5WzFdKSAmJiBwbGFpbih2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IGV4dGVuZCh0cnVlLCBlbnRyeVsxXSwgdmFsdWUpXG4gICAgICAgIH1cblxuICAgICAgICBlbnRyeVsxXSA9IHZhbHVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdHRhY2hlcnMucHVzaChzbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZmluZChwbHVnaW4pIHtcbiAgICB2YXIgaW5kZXggPSAtMVxuXG4gICAgd2hpbGUgKCsraW5kZXggPCBhdHRhY2hlcnMubGVuZ3RoKSB7XG4gICAgICBpZiAoYXR0YWNoZXJzW2luZGV4XVswXSA9PT0gcGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBhdHRhY2hlcnNbaW5kZXhdXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUGFyc2UgYSBmaWxlIChpbiBzdHJpbmcgb3IgdmZpbGUgcmVwcmVzZW50YXRpb24pIGludG8gYSB1bmlzdCBub2RlIHVzaW5nXG4gIC8vIHRoZSBgUGFyc2VyYCBvbiB0aGUgcHJvY2Vzc29yLlxuICBmdW5jdGlvbiBwYXJzZShkb2MpIHtcbiAgICB2YXIgZmlsZSA9IHZmaWxlKGRvYylcbiAgICB2YXIgUGFyc2VyXG5cbiAgICBmcmVlemUoKVxuICAgIFBhcnNlciA9IHByb2Nlc3Nvci5QYXJzZXJcbiAgICBhc3NlcnRQYXJzZXIoJ3BhcnNlJywgUGFyc2VyKVxuXG4gICAgaWYgKG5ld2FibGUoUGFyc2VyLCAncGFyc2UnKSkge1xuICAgICAgcmV0dXJuIG5ldyBQYXJzZXIoU3RyaW5nKGZpbGUpLCBmaWxlKS5wYXJzZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIFBhcnNlcihTdHJpbmcoZmlsZSksIGZpbGUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcFxuICB9XG5cbiAgLy8gUnVuIHRyYW5zZm9ybXMgb24gYSB1bmlzdCBub2RlIHJlcHJlc2VudGF0aW9uIG9mIGEgZmlsZSAoaW4gc3RyaW5nIG9yXG4gIC8vIHZmaWxlIHJlcHJlc2VudGF0aW9uKSwgYXN5bmMuXG4gIGZ1bmN0aW9uIHJ1bihub2RlLCBmaWxlLCBjYikge1xuICAgIGFzc2VydE5vZGUobm9kZSlcbiAgICBmcmVlemUoKVxuXG4gICAgaWYgKCFjYiAmJiB0eXBlb2YgZmlsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IgPSBmaWxlXG4gICAgICBmaWxlID0gbnVsbFxuICAgIH1cblxuICAgIGlmICghY2IpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShleGVjdXRvcilcbiAgICB9XG5cbiAgICBleGVjdXRvcihudWxsLCBjYilcblxuICAgIGZ1bmN0aW9uIGV4ZWN1dG9yKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdHJhbnNmb3JtZXJzLnJ1bihub2RlLCB2ZmlsZShmaWxlKSwgZG9uZSlcblxuICAgICAgZnVuY3Rpb24gZG9uZShlcnJvciwgdHJlZSwgZmlsZSkge1xuICAgICAgICB0cmVlID0gdHJlZSB8fCBub2RlXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgfSBlbHNlIGlmIChyZXNvbHZlKSB7XG4gICAgICAgICAgcmVzb2x2ZSh0cmVlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNiKG51bGwsIHRyZWUsIGZpbGUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSdW4gdHJhbnNmb3JtcyBvbiBhIHVuaXN0IG5vZGUgcmVwcmVzZW50YXRpb24gb2YgYSBmaWxlIChpbiBzdHJpbmcgb3JcbiAgLy8gdmZpbGUgcmVwcmVzZW50YXRpb24pLCBzeW5jLlxuICBmdW5jdGlvbiBydW5TeW5jKG5vZGUsIGZpbGUpIHtcbiAgICB2YXIgcmVzdWx0XG4gICAgdmFyIGNvbXBsZXRlXG5cbiAgICBydW4obm9kZSwgZmlsZSwgZG9uZSlcblxuICAgIGFzc2VydERvbmUoJ3J1blN5bmMnLCAncnVuJywgY29tcGxldGUpXG5cbiAgICByZXR1cm4gcmVzdWx0XG5cbiAgICBmdW5jdGlvbiBkb25lKGVycm9yLCB0cmVlKSB7XG4gICAgICBjb21wbGV0ZSA9IHRydWVcbiAgICAgIHJlc3VsdCA9IHRyZWVcbiAgICAgIGJhaWwoZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgLy8gU3RyaW5naWZ5IGEgdW5pc3Qgbm9kZSByZXByZXNlbnRhdGlvbiBvZiBhIGZpbGUgKGluIHN0cmluZyBvciB2ZmlsZVxuICAvLyByZXByZXNlbnRhdGlvbikgaW50byBhIHN0cmluZyB1c2luZyB0aGUgYENvbXBpbGVyYCBvbiB0aGUgcHJvY2Vzc29yLlxuICBmdW5jdGlvbiBzdHJpbmdpZnkobm9kZSwgZG9jKSB7XG4gICAgdmFyIGZpbGUgPSB2ZmlsZShkb2MpXG4gICAgdmFyIENvbXBpbGVyXG5cbiAgICBmcmVlemUoKVxuICAgIENvbXBpbGVyID0gcHJvY2Vzc29yLkNvbXBpbGVyXG4gICAgYXNzZXJ0Q29tcGlsZXIoJ3N0cmluZ2lmeScsIENvbXBpbGVyKVxuICAgIGFzc2VydE5vZGUobm9kZSlcblxuICAgIGlmIChuZXdhYmxlKENvbXBpbGVyLCAnY29tcGlsZScpKSB7XG4gICAgICByZXR1cm4gbmV3IENvbXBpbGVyKG5vZGUsIGZpbGUpLmNvbXBpbGUoKVxuICAgIH1cblxuICAgIHJldHVybiBDb21waWxlcihub2RlLCBmaWxlKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXBcbiAgfVxuXG4gIC8vIFBhcnNlIGEgZmlsZSAoaW4gc3RyaW5nIG9yIHZmaWxlIHJlcHJlc2VudGF0aW9uKSBpbnRvIGEgdW5pc3Qgbm9kZSB1c2luZ1xuICAvLyB0aGUgYFBhcnNlcmAgb24gdGhlIHByb2Nlc3NvciwgdGhlbiBydW4gdHJhbnNmb3JtcyBvbiB0aGF0IG5vZGUsIGFuZFxuICAvLyBjb21waWxlIHRoZSByZXN1bHRpbmcgbm9kZSB1c2luZyB0aGUgYENvbXBpbGVyYCBvbiB0aGUgcHJvY2Vzc29yLCBhbmRcbiAgLy8gc3RvcmUgdGhhdCByZXN1bHQgb24gdGhlIHZmaWxlLlxuICBmdW5jdGlvbiBwcm9jZXNzKGRvYywgY2IpIHtcbiAgICBmcmVlemUoKVxuICAgIGFzc2VydFBhcnNlcigncHJvY2VzcycsIHByb2Nlc3Nvci5QYXJzZXIpXG4gICAgYXNzZXJ0Q29tcGlsZXIoJ3Byb2Nlc3MnLCBwcm9jZXNzb3IuQ29tcGlsZXIpXG5cbiAgICBpZiAoIWNiKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZXhlY3V0b3IpXG4gICAgfVxuXG4gICAgZXhlY3V0b3IobnVsbCwgY2IpXG5cbiAgICBmdW5jdGlvbiBleGVjdXRvcihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBmaWxlID0gdmZpbGUoZG9jKVxuXG4gICAgICBwaXBlbGluZS5ydW4ocHJvY2Vzc29yLCB7ZmlsZTogZmlsZX0sIGRvbmUpXG5cbiAgICAgIGZ1bmN0aW9uIGRvbmUoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICB9IGVsc2UgaWYgKHJlc29sdmUpIHtcbiAgICAgICAgICByZXNvbHZlKGZpbGUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2IobnVsbCwgZmlsZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFByb2Nlc3MgdGhlIGdpdmVuIGRvY3VtZW50IChpbiBzdHJpbmcgb3IgdmZpbGUgcmVwcmVzZW50YXRpb24pLCBzeW5jLlxuICBmdW5jdGlvbiBwcm9jZXNzU3luYyhkb2MpIHtcbiAgICB2YXIgZmlsZVxuICAgIHZhciBjb21wbGV0ZVxuXG4gICAgZnJlZXplKClcbiAgICBhc3NlcnRQYXJzZXIoJ3Byb2Nlc3NTeW5jJywgcHJvY2Vzc29yLlBhcnNlcilcbiAgICBhc3NlcnRDb21waWxlcigncHJvY2Vzc1N5bmMnLCBwcm9jZXNzb3IuQ29tcGlsZXIpXG4gICAgZmlsZSA9IHZmaWxlKGRvYylcblxuICAgIHByb2Nlc3MoZmlsZSwgZG9uZSlcblxuICAgIGFzc2VydERvbmUoJ3Byb2Nlc3NTeW5jJywgJ3Byb2Nlc3MnLCBjb21wbGV0ZSlcblxuICAgIHJldHVybiBmaWxlXG5cbiAgICBmdW5jdGlvbiBkb25lKGVycm9yKSB7XG4gICAgICBjb21wbGV0ZSA9IHRydWVcbiAgICAgIGJhaWwoZXJyb3IpXG4gICAgfVxuICB9XG59XG5cbi8vIENoZWNrIGlmIGB2YWx1ZWAgaXMgYSBjb25zdHJ1Y3Rvci5cbmZ1bmN0aW9uIG5ld2FibGUodmFsdWUsIG5hbWUpIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgJiZcbiAgICB2YWx1ZS5wcm90b3R5cGUgJiZcbiAgICAvLyBBIGZ1bmN0aW9uIHdpdGgga2V5cyBpbiBpdHMgcHJvdG90eXBlIGlzIHByb2JhYmx5IGEgY29uc3RydWN0b3IuXG4gICAgLy8gQ2xhc3Nlc1x1MjAxOSBwcm90b3R5cGUgbWV0aG9kcyBhcmUgbm90IGVudW1lcmFibGUsIHNvIHdlIGNoZWNrIGlmIHNvbWUgdmFsdWVcbiAgICAvLyBleGlzdHMgaW4gdGhlIHByb3RvdHlwZS5cbiAgICAoa2V5cyh2YWx1ZS5wcm90b3R5cGUpIHx8IG5hbWUgaW4gdmFsdWUucHJvdG90eXBlKVxuICApXG59XG5cbi8vIENoZWNrIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0IHdpdGgga2V5cy5cbmZ1bmN0aW9uIGtleXModmFsdWUpIHtcbiAgdmFyIGtleVxuICBmb3IgKGtleSBpbiB2YWx1ZSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuLy8gQXNzZXJ0IGEgcGFyc2VyIGlzIGF2YWlsYWJsZS5cbmZ1bmN0aW9uIGFzc2VydFBhcnNlcihuYW1lLCBQYXJzZXIpIHtcbiAgaWYgKHR5cGVvZiBQYXJzZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBgJyArIG5hbWUgKyAnYCB3aXRob3V0IGBQYXJzZXJgJylcbiAgfVxufVxuXG4vLyBBc3NlcnQgYSBjb21waWxlciBpcyBhdmFpbGFibGUuXG5mdW5jdGlvbiBhc3NlcnRDb21waWxlcihuYW1lLCBDb21waWxlcikge1xuICBpZiAodHlwZW9mIENvbXBpbGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYCcgKyBuYW1lICsgJ2Agd2l0aG91dCBgQ29tcGlsZXJgJylcbiAgfVxufVxuXG4vLyBBc3NlcnQgdGhlIHByb2Nlc3NvciBpcyBub3QgZnJvemVuLlxuZnVuY3Rpb24gYXNzZXJ0VW5mcm96ZW4obmFtZSwgZnJvemVuKSB7XG4gIGlmIChmcm96ZW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQ2Fubm90IGludm9rZSBgJyArXG4gICAgICAgIG5hbWUgK1xuICAgICAgICAnYCBvbiBhIGZyb3plbiBwcm9jZXNzb3IuXFxuQ3JlYXRlIGEgbmV3IHByb2Nlc3NvciBmaXJzdCwgYnkgaW52b2tpbmcgaXQ6IHVzZSBgcHJvY2Vzc29yKClgIGluc3RlYWQgb2YgYHByb2Nlc3NvcmAuJ1xuICAgIClcbiAgfVxufVxuXG4vLyBBc3NlcnQgYG5vZGVgIGlzIGEgdW5pc3Qgbm9kZS5cbmZ1bmN0aW9uIGFzc2VydE5vZGUobm9kZSkge1xuICBpZiAoIW5vZGUgfHwgdHlwZW9mIG5vZGUudHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIG5vZGUsIGdvdCBgJyArIG5vZGUgKyAnYCcpXG4gIH1cbn1cblxuLy8gQXNzZXJ0IHRoYXQgYGNvbXBsZXRlYCBpcyBgdHJ1ZWAuXG5mdW5jdGlvbiBhc3NlcnREb25lKG5hbWUsIGFzeW5jTmFtZSwgY29tcGxldGUpIHtcbiAgaWYgKCFjb21wbGV0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdgJyArIG5hbWUgKyAnYCBmaW5pc2hlZCBhc3luYy4gVXNlIGAnICsgYXN5bmNOYW1lICsgJ2AgaW5zdGVhZCdcbiAgICApXG4gIH1cbn1cbiIsICIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB0b1N0cmluZ1xuXG4vLyBHZXQgdGhlIHRleHQgY29udGVudCBvZiBhIG5vZGUuXG4vLyBQcmVmZXIgdGhlIG5vZGVcdTIwMTlzIHBsYWluLXRleHQgZmllbGRzLCBvdGhlcndpc2Ugc2VyaWFsaXplIGl0cyBjaGlsZHJlbixcbi8vIGFuZCBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gYXJyYXksIHNlcmlhbGl6ZSB0aGUgbm9kZXMgaW4gaXQuXG5mdW5jdGlvbiB0b1N0cmluZyhub2RlKSB7XG4gIHJldHVybiAoXG4gICAgKG5vZGUgJiZcbiAgICAgIChub2RlLnZhbHVlIHx8XG4gICAgICAgIG5vZGUuYWx0IHx8XG4gICAgICAgIG5vZGUudGl0bGUgfHxcbiAgICAgICAgKCdjaGlsZHJlbicgaW4gbm9kZSAmJiBhbGwobm9kZS5jaGlsZHJlbikpIHx8XG4gICAgICAgICgnbGVuZ3RoJyBpbiBub2RlICYmIGFsbChub2RlKSkpKSB8fFxuICAgICcnXG4gIClcbn1cblxuZnVuY3Rpb24gYWxsKHZhbHVlcykge1xuICB2YXIgcmVzdWx0ID0gW11cbiAgdmFyIGluZGV4ID0gLTFcblxuICB3aGlsZSAoKytpbmRleCA8IHZhbHVlcy5sZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gdG9TdHJpbmcodmFsdWVzW2luZGV4XSlcbiAgfVxuXG4gIHJldHVybiByZXN1bHQuam9pbignJylcbn1cbiIsICIndXNlIHN0cmljdCdcblxudmFyIGFzc2lnbiA9IE9iamVjdC5hc3NpZ25cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NpZ25cbiIsICIndXNlIHN0cmljdCdcblxudmFyIG93biA9IHt9Lmhhc093blByb3BlcnR5XG5cbm1vZHVsZS5leHBvcnRzID0gb3duXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUlkZW50aWZpZXIodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAvLyBDb2xsYXBzZSBNYXJrZG93biB3aGl0ZXNwYWNlLlxuICAgICAgLnJlcGxhY2UoL1tcXHRcXG5cXHIgXSsvZywgJyAnKSAvLyBUcmltLlxuICAgICAgLnJlcGxhY2UoL14gfCAkL2csICcnKSAvLyBTb21lIGNoYXJhY3RlcnMgYXJlIGNvbnNpZGVyZWQgXHUyMDFDdXBwZXJjYXNlXHUyMDFELCBidXQgaWYgdGhlaXIgbG93ZXJjYXNlXG4gICAgICAvLyBjb3VudGVycGFydCBpcyB1cHBlcmNhc2VkIHdpbGwgcmVzdWx0IGluIGEgZGlmZmVyZW50IHVwcGVyY2FzZVxuICAgICAgLy8gY2hhcmFjdGVyLlxuICAgICAgLy8gSGVuY2UsIHRvIGdldCB0aGF0IGZvcm0sIHdlIHBlcmZvcm0gYm90aCBsb3dlci0gYW5kIHVwcGVyY2FzZS5cbiAgICAgIC8vIFVwcGVyIGNhc2UgbWFrZXMgc3VyZSBrZXlzIHdpbGwgbm90IGludGVyYWN0IHdpdGggZGVmYXVsdCBwcm90b3R5cGFsXG4gICAgICAvLyBtZXRob2RzOiBubyBvYmplY3QgbWV0aG9kIGlzIHVwcGVyY2FzZS5cbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAudG9VcHBlckNhc2UoKVxuICApXG59XG5cbm1vZHVsZS5leHBvcnRzID0gbm9ybWFsaXplSWRlbnRpZmllclxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZyb21DaGFyQ29kZVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgZnJvbUNoYXJDb2RlID0gcmVxdWlyZSgnLi4vY29uc3RhbnQvZnJvbS1jaGFyLWNvZGUuanMnKVxuXG5mdW5jdGlvbiBzYWZlRnJvbUludCh2YWx1ZSwgYmFzZSkge1xuICB2YXIgY29kZSA9IHBhcnNlSW50KHZhbHVlLCBiYXNlKVxuXG4gIGlmIChcbiAgICAvLyBDMCBleGNlcHQgZm9yIEhULCBMRiwgRkYsIENSLCBzcGFjZVxuICAgIGNvZGUgPCA5IHx8XG4gICAgY29kZSA9PT0gMTEgfHxcbiAgICAoY29kZSA+IDEzICYmIGNvZGUgPCAzMikgfHwgLy8gQ29udHJvbCBjaGFyYWN0ZXIgKERFTCkgb2YgdGhlIGJhc2ljIGJsb2NrIGFuZCBDMSBjb250cm9scy5cbiAgICAoY29kZSA+IDEyNiAmJiBjb2RlIDwgMTYwKSB8fCAvLyBMb25lIGhpZ2ggc3Vycm9nYXRlcyBhbmQgbG93IHN1cnJvZ2F0ZXMuXG4gICAgKGNvZGUgPiA1NTI5NSAmJiBjb2RlIDwgNTczNDQpIHx8IC8vIE5vbmNoYXJhY3RlcnMuXG4gICAgKGNvZGUgPiA2NDk3NSAmJiBjb2RlIDwgNjUwMDgpIHx8XG4gICAgKGNvZGUgJiA2NTUzNSkgPT09IDY1NTM1IHx8XG4gICAgKGNvZGUgJiA2NTUzNSkgPT09IDY1NTM0IHx8IC8vIE91dCBvZiByYW5nZVxuICAgIGNvZGUgPiAxMTE0MTExXG4gICkge1xuICAgIHJldHVybiAnXFx1RkZGRCdcbiAgfVxuXG4gIHJldHVybiBmcm9tQ2hhckNvZGUoY29kZSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzYWZlRnJvbUludFxuIiwgIid1c2Ugc3RyaWN0J1xuXG5mdW5jdGlvbiBtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkge1xuICByZXR1cm4gY29kZSA8IC0yXG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFya2Rvd25MaW5lRW5kaW5nXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbmZ1bmN0aW9uIG1hcmtkb3duU3BhY2UoY29kZSkge1xuICByZXR1cm4gY29kZSA9PT0gLTIgfHwgY29kZSA9PT0gLTEgfHwgY29kZSA9PT0gMzJcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXJrZG93blNwYWNlXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBtYXJrZG93blNwYWNlID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLXNwYWNlLmpzJylcblxuZnVuY3Rpb24gc3BhY2VGYWN0b3J5KGVmZmVjdHMsIG9rLCB0eXBlLCBtYXgpIHtcbiAgdmFyIGxpbWl0ID0gbWF4ID8gbWF4IC0gMSA6IEluZmluaXR5XG4gIHZhciBzaXplID0gMFxuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIodHlwZSlcbiAgICAgIHJldHVybiBwcmVmaXgoY29kZSlcbiAgICB9XG5cbiAgICByZXR1cm4gb2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHByZWZpeChjb2RlKSB7XG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkgJiYgc2l6ZSsrIDwgbGltaXQpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHByZWZpeFxuICAgIH1cblxuICAgIGVmZmVjdHMuZXhpdCh0eXBlKVxuICAgIHJldHVybiBvayhjb2RlKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3BhY2VGYWN0b3J5XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHt2YWx1ZTogdHJ1ZX0pXG5cbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcuanMnKVxudmFyIGZhY3RvcnlTcGFjZSA9IHJlcXVpcmUoJy4uL3Rva2VuaXplL2ZhY3Rvcnktc3BhY2UuanMnKVxuXG52YXIgdG9rZW5pemUgPSBpbml0aWFsaXplQ29udGVudFxuXG5mdW5jdGlvbiBpbml0aWFsaXplQ29udGVudChlZmZlY3RzKSB7XG4gIHZhciBjb250ZW50U3RhcnQgPSBlZmZlY3RzLmF0dGVtcHQoXG4gICAgdGhpcy5wYXJzZXIuY29uc3RydWN0cy5jb250ZW50SW5pdGlhbCxcbiAgICBhZnRlckNvbnRlbnRTdGFydENvbnN0cnVjdCxcbiAgICBwYXJhZ3JhcGhJbml0aWFsXG4gIClcbiAgdmFyIHByZXZpb3VzXG4gIHJldHVybiBjb250ZW50U3RhcnRcblxuICBmdW5jdGlvbiBhZnRlckNvbnRlbnRTdGFydENvbnN0cnVjdChjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG51bGwpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcignbGluZUVuZGluZycpXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgZWZmZWN0cy5leGl0KCdsaW5lRW5kaW5nJylcbiAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGNvbnRlbnRTdGFydCwgJ2xpbmVQcmVmaXgnKVxuICB9XG5cbiAgZnVuY3Rpb24gcGFyYWdyYXBoSW5pdGlhbChjb2RlKSB7XG4gICAgZWZmZWN0cy5lbnRlcigncGFyYWdyYXBoJylcbiAgICByZXR1cm4gbGluZVN0YXJ0KGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBsaW5lU3RhcnQoY29kZSkge1xuICAgIHZhciB0b2tlbiA9IGVmZmVjdHMuZW50ZXIoJ2NodW5rVGV4dCcsIHtcbiAgICAgIGNvbnRlbnRUeXBlOiAndGV4dCcsXG4gICAgICBwcmV2aW91czogcHJldmlvdXNcbiAgICB9KVxuXG4gICAgaWYgKHByZXZpb3VzKSB7XG4gICAgICBwcmV2aW91cy5uZXh0ID0gdG9rZW5cbiAgICB9XG5cbiAgICBwcmV2aW91cyA9IHRva2VuXG4gICAgcmV0dXJuIGRhdGEoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGRhdGEoY29kZSkge1xuICAgIGlmIChjb2RlID09PSBudWxsKSB7XG4gICAgICBlZmZlY3RzLmV4aXQoJ2NodW5rVGV4dCcpXG4gICAgICBlZmZlY3RzLmV4aXQoJ3BhcmFncmFwaCcpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgZWZmZWN0cy5leGl0KCdjaHVua1RleHQnKVxuICAgICAgcmV0dXJuIGxpbmVTdGFydFxuICAgIH0gLy8gRGF0YS5cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBkYXRhXG4gIH1cbn1cblxuZXhwb3J0cy50b2tlbml6ZSA9IHRva2VuaXplXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcuanMnKVxudmFyIGZhY3RvcnlTcGFjZSA9IHJlcXVpcmUoJy4vZmFjdG9yeS1zcGFjZS5qcycpXG5cbnZhciBwYXJ0aWFsQmxhbmtMaW5lID0ge1xuICB0b2tlbml6ZTogdG9rZW5pemVQYXJ0aWFsQmxhbmtMaW5lLFxuICBwYXJ0aWFsOiB0cnVlXG59XG5cbmZ1bmN0aW9uIHRva2VuaXplUGFydGlhbEJsYW5rTGluZShlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXJXaGl0ZXNwYWNlLCAnbGluZVByZWZpeCcpXG5cbiAgZnVuY3Rpb24gYWZ0ZXJXaGl0ZXNwYWNlKGNvZGUpIHtcbiAgICByZXR1cm4gY29kZSA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkgPyBvayhjb2RlKSA6IG5vayhjb2RlKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGFydGlhbEJsYW5rTGluZVxuIiwgIid1c2Ugc3RyaWN0J1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7dmFsdWU6IHRydWV9KVxuXG52YXIgbWFya2Rvd25MaW5lRW5kaW5nID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLmpzJylcbnZhciBmYWN0b3J5U3BhY2UgPSByZXF1aXJlKCcuLi90b2tlbml6ZS9mYWN0b3J5LXNwYWNlLmpzJylcbnZhciBwYXJ0aWFsQmxhbmtMaW5lID0gcmVxdWlyZSgnLi4vdG9rZW5pemUvcGFydGlhbC1ibGFuay1saW5lLmpzJylcblxudmFyIHRva2VuaXplID0gaW5pdGlhbGl6ZURvY3VtZW50XG52YXIgY29udGFpbmVyQ29uc3RydWN0ID0ge1xuICB0b2tlbml6ZTogdG9rZW5pemVDb250YWluZXJcbn1cbnZhciBsYXp5Rmxvd0NvbnN0cnVjdCA9IHtcbiAgdG9rZW5pemU6IHRva2VuaXplTGF6eUZsb3dcbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZURvY3VtZW50KGVmZmVjdHMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciBzdGFjayA9IFtdXG4gIHZhciBjb250aW51ZWQgPSAwXG4gIHZhciBpbnNwZWN0Q29uc3RydWN0ID0ge1xuICAgIHRva2VuaXplOiB0b2tlbml6ZUluc3BlY3QsXG4gICAgcGFydGlhbDogdHJ1ZVxuICB9XG4gIHZhciBpbnNwZWN0UmVzdWx0XG4gIHZhciBjaGlsZEZsb3dcbiAgdmFyIGNoaWxkVG9rZW5cbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIGlmIChjb250aW51ZWQgPCBzdGFjay5sZW5ndGgpIHtcbiAgICAgIHNlbGYuY29udGFpbmVyU3RhdGUgPSBzdGFja1tjb250aW51ZWRdWzFdXG4gICAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KFxuICAgICAgICBzdGFja1tjb250aW51ZWRdWzBdLmNvbnRpbnVhdGlvbixcbiAgICAgICAgZG9jdW1lbnRDb250aW51ZSxcbiAgICAgICAgZG9jdW1lbnRDb250aW51ZWRcbiAgICAgICkoY29kZSlcbiAgICB9XG5cbiAgICByZXR1cm4gZG9jdW1lbnRDb250aW51ZWQoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGRvY3VtZW50Q29udGludWUoY29kZSkge1xuICAgIGNvbnRpbnVlZCsrXG4gICAgcmV0dXJuIHN0YXJ0KGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBkb2N1bWVudENvbnRpbnVlZChjb2RlKSB7XG4gICAgLy8gSWYgd2VcdTIwMTlyZSBpbiBhIGNvbmNyZXRlIGNvbnN0cnVjdCAoc3VjaCBhcyB3aGVuIGV4cGVjdGluZyBhbm90aGVyIGxpbmUgb2ZcbiAgICAvLyBIVE1MLCBvciB3ZSByZXN1bHRlZCBpbiBsYXp5IGNvbnRlbnQpLCB3ZSBjYW4gaW1tZWRpYXRlbHkgc3RhcnQgZmxvdy5cbiAgICBpZiAoaW5zcGVjdFJlc3VsdCAmJiBpbnNwZWN0UmVzdWx0LmZsb3dDb250aW51ZSkge1xuICAgICAgcmV0dXJuIGZsb3dTdGFydChjb2RlKVxuICAgIH1cblxuICAgIHNlbGYuaW50ZXJydXB0ID1cbiAgICAgIGNoaWxkRmxvdyAmJlxuICAgICAgY2hpbGRGbG93LmN1cnJlbnRDb25zdHJ1Y3QgJiZcbiAgICAgIGNoaWxkRmxvdy5jdXJyZW50Q29uc3RydWN0LmludGVycnVwdGlibGVcbiAgICBzZWxmLmNvbnRhaW5lclN0YXRlID0ge31cbiAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KFxuICAgICAgY29udGFpbmVyQ29uc3RydWN0LFxuICAgICAgY29udGFpbmVyQ29udGludWUsXG4gICAgICBmbG93U3RhcnRcbiAgICApKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjb250YWluZXJDb250aW51ZShjb2RlKSB7XG4gICAgc3RhY2sucHVzaChbc2VsZi5jdXJyZW50Q29uc3RydWN0LCBzZWxmLmNvbnRhaW5lclN0YXRlXSlcbiAgICBzZWxmLmNvbnRhaW5lclN0YXRlID0gdW5kZWZpbmVkXG4gICAgcmV0dXJuIGRvY3VtZW50Q29udGludWVkKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBmbG93U3RhcnQoY29kZSkge1xuICAgIGlmIChjb2RlID09PSBudWxsKSB7XG4gICAgICBleGl0Q29udGFpbmVycygwLCB0cnVlKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjaGlsZEZsb3cgPSBjaGlsZEZsb3cgfHwgc2VsZi5wYXJzZXIuZmxvdyhzZWxmLm5vdygpKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2NodW5rRmxvdycsIHtcbiAgICAgIGNvbnRlbnRUeXBlOiAnZmxvdycsXG4gICAgICBwcmV2aW91czogY2hpbGRUb2tlbixcbiAgICAgIF90b2tlbml6ZXI6IGNoaWxkRmxvd1xuICAgIH0pXG4gICAgcmV0dXJuIGZsb3dDb250aW51ZShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZmxvd0NvbnRpbnVlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbnVsbCkge1xuICAgICAgY29udGludWVGbG93KGVmZmVjdHMuZXhpdCgnY2h1bmtGbG93JykpXG4gICAgICByZXR1cm4gZmxvd1N0YXJ0KGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBjb250aW51ZUZsb3coZWZmZWN0cy5leGl0KCdjaHVua0Zsb3cnKSlcbiAgICAgIHJldHVybiBlZmZlY3RzLmNoZWNrKGluc3BlY3RDb25zdHJ1Y3QsIGRvY3VtZW50QWZ0ZXJQZWVrKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBmbG93Q29udGludWVcbiAgfVxuXG4gIGZ1bmN0aW9uIGRvY3VtZW50QWZ0ZXJQZWVrKGNvZGUpIHtcbiAgICBleGl0Q29udGFpbmVycyhcbiAgICAgIGluc3BlY3RSZXN1bHQuY29udGludWVkLFxuICAgICAgaW5zcGVjdFJlc3VsdCAmJiBpbnNwZWN0UmVzdWx0LmZsb3dFbmRcbiAgICApXG4gICAgY29udGludWVkID0gMFxuICAgIHJldHVybiBzdGFydChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29udGludWVGbG93KHRva2VuKSB7XG4gICAgaWYgKGNoaWxkVG9rZW4pIGNoaWxkVG9rZW4ubmV4dCA9IHRva2VuXG4gICAgY2hpbGRUb2tlbiA9IHRva2VuXG4gICAgY2hpbGRGbG93LmxhenkgPSBpbnNwZWN0UmVzdWx0ICYmIGluc3BlY3RSZXN1bHQubGF6eVxuICAgIGNoaWxkRmxvdy5kZWZpbmVTa2lwKHRva2VuLnN0YXJ0KVxuICAgIGNoaWxkRmxvdy53cml0ZShzZWxmLnNsaWNlU3RyZWFtKHRva2VuKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4aXRDb250YWluZXJzKHNpemUsIGVuZCkge1xuICAgIHZhciBpbmRleCA9IHN0YWNrLmxlbmd0aCAvLyBDbG9zZSB0aGUgZmxvdy5cblxuICAgIGlmIChjaGlsZEZsb3cgJiYgZW5kKSB7XG4gICAgICBjaGlsZEZsb3cud3JpdGUoW251bGxdKVxuICAgICAgY2hpbGRUb2tlbiA9IGNoaWxkRmxvdyA9IHVuZGVmaW5lZFxuICAgIH0gLy8gRXhpdCBvcGVuIGNvbnRhaW5lcnMuXG5cbiAgICB3aGlsZSAoaW5kZXgtLSA+IHNpemUpIHtcbiAgICAgIHNlbGYuY29udGFpbmVyU3RhdGUgPSBzdGFja1tpbmRleF1bMV1cbiAgICAgIHN0YWNrW2luZGV4XVswXS5leGl0LmNhbGwoc2VsZiwgZWZmZWN0cylcbiAgICB9XG5cbiAgICBzdGFjay5sZW5ndGggPSBzaXplXG4gIH1cblxuICBmdW5jdGlvbiB0b2tlbml6ZUluc3BlY3QoZWZmZWN0cywgb2spIHtcbiAgICB2YXIgc3ViY29udGludWVkID0gMFxuICAgIGluc3BlY3RSZXN1bHQgPSB7fVxuICAgIHJldHVybiBpbnNwZWN0U3RhcnRcblxuICAgIGZ1bmN0aW9uIGluc3BlY3RTdGFydChjb2RlKSB7XG4gICAgICBpZiAoc3ViY29udGludWVkIDwgc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIHNlbGYuY29udGFpbmVyU3RhdGUgPSBzdGFja1tzdWJjb250aW51ZWRdWzFdXG4gICAgICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoXG4gICAgICAgICAgc3RhY2tbc3ViY29udGludWVkXVswXS5jb250aW51YXRpb24sXG4gICAgICAgICAgaW5zcGVjdENvbnRpbnVlLFxuICAgICAgICAgIGluc3BlY3RMZXNzXG4gICAgICAgICkoY29kZSlcbiAgICAgIH0gLy8gSWYgd2VcdTIwMTlyZSBjb250aW51ZWQgYnV0IGluIGEgY29uY3JldGUgZmxvdywgd2UgY2FuXHUyMDE5dCBoYXZlIG1vcmVcbiAgICAgIC8vIGNvbnRhaW5lcnMuXG5cbiAgICAgIGlmIChjaGlsZEZsb3cuY3VycmVudENvbnN0cnVjdCAmJiBjaGlsZEZsb3cuY3VycmVudENvbnN0cnVjdC5jb25jcmV0ZSkge1xuICAgICAgICBpbnNwZWN0UmVzdWx0LmZsb3dDb250aW51ZSA9IHRydWVcbiAgICAgICAgcmV0dXJuIGluc3BlY3REb25lKGNvZGUpXG4gICAgICB9XG5cbiAgICAgIHNlbGYuaW50ZXJydXB0ID1cbiAgICAgICAgY2hpbGRGbG93LmN1cnJlbnRDb25zdHJ1Y3QgJiYgY2hpbGRGbG93LmN1cnJlbnRDb25zdHJ1Y3QuaW50ZXJydXB0aWJsZVxuICAgICAgc2VsZi5jb250YWluZXJTdGF0ZSA9IHt9XG4gICAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KFxuICAgICAgICBjb250YWluZXJDb25zdHJ1Y3QsXG4gICAgICAgIGluc3BlY3RGbG93RW5kLFxuICAgICAgICBpbnNwZWN0RG9uZVxuICAgICAgKShjb2RlKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3BlY3RDb250aW51ZShjb2RlKSB7XG4gICAgICBzdWJjb250aW51ZWQrK1xuICAgICAgcmV0dXJuIHNlbGYuY29udGFpbmVyU3RhdGUuX2Nsb3NlRmxvd1xuICAgICAgICA/IGluc3BlY3RGbG93RW5kKGNvZGUpXG4gICAgICAgIDogaW5zcGVjdFN0YXJ0KGNvZGUpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zcGVjdExlc3MoY29kZSkge1xuICAgICAgaWYgKGNoaWxkRmxvdy5jdXJyZW50Q29uc3RydWN0ICYmIGNoaWxkRmxvdy5jdXJyZW50Q29uc3RydWN0LmxhenkpIHtcbiAgICAgICAgLy8gTWF5YmUgYW5vdGhlciBjb250YWluZXI/XG4gICAgICAgIHNlbGYuY29udGFpbmVyU3RhdGUgPSB7fVxuICAgICAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KFxuICAgICAgICAgIGNvbnRhaW5lckNvbnN0cnVjdCxcbiAgICAgICAgICBpbnNwZWN0Rmxvd0VuZCwgLy8gTWF5YmUgZmxvdywgb3IgYSBibGFuayBsaW5lP1xuICAgICAgICAgIGVmZmVjdHMuYXR0ZW1wdChcbiAgICAgICAgICAgIGxhenlGbG93Q29uc3RydWN0LFxuICAgICAgICAgICAgaW5zcGVjdEZsb3dFbmQsXG4gICAgICAgICAgICBlZmZlY3RzLmNoZWNrKHBhcnRpYWxCbGFua0xpbmUsIGluc3BlY3RGbG93RW5kLCBpbnNwZWN0TGF6eSlcbiAgICAgICAgICApXG4gICAgICAgICkoY29kZSlcbiAgICAgIH0gLy8gT3RoZXJ3aXNlIHdlXHUyMDE5cmUgaW50ZXJydXB0aW5nLlxuXG4gICAgICByZXR1cm4gaW5zcGVjdEZsb3dFbmQoY29kZSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnNwZWN0TGF6eShjb2RlKSB7XG4gICAgICAvLyBBY3QgYXMgaWYgYWxsIGNvbnRhaW5lcnMgYXJlIGNvbnRpbnVlZC5cbiAgICAgIHN1YmNvbnRpbnVlZCA9IHN0YWNrLmxlbmd0aFxuICAgICAgaW5zcGVjdFJlc3VsdC5sYXp5ID0gdHJ1ZVxuICAgICAgaW5zcGVjdFJlc3VsdC5mbG93Q29udGludWUgPSB0cnVlXG4gICAgICByZXR1cm4gaW5zcGVjdERvbmUoY29kZSlcbiAgICB9IC8vIFdlXHUyMDE5cmUgZG9uZSB3aXRoIGZsb3cgaWYgd2UgaGF2ZSBtb3JlIGNvbnRhaW5lcnMsIG9yIGFuIGludGVycnVwdGlvbi5cblxuICAgIGZ1bmN0aW9uIGluc3BlY3RGbG93RW5kKGNvZGUpIHtcbiAgICAgIGluc3BlY3RSZXN1bHQuZmxvd0VuZCA9IHRydWVcbiAgICAgIHJldHVybiBpbnNwZWN0RG9uZShjb2RlKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3BlY3REb25lKGNvZGUpIHtcbiAgICAgIGluc3BlY3RSZXN1bHQuY29udGludWVkID0gc3ViY29udGludWVkXG4gICAgICBzZWxmLmludGVycnVwdCA9IHNlbGYuY29udGFpbmVyU3RhdGUgPSB1bmRlZmluZWRcbiAgICAgIHJldHVybiBvayhjb2RlKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUNvbnRhaW5lcihlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHJldHVybiBmYWN0b3J5U3BhY2UoXG4gICAgZWZmZWN0cyxcbiAgICBlZmZlY3RzLmF0dGVtcHQodGhpcy5wYXJzZXIuY29uc3RydWN0cy5kb2N1bWVudCwgb2ssIG5vayksXG4gICAgJ2xpbmVQcmVmaXgnLFxuICAgIHRoaXMucGFyc2VyLmNvbnN0cnVjdHMuZGlzYWJsZS5udWxsLmluZGV4T2YoJ2NvZGVJbmRlbnRlZCcpID4gLTFcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IDRcbiAgKVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUxhenlGbG93KGVmZmVjdHMsIG9rLCBub2spIHtcbiAgcmV0dXJuIGZhY3RvcnlTcGFjZShcbiAgICBlZmZlY3RzLFxuICAgIGVmZmVjdHMubGF6eSh0aGlzLnBhcnNlci5jb25zdHJ1Y3RzLmZsb3csIG9rLCBub2spLFxuICAgICdsaW5lUHJlZml4JyxcbiAgICB0aGlzLnBhcnNlci5jb25zdHJ1Y3RzLmRpc2FibGUubnVsbC5pbmRleE9mKCdjb2RlSW5kZW50ZWQnKSA+IC0xXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiA0XG4gIClcbn1cblxuZXhwb3J0cy50b2tlbml6ZSA9IHRva2VuaXplXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbi8vIENvdW50cyB0YWJzIGJhc2VkIG9uIHRoZWlyIGV4cGFuZGVkIHNpemUsIGFuZCBDUitMRiBhcyBvbmUgY2hhcmFjdGVyLlxuXG5mdW5jdGlvbiBzaXplQ2h1bmtzKGNodW5rcykge1xuICB2YXIgaW5kZXggPSAtMVxuICB2YXIgc2l6ZSA9IDBcblxuICB3aGlsZSAoKytpbmRleCA8IGNodW5rcy5sZW5ndGgpIHtcbiAgICBzaXplICs9IHR5cGVvZiBjaHVua3NbaW5kZXhdID09PSAnc3RyaW5nJyA/IGNodW5rc1tpbmRleF0ubGVuZ3RoIDogMVxuICB9XG5cbiAgcmV0dXJuIHNpemVcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaXplQ2h1bmtzXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBzaXplQ2h1bmtzID0gcmVxdWlyZSgnLi9zaXplLWNodW5rcy5qcycpXG5cbmZ1bmN0aW9uIHByZWZpeFNpemUoZXZlbnRzLCB0eXBlKSB7XG4gIHZhciB0YWlsID0gZXZlbnRzW2V2ZW50cy5sZW5ndGggLSAxXVxuICBpZiAoIXRhaWwgfHwgdGFpbFsxXS50eXBlICE9PSB0eXBlKSByZXR1cm4gMFxuICByZXR1cm4gc2l6ZUNodW5rcyh0YWlsWzJdLnNsaWNlU3RyZWFtKHRhaWxbMV0pKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHByZWZpeFNpemVcbiIsICIndXNlIHN0cmljdCdcblxudmFyIHNwbGljZSA9IFtdLnNwbGljZVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNwbGljZVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgc3BsaWNlID0gcmVxdWlyZSgnLi4vY29uc3RhbnQvc3BsaWNlLmpzJylcblxuLy8gY2F1c2VzIGEgc3RhY2sgb3ZlcmZsb3cgaW4gVjggd2hlbiB0cnlpbmcgdG8gaW5zZXJ0IDEwMGsgaXRlbXMgZm9yIGluc3RhbmNlLlxuXG5mdW5jdGlvbiBjaHVua2VkU3BsaWNlKGxpc3QsIHN0YXJ0LCByZW1vdmUsIGl0ZW1zKSB7XG4gIHZhciBlbmQgPSBsaXN0Lmxlbmd0aFxuICB2YXIgY2h1bmtTdGFydCA9IDBcbiAgdmFyIHBhcmFtZXRlcnMgLy8gTWFrZSBzdGFydCBiZXR3ZWVuIHplcm8gYW5kIGBlbmRgIChpbmNsdWRlZCkuXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gLXN0YXJ0ID4gZW5kID8gMCA6IGVuZCArIHN0YXJ0XG4gIH0gZWxzZSB7XG4gICAgc3RhcnQgPSBzdGFydCA+IGVuZCA/IGVuZCA6IHN0YXJ0XG4gIH1cblxuICByZW1vdmUgPSByZW1vdmUgPiAwID8gcmVtb3ZlIDogMCAvLyBObyBuZWVkIHRvIGNodW5rIHRoZSBpdGVtcyBpZiB0aGVyZVx1MjAxOXMgb25seSBhIGNvdXBsZSAoMTBrKSBpdGVtcy5cblxuICBpZiAoaXRlbXMubGVuZ3RoIDwgMTAwMDApIHtcbiAgICBwYXJhbWV0ZXJzID0gQXJyYXkuZnJvbShpdGVtcylcbiAgICBwYXJhbWV0ZXJzLnVuc2hpZnQoc3RhcnQsIHJlbW92ZSlcbiAgICBzcGxpY2UuYXBwbHkobGlzdCwgcGFyYW1ldGVycylcbiAgfSBlbHNlIHtcbiAgICAvLyBEZWxldGUgYHJlbW92ZWAgaXRlbXMgc3RhcnRpbmcgZnJvbSBgc3RhcnRgXG4gICAgaWYgKHJlbW92ZSkgc3BsaWNlLmFwcGx5KGxpc3QsIFtzdGFydCwgcmVtb3ZlXSkgLy8gSW5zZXJ0IHRoZSBpdGVtcyBpbiBjaHVua3MgdG8gbm90IGNhdXNlIHN0YWNrIG92ZXJmbG93cy5cblxuICAgIHdoaWxlIChjaHVua1N0YXJ0IDwgaXRlbXMubGVuZ3RoKSB7XG4gICAgICBwYXJhbWV0ZXJzID0gaXRlbXMuc2xpY2UoY2h1bmtTdGFydCwgY2h1bmtTdGFydCArIDEwMDAwKVxuICAgICAgcGFyYW1ldGVycy51bnNoaWZ0KHN0YXJ0LCAwKVxuICAgICAgc3BsaWNlLmFwcGx5KGxpc3QsIHBhcmFtZXRlcnMpXG4gICAgICBjaHVua1N0YXJ0ICs9IDEwMDAwXG4gICAgICBzdGFydCArPSAxMDAwMFxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNodW5rZWRTcGxpY2VcbiIsICIndXNlIHN0cmljdCdcblxudmFyIGFzc2lnbiA9IHJlcXVpcmUoJy4uL2NvbnN0YW50L2Fzc2lnbi5qcycpXG5cbmZ1bmN0aW9uIHNoYWxsb3cob2JqZWN0KSB7XG4gIHJldHVybiBhc3NpZ24oe30sIG9iamVjdClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaGFsbG93XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuLi9jb25zdGFudC9hc3NpZ24uanMnKVxudmFyIGNodW5rZWRTcGxpY2UgPSByZXF1aXJlKCcuL2NodW5rZWQtc3BsaWNlLmpzJylcbnZhciBzaGFsbG93ID0gcmVxdWlyZSgnLi9zaGFsbG93LmpzJylcblxuZnVuY3Rpb24gc3VidG9rZW5pemUoZXZlbnRzKSB7XG4gIHZhciBqdW1wcyA9IHt9XG4gIHZhciBpbmRleCA9IC0xXG4gIHZhciBldmVudFxuICB2YXIgbGluZUluZGV4XG4gIHZhciBvdGhlckluZGV4XG4gIHZhciBvdGhlckV2ZW50XG4gIHZhciBwYXJhbWV0ZXJzXG4gIHZhciBzdWJldmVudHNcbiAgdmFyIG1vcmVcblxuICB3aGlsZSAoKytpbmRleCA8IGV2ZW50cy5sZW5ndGgpIHtcbiAgICB3aGlsZSAoaW5kZXggaW4ganVtcHMpIHtcbiAgICAgIGluZGV4ID0ganVtcHNbaW5kZXhdXG4gICAgfVxuXG4gICAgZXZlbnQgPSBldmVudHNbaW5kZXhdIC8vIEFkZCBhIGhvb2sgZm9yIHRoZSBHRk0gdGFza2xpc3QgZXh0ZW5zaW9uLCB3aGljaCBuZWVkcyB0byBrbm93IGlmIHRleHRcbiAgICAvLyBpcyBpbiB0aGUgZmlyc3QgY29udGVudCBvZiBhIGxpc3QgaXRlbS5cblxuICAgIGlmIChcbiAgICAgIGluZGV4ICYmXG4gICAgICBldmVudFsxXS50eXBlID09PSAnY2h1bmtGbG93JyAmJlxuICAgICAgZXZlbnRzW2luZGV4IC0gMV1bMV0udHlwZSA9PT0gJ2xpc3RJdGVtUHJlZml4J1xuICAgICkge1xuICAgICAgc3ViZXZlbnRzID0gZXZlbnRbMV0uX3Rva2VuaXplci5ldmVudHNcbiAgICAgIG90aGVySW5kZXggPSAwXG5cbiAgICAgIGlmIChcbiAgICAgICAgb3RoZXJJbmRleCA8IHN1YmV2ZW50cy5sZW5ndGggJiZcbiAgICAgICAgc3ViZXZlbnRzW290aGVySW5kZXhdWzFdLnR5cGUgPT09ICdsaW5lRW5kaW5nQmxhbmsnXG4gICAgICApIHtcbiAgICAgICAgb3RoZXJJbmRleCArPSAyXG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgb3RoZXJJbmRleCA8IHN1YmV2ZW50cy5sZW5ndGggJiZcbiAgICAgICAgc3ViZXZlbnRzW290aGVySW5kZXhdWzFdLnR5cGUgPT09ICdjb250ZW50J1xuICAgICAgKSB7XG4gICAgICAgIHdoaWxlICgrK290aGVySW5kZXggPCBzdWJldmVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKHN1YmV2ZW50c1tvdGhlckluZGV4XVsxXS50eXBlID09PSAnY29udGVudCcpIHtcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHN1YmV2ZW50c1tvdGhlckluZGV4XVsxXS50eXBlID09PSAnY2h1bmtUZXh0Jykge1xuICAgICAgICAgICAgc3ViZXZlbnRzW290aGVySW5kZXhdWzFdLmlzSW5GaXJzdENvbnRlbnRPZkxpc3RJdGVtID0gdHJ1ZVxuICAgICAgICAgICAgb3RoZXJJbmRleCsrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBFbnRlci5cblxuICAgIGlmIChldmVudFswXSA9PT0gJ2VudGVyJykge1xuICAgICAgaWYgKGV2ZW50WzFdLmNvbnRlbnRUeXBlKSB7XG4gICAgICAgIGFzc2lnbihqdW1wcywgc3ViY29udGVudChldmVudHMsIGluZGV4KSlcbiAgICAgICAgaW5kZXggPSBqdW1wc1tpbmRleF1cbiAgICAgICAgbW9yZSA9IHRydWVcbiAgICAgIH1cbiAgICB9IC8vIEV4aXQuXG4gICAgZWxzZSBpZiAoZXZlbnRbMV0uX2NvbnRhaW5lciB8fCBldmVudFsxXS5fbW92ZVByZXZpb3VzTGluZUVuZGluZ3MpIHtcbiAgICAgIG90aGVySW5kZXggPSBpbmRleFxuICAgICAgbGluZUluZGV4ID0gdW5kZWZpbmVkXG5cbiAgICAgIHdoaWxlIChvdGhlckluZGV4LS0pIHtcbiAgICAgICAgb3RoZXJFdmVudCA9IGV2ZW50c1tvdGhlckluZGV4XVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBvdGhlckV2ZW50WzFdLnR5cGUgPT09ICdsaW5lRW5kaW5nJyB8fFxuICAgICAgICAgIG90aGVyRXZlbnRbMV0udHlwZSA9PT0gJ2xpbmVFbmRpbmdCbGFuaydcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKG90aGVyRXZlbnRbMF0gPT09ICdlbnRlcicpIHtcbiAgICAgICAgICAgIGlmIChsaW5lSW5kZXgpIHtcbiAgICAgICAgICAgICAgZXZlbnRzW2xpbmVJbmRleF1bMV0udHlwZSA9ICdsaW5lRW5kaW5nQmxhbmsnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG90aGVyRXZlbnRbMV0udHlwZSA9ICdsaW5lRW5kaW5nJ1xuICAgICAgICAgICAgbGluZUluZGV4ID0gb3RoZXJJbmRleFxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChsaW5lSW5kZXgpIHtcbiAgICAgICAgLy8gRml4IHBvc2l0aW9uLlxuICAgICAgICBldmVudFsxXS5lbmQgPSBzaGFsbG93KGV2ZW50c1tsaW5lSW5kZXhdWzFdLnN0YXJ0KSAvLyBTd2l0Y2ggY29udGFpbmVyIGV4aXQgdy8gbGluZSBlbmRpbmdzLlxuXG4gICAgICAgIHBhcmFtZXRlcnMgPSBldmVudHMuc2xpY2UobGluZUluZGV4LCBpbmRleClcbiAgICAgICAgcGFyYW1ldGVycy51bnNoaWZ0KGV2ZW50KVxuICAgICAgICBjaHVua2VkU3BsaWNlKGV2ZW50cywgbGluZUluZGV4LCBpbmRleCAtIGxpbmVJbmRleCArIDEsIHBhcmFtZXRlcnMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICFtb3JlXG59XG5cbmZ1bmN0aW9uIHN1YmNvbnRlbnQoZXZlbnRzLCBldmVudEluZGV4KSB7XG4gIHZhciB0b2tlbiA9IGV2ZW50c1tldmVudEluZGV4XVsxXVxuICB2YXIgY29udGV4dCA9IGV2ZW50c1tldmVudEluZGV4XVsyXVxuICB2YXIgc3RhcnRQb3NpdGlvbiA9IGV2ZW50SW5kZXggLSAxXG4gIHZhciBzdGFydFBvc2l0aW9ucyA9IFtdXG4gIHZhciB0b2tlbml6ZXIgPVxuICAgIHRva2VuLl90b2tlbml6ZXIgfHwgY29udGV4dC5wYXJzZXJbdG9rZW4uY29udGVudFR5cGVdKHRva2VuLnN0YXJ0KVxuICB2YXIgY2hpbGRFdmVudHMgPSB0b2tlbml6ZXIuZXZlbnRzXG4gIHZhciBqdW1wcyA9IFtdXG4gIHZhciBnYXBzID0ge31cbiAgdmFyIHN0cmVhbVxuICB2YXIgcHJldmlvdXNcbiAgdmFyIGluZGV4XG4gIHZhciBlbnRlcmVkXG4gIHZhciBlbmRcbiAgdmFyIGFkanVzdCAvLyBMb29wIGZvcndhcmQgdGhyb3VnaCB0aGUgbGlua2VkIHRva2VucyB0byBwYXNzIHRoZW0gaW4gb3JkZXIgdG8gdGhlXG4gIC8vIHN1YnRva2VuaXplci5cblxuICB3aGlsZSAodG9rZW4pIHtcbiAgICAvLyBGaW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUgZXZlbnQgZm9yIHRoaXMgdG9rZW4uXG4gICAgd2hpbGUgKGV2ZW50c1srK3N0YXJ0UG9zaXRpb25dWzFdICE9PSB0b2tlbikge1xuICAgICAgLy8gRW1wdHkuXG4gICAgfVxuXG4gICAgc3RhcnRQb3NpdGlvbnMucHVzaChzdGFydFBvc2l0aW9uKVxuXG4gICAgaWYgKCF0b2tlbi5fdG9rZW5pemVyKSB7XG4gICAgICBzdHJlYW0gPSBjb250ZXh0LnNsaWNlU3RyZWFtKHRva2VuKVxuXG4gICAgICBpZiAoIXRva2VuLm5leHQpIHtcbiAgICAgICAgc3RyZWFtLnB1c2gobnVsbClcbiAgICAgIH1cblxuICAgICAgaWYgKHByZXZpb3VzKSB7XG4gICAgICAgIHRva2VuaXplci5kZWZpbmVTa2lwKHRva2VuLnN0YXJ0KVxuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW4uaXNJbkZpcnN0Q29udGVudE9mTGlzdEl0ZW0pIHtcbiAgICAgICAgdG9rZW5pemVyLl9nZm1UYXNrbGlzdEZpcnN0Q29udGVudE9mTGlzdEl0ZW0gPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIHRva2VuaXplci53cml0ZShzdHJlYW0pXG5cbiAgICAgIGlmICh0b2tlbi5pc0luRmlyc3RDb250ZW50T2ZMaXN0SXRlbSkge1xuICAgICAgICB0b2tlbml6ZXIuX2dmbVRhc2tsaXN0Rmlyc3RDb250ZW50T2ZMaXN0SXRlbSA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0gLy8gVW5yYXZlbCB0aGUgbmV4dCB0b2tlbi5cblxuICAgIHByZXZpb3VzID0gdG9rZW5cbiAgICB0b2tlbiA9IHRva2VuLm5leHRcbiAgfSAvLyBOb3csIGxvb3AgYmFjayB0aHJvdWdoIGFsbCBldmVudHMgKGFuZCBsaW5rZWQgdG9rZW5zKSwgdG8gZmlndXJlIG91dCB3aGljaFxuICAvLyBwYXJ0cyBiZWxvbmcgd2hlcmUuXG5cbiAgdG9rZW4gPSBwcmV2aW91c1xuICBpbmRleCA9IGNoaWxkRXZlbnRzLmxlbmd0aFxuXG4gIHdoaWxlIChpbmRleC0tKSB7XG4gICAgLy8gTWFrZSBzdXJlIHdlXHUyMDE5dmUgYXQgbGVhc3Qgc2VlbiBzb21ldGhpbmcgKGZpbmFsIGVvbCBpcyBwYXJ0IG9mIHRoZSBsYXN0XG4gICAgLy8gdG9rZW4pLlxuICAgIGlmIChjaGlsZEV2ZW50c1tpbmRleF1bMF0gPT09ICdlbnRlcicpIHtcbiAgICAgIGVudGVyZWQgPSB0cnVlXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIC8vIEZpbmQgYSB2b2lkIHRva2VuIHRoYXQgaW5jbHVkZXMgYSBicmVhay5cbiAgICAgIGVudGVyZWQgJiZcbiAgICAgIGNoaWxkRXZlbnRzW2luZGV4XVsxXS50eXBlID09PSBjaGlsZEV2ZW50c1tpbmRleCAtIDFdWzFdLnR5cGUgJiZcbiAgICAgIGNoaWxkRXZlbnRzW2luZGV4XVsxXS5zdGFydC5saW5lICE9PSBjaGlsZEV2ZW50c1tpbmRleF1bMV0uZW5kLmxpbmVcbiAgICApIHtcbiAgICAgIGFkZChjaGlsZEV2ZW50cy5zbGljZShpbmRleCArIDEsIGVuZCkpXG4gICAgICAvLyBIZWxwIEdDLlxuICAgICAgdG9rZW4uX3Rva2VuaXplciA9IHRva2VuLm5leHQgPSB1bmRlZmluZWRcbiAgICAgIHRva2VuID0gdG9rZW4ucHJldmlvdXNcbiAgICAgIGVuZCA9IGluZGV4ICsgMVxuICAgIH1cbiAgfVxuXG4gIC8vIEhlbHAgR0MuXG4gIHRva2VuaXplci5ldmVudHMgPSB0b2tlbi5fdG9rZW5pemVyID0gdG9rZW4ubmV4dCA9IHVuZGVmaW5lZCAvLyBEbyBoZWFkOlxuXG4gIGFkZChjaGlsZEV2ZW50cy5zbGljZSgwLCBlbmQpKVxuICBpbmRleCA9IC0xXG4gIGFkanVzdCA9IDBcblxuICB3aGlsZSAoKytpbmRleCA8IGp1bXBzLmxlbmd0aCkge1xuICAgIGdhcHNbYWRqdXN0ICsganVtcHNbaW5kZXhdWzBdXSA9IGFkanVzdCArIGp1bXBzW2luZGV4XVsxXVxuICAgIGFkanVzdCArPSBqdW1wc1tpbmRleF1bMV0gLSBqdW1wc1tpbmRleF1bMF0gLSAxXG4gIH1cblxuICByZXR1cm4gZ2Fwc1xuXG4gIGZ1bmN0aW9uIGFkZChzbGljZSkge1xuICAgIHZhciBzdGFydCA9IHN0YXJ0UG9zaXRpb25zLnBvcCgpXG4gICAganVtcHMudW5zaGlmdChbc3RhcnQsIHN0YXJ0ICsgc2xpY2UubGVuZ3RoIC0gMV0pXG4gICAgY2h1bmtlZFNwbGljZShldmVudHMsIHN0YXJ0LCAyLCBzbGljZSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN1YnRva2VuaXplXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcuanMnKVxudmFyIHByZWZpeFNpemUgPSByZXF1aXJlKCcuLi91dGlsL3ByZWZpeC1zaXplLmpzJylcbnZhciBzdWJ0b2tlbml6ZSA9IHJlcXVpcmUoJy4uL3V0aWwvc3VidG9rZW5pemUuanMnKVxudmFyIGZhY3RvcnlTcGFjZSA9IHJlcXVpcmUoJy4vZmFjdG9yeS1zcGFjZS5qcycpXG5cbi8vIE5vIG5hbWUgYmVjYXVzZSBpdCBtdXN0IG5vdCBiZSB0dXJuZWQgb2ZmLlxudmFyIGNvbnRlbnQgPSB7XG4gIHRva2VuaXplOiB0b2tlbml6ZUNvbnRlbnQsXG4gIHJlc29sdmU6IHJlc29sdmVDb250ZW50LFxuICBpbnRlcnJ1cHRpYmxlOiB0cnVlLFxuICBsYXp5OiB0cnVlXG59XG52YXIgY29udGludWF0aW9uQ29uc3RydWN0ID0ge1xuICB0b2tlbml6ZTogdG9rZW5pemVDb250aW51YXRpb24sXG4gIHBhcnRpYWw6IHRydWVcbn0gLy8gQ29udGVudCBpcyB0cmFuc3BhcmVudDogaXRcdTIwMTlzIHBhcnNlZCByaWdodCBub3cuIFRoYXQgd2F5LCBkZWZpbml0aW9ucyBhcmUgYWxzb1xuLy8gcGFyc2VkIHJpZ2h0IG5vdzogYmVmb3JlIHRleHQgaW4gcGFyYWdyYXBocyAoc3BlY2lmaWNhbGx5LCBtZWRpYSkgYXJlIHBhcnNlZC5cblxuZnVuY3Rpb24gcmVzb2x2ZUNvbnRlbnQoZXZlbnRzKSB7XG4gIHN1YnRva2VuaXplKGV2ZW50cylcbiAgcmV0dXJuIGV2ZW50c1xufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUNvbnRlbnQoZWZmZWN0cywgb2spIHtcbiAgdmFyIHByZXZpb3VzXG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKCdjb250ZW50JylcbiAgICBwcmV2aW91cyA9IGVmZmVjdHMuZW50ZXIoJ2NodW5rQ29udGVudCcsIHtcbiAgICAgIGNvbnRlbnRUeXBlOiAnY29udGVudCdcbiAgICB9KVxuICAgIHJldHVybiBkYXRhKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBkYXRhKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRFbmQoY29kZSlcbiAgICB9XG5cbiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSB7XG4gICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhcbiAgICAgICAgY29udGludWF0aW9uQ29uc3RydWN0LFxuICAgICAgICBjb250ZW50Q29udGludWUsXG4gICAgICAgIGNvbnRlbnRFbmRcbiAgICAgICkoY29kZSlcbiAgICB9IC8vIERhdGEuXG5cbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgZnVuY3Rpb24gY29udGVudEVuZChjb2RlKSB7XG4gICAgZWZmZWN0cy5leGl0KCdjaHVua0NvbnRlbnQnKVxuICAgIGVmZmVjdHMuZXhpdCgnY29udGVudCcpXG4gICAgcmV0dXJuIG9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjb250ZW50Q29udGludWUoY29kZSkge1xuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIGVmZmVjdHMuZXhpdCgnY2h1bmtDb250ZW50JylcbiAgICBwcmV2aW91cyA9IHByZXZpb3VzLm5leHQgPSBlZmZlY3RzLmVudGVyKCdjaHVua0NvbnRlbnQnLCB7XG4gICAgICBjb250ZW50VHlwZTogJ2NvbnRlbnQnLFxuICAgICAgcHJldmlvdXM6IHByZXZpb3VzXG4gICAgfSlcbiAgICByZXR1cm4gZGF0YVxuICB9XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplQ29udGludWF0aW9uKGVmZmVjdHMsIG9rLCBub2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHJldHVybiBzdGFydExvb2thaGVhZFxuXG4gIGZ1bmN0aW9uIHN0YXJ0TG9va2FoZWFkKGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKCdsaW5lRW5kaW5nJylcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBlZmZlY3RzLmV4aXQoJ2xpbmVFbmRpbmcnKVxuICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgcHJlZml4ZWQsICdsaW5lUHJlZml4JylcbiAgfVxuXG4gIGZ1bmN0aW9uIHByZWZpeGVkKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIHJldHVybiBub2soY29kZSlcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBzZWxmLnBhcnNlci5jb25zdHJ1Y3RzLmRpc2FibGUubnVsbC5pbmRleE9mKCdjb2RlSW5kZW50ZWQnKSA+IC0xIHx8XG4gICAgICBwcmVmaXhTaXplKHNlbGYuZXZlbnRzLCAnbGluZVByZWZpeCcpIDwgNFxuICAgICkge1xuICAgICAgcmV0dXJuIGVmZmVjdHMuaW50ZXJydXB0KHNlbGYucGFyc2VyLmNvbnN0cnVjdHMuZmxvdywgbm9rLCBvaykoY29kZSlcbiAgICB9XG5cbiAgICByZXR1cm4gb2soY29kZSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnRcbiIsICIndXNlIHN0cmljdCdcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge3ZhbHVlOiB0cnVlfSlcblxudmFyIGNvbnRlbnQgPSByZXF1aXJlKCcuLi90b2tlbml6ZS9jb250ZW50LmpzJylcbnZhciBmYWN0b3J5U3BhY2UgPSByZXF1aXJlKCcuLi90b2tlbml6ZS9mYWN0b3J5LXNwYWNlLmpzJylcbnZhciBwYXJ0aWFsQmxhbmtMaW5lID0gcmVxdWlyZSgnLi4vdG9rZW5pemUvcGFydGlhbC1ibGFuay1saW5lLmpzJylcblxudmFyIHRva2VuaXplID0gaW5pdGlhbGl6ZUZsb3dcblxuZnVuY3Rpb24gaW5pdGlhbGl6ZUZsb3coZWZmZWN0cykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIGluaXRpYWwgPSBlZmZlY3RzLmF0dGVtcHQoXG4gICAgLy8gVHJ5IHRvIHBhcnNlIGEgYmxhbmsgbGluZS5cbiAgICBwYXJ0aWFsQmxhbmtMaW5lLFxuICAgIGF0QmxhbmtFbmRpbmcsIC8vIFRyeSB0byBwYXJzZSBpbml0aWFsIGZsb3cgKGVzc2VudGlhbGx5LCBvbmx5IGNvZGUpLlxuICAgIGVmZmVjdHMuYXR0ZW1wdChcbiAgICAgIHRoaXMucGFyc2VyLmNvbnN0cnVjdHMuZmxvd0luaXRpYWwsXG4gICAgICBhZnRlckNvbnN0cnVjdCxcbiAgICAgIGZhY3RvcnlTcGFjZShcbiAgICAgICAgZWZmZWN0cyxcbiAgICAgICAgZWZmZWN0cy5hdHRlbXB0KFxuICAgICAgICAgIHRoaXMucGFyc2VyLmNvbnN0cnVjdHMuZmxvdyxcbiAgICAgICAgICBhZnRlckNvbnN0cnVjdCxcbiAgICAgICAgICBlZmZlY3RzLmF0dGVtcHQoY29udGVudCwgYWZ0ZXJDb25zdHJ1Y3QpXG4gICAgICAgICksXG4gICAgICAgICdsaW5lUHJlZml4J1xuICAgICAgKVxuICAgIClcbiAgKVxuICByZXR1cm4gaW5pdGlhbFxuXG4gIGZ1bmN0aW9uIGF0QmxhbmtFbmRpbmcoY29kZSkge1xuICAgIGlmIChjb2RlID09PSBudWxsKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGVmZmVjdHMuZW50ZXIoJ2xpbmVFbmRpbmdCbGFuaycpXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgZWZmZWN0cy5leGl0KCdsaW5lRW5kaW5nQmxhbmsnKVxuICAgIHNlbGYuY3VycmVudENvbnN0cnVjdCA9IHVuZGVmaW5lZFxuICAgIHJldHVybiBpbml0aWFsXG4gIH1cblxuICBmdW5jdGlvbiBhZnRlckNvbnN0cnVjdChjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG51bGwpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcignbGluZUVuZGluZycpXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgZWZmZWN0cy5leGl0KCdsaW5lRW5kaW5nJylcbiAgICBzZWxmLmN1cnJlbnRDb25zdHJ1Y3QgPSB1bmRlZmluZWRcbiAgICByZXR1cm4gaW5pdGlhbFxuICB9XG59XG5cbmV4cG9ydHMudG9rZW5pemUgPSB0b2tlbml6ZVxuIiwgIid1c2Ugc3RyaWN0J1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7dmFsdWU6IHRydWV9KVxuXG52YXIgYXNzaWduID0gcmVxdWlyZSgnLi4vY29uc3RhbnQvYXNzaWduLmpzJylcbnZhciBzaGFsbG93ID0gcmVxdWlyZSgnLi4vdXRpbC9zaGFsbG93LmpzJylcblxudmFyIHRleHQgPSBpbml0aWFsaXplRmFjdG9yeSgndGV4dCcpXG52YXIgc3RyaW5nID0gaW5pdGlhbGl6ZUZhY3RvcnkoJ3N0cmluZycpXG52YXIgcmVzb2x2ZXIgPSB7XG4gIHJlc29sdmVBbGw6IGNyZWF0ZVJlc29sdmVyKClcbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZUZhY3RvcnkoZmllbGQpIHtcbiAgcmV0dXJuIHtcbiAgICB0b2tlbml6ZTogaW5pdGlhbGl6ZVRleHQsXG4gICAgcmVzb2x2ZUFsbDogY3JlYXRlUmVzb2x2ZXIoXG4gICAgICBmaWVsZCA9PT0gJ3RleHQnID8gcmVzb2x2ZUFsbExpbmVTdWZmaXhlcyA6IHVuZGVmaW5lZFxuICAgIClcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemVUZXh0KGVmZmVjdHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICB2YXIgY29uc3RydWN0cyA9IHRoaXMucGFyc2VyLmNvbnN0cnVjdHNbZmllbGRdXG4gICAgdmFyIHRleHQgPSBlZmZlY3RzLmF0dGVtcHQoY29uc3RydWN0cywgc3RhcnQsIG5vdFRleHQpXG4gICAgcmV0dXJuIHN0YXJ0XG5cbiAgICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgICByZXR1cm4gYXRCcmVhayhjb2RlKSA/IHRleHQoY29kZSkgOiBub3RUZXh0KGNvZGUpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm90VGV4dChjb2RlKSB7XG4gICAgICBpZiAoY29kZSA9PT0gbnVsbCkge1xuICAgICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2RhdGEnKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRhdGEoY29kZSkge1xuICAgICAgaWYgKGF0QnJlYWsoY29kZSkpIHtcbiAgICAgICAgZWZmZWN0cy5leGl0KCdkYXRhJylcbiAgICAgICAgcmV0dXJuIHRleHQoY29kZSlcbiAgICAgIH0gLy8gRGF0YS5cblxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGF0QnJlYWsoY29kZSkge1xuICAgICAgdmFyIGxpc3QgPSBjb25zdHJ1Y3RzW2NvZGVdXG4gICAgICB2YXIgaW5kZXggPSAtMVxuXG4gICAgICBpZiAoY29kZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBpZiAobGlzdCkge1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWxpc3RbaW5kZXhdLnByZXZpb3VzIHx8XG4gICAgICAgICAgICBsaXN0W2luZGV4XS5wcmV2aW91cy5jYWxsKHNlbGYsIHNlbGYucHJldmlvdXMpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVSZXNvbHZlcihleHRyYVJlc29sdmVyKSB7XG4gIHJldHVybiByZXNvbHZlQWxsVGV4dFxuXG4gIGZ1bmN0aW9uIHJlc29sdmVBbGxUZXh0KGV2ZW50cywgY29udGV4dCkge1xuICAgIHZhciBpbmRleCA9IC0xXG4gICAgdmFyIGVudGVyIC8vIEEgcmF0aGVyIGJvcmluZyBjb21wdXRhdGlvbiAodG8gbWVyZ2UgYWRqYWNlbnQgYGRhdGFgIGV2ZW50cykgd2hpY2hcbiAgICAvLyBpbXByb3ZlcyBtbSBwZXJmb3JtYW5jZSBieSAyOSUuXG5cbiAgICB3aGlsZSAoKytpbmRleCA8PSBldmVudHMubGVuZ3RoKSB7XG4gICAgICBpZiAoZW50ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoZXZlbnRzW2luZGV4XSAmJiBldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdkYXRhJykge1xuICAgICAgICAgIGVudGVyID0gaW5kZXhcbiAgICAgICAgICBpbmRleCsrXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWV2ZW50c1tpbmRleF0gfHwgZXZlbnRzW2luZGV4XVsxXS50eXBlICE9PSAnZGF0YScpIHtcbiAgICAgICAgLy8gRG9uXHUyMDE5dCBkbyBhbnl0aGluZyBpZiB0aGVyZSBpcyBvbmUgZGF0YSB0b2tlbi5cbiAgICAgICAgaWYgKGluZGV4ICE9PSBlbnRlciArIDIpIHtcbiAgICAgICAgICBldmVudHNbZW50ZXJdWzFdLmVuZCA9IGV2ZW50c1tpbmRleCAtIDFdWzFdLmVuZFxuICAgICAgICAgIGV2ZW50cy5zcGxpY2UoZW50ZXIgKyAyLCBpbmRleCAtIGVudGVyIC0gMilcbiAgICAgICAgICBpbmRleCA9IGVudGVyICsgMlxuICAgICAgICB9XG5cbiAgICAgICAgZW50ZXIgPSB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXh0cmFSZXNvbHZlciA/IGV4dHJhUmVzb2x2ZXIoZXZlbnRzLCBjb250ZXh0KSA6IGV2ZW50c1xuICB9XG59IC8vIEEgcmF0aGVyIHVnbHkgc2V0IG9mIGluc3RydWN0aW9ucyB3aGljaCBhZ2FpbiBsb29rcyBhdCBjaHVua3MgaW4gdGhlIGlucHV0XG4vLyBzdHJlYW0uXG4vLyBUaGUgcmVhc29uIHRvIGRvIHRoaXMgaGVyZSBpcyB0aGF0IGl0IGlzICptdWNoKiBmYXN0ZXIgdG8gcGFyc2UgaW4gcmV2ZXJzZS5cbi8vIEFuZCB0aGF0IHdlIGNhblx1MjAxOXQgaG9vayBpbnRvIGBudWxsYCB0byBzcGxpdCB0aGUgbGluZSBzdWZmaXggYmVmb3JlIGFuIEVPRi5cbi8vIFRvIGRvOiBmaWd1cmUgb3V0IGlmIHdlIGNhbiBtYWtlIHRoaXMgaW50byBhIGNsZWFuIHV0aWxpdHksIG9yIGV2ZW4gaW4gY29yZS5cbi8vIEFzIGl0IHdpbGwgYmUgdXNlZnVsIGZvciBHRk1zIGxpdGVyYWwgYXV0b2xpbmsgZXh0ZW5zaW9uIChhbmQgbWF5YmUgZXZlblxuLy8gdGFibGVzPylcblxuZnVuY3Rpb24gcmVzb2x2ZUFsbExpbmVTdWZmaXhlcyhldmVudHMsIGNvbnRleHQpIHtcbiAgdmFyIGV2ZW50SW5kZXggPSAtMVxuICB2YXIgY2h1bmtzXG4gIHZhciBkYXRhXG4gIHZhciBjaHVua1xuICB2YXIgaW5kZXhcbiAgdmFyIGJ1ZmZlckluZGV4XG4gIHZhciBzaXplXG4gIHZhciB0YWJzXG4gIHZhciB0b2tlblxuXG4gIHdoaWxlICgrK2V2ZW50SW5kZXggPD0gZXZlbnRzLmxlbmd0aCkge1xuICAgIGlmIChcbiAgICAgIChldmVudEluZGV4ID09PSBldmVudHMubGVuZ3RoIHx8XG4gICAgICAgIGV2ZW50c1tldmVudEluZGV4XVsxXS50eXBlID09PSAnbGluZUVuZGluZycpICYmXG4gICAgICBldmVudHNbZXZlbnRJbmRleCAtIDFdWzFdLnR5cGUgPT09ICdkYXRhJ1xuICAgICkge1xuICAgICAgZGF0YSA9IGV2ZW50c1tldmVudEluZGV4IC0gMV1bMV1cbiAgICAgIGNodW5rcyA9IGNvbnRleHQuc2xpY2VTdHJlYW0oZGF0YSlcbiAgICAgIGluZGV4ID0gY2h1bmtzLmxlbmd0aFxuICAgICAgYnVmZmVySW5kZXggPSAtMVxuICAgICAgc2l6ZSA9IDBcbiAgICAgIHRhYnMgPSB1bmRlZmluZWRcblxuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgY2h1bmsgPSBjaHVua3NbaW5kZXhdXG5cbiAgICAgICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBidWZmZXJJbmRleCA9IGNodW5rLmxlbmd0aFxuXG4gICAgICAgICAgd2hpbGUgKGNodW5rLmNoYXJDb2RlQXQoYnVmZmVySW5kZXggLSAxKSA9PT0gMzIpIHtcbiAgICAgICAgICAgIHNpemUrK1xuICAgICAgICAgICAgYnVmZmVySW5kZXgtLVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChidWZmZXJJbmRleCkgYnJlYWtcbiAgICAgICAgICBidWZmZXJJbmRleCA9IC0xXG4gICAgICAgIH0gLy8gTnVtYmVyXG4gICAgICAgIGVsc2UgaWYgKGNodW5rID09PSAtMikge1xuICAgICAgICAgIHRhYnMgPSB0cnVlXG4gICAgICAgICAgc2l6ZSsrXG4gICAgICAgIH0gZWxzZSBpZiAoY2h1bmsgPT09IC0xKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgLy8gUmVwbGFjZW1lbnQgY2hhcmFjdGVyLCBleGl0LlxuICAgICAgICAgIGluZGV4KytcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzaXplKSB7XG4gICAgICAgIHRva2VuID0ge1xuICAgICAgICAgIHR5cGU6XG4gICAgICAgICAgICBldmVudEluZGV4ID09PSBldmVudHMubGVuZ3RoIHx8IHRhYnMgfHwgc2l6ZSA8IDJcbiAgICAgICAgICAgICAgPyAnbGluZVN1ZmZpeCdcbiAgICAgICAgICAgICAgOiAnaGFyZEJyZWFrVHJhaWxpbmcnLFxuICAgICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgICBsaW5lOiBkYXRhLmVuZC5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiBkYXRhLmVuZC5jb2x1bW4gLSBzaXplLFxuICAgICAgICAgICAgb2Zmc2V0OiBkYXRhLmVuZC5vZmZzZXQgLSBzaXplLFxuICAgICAgICAgICAgX2luZGV4OiBkYXRhLnN0YXJ0Ll9pbmRleCArIGluZGV4LFxuICAgICAgICAgICAgX2J1ZmZlckluZGV4OiBpbmRleFxuICAgICAgICAgICAgICA/IGJ1ZmZlckluZGV4XG4gICAgICAgICAgICAgIDogZGF0YS5zdGFydC5fYnVmZmVySW5kZXggKyBidWZmZXJJbmRleFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZW5kOiBzaGFsbG93KGRhdGEuZW5kKVxuICAgICAgICB9XG4gICAgICAgIGRhdGEuZW5kID0gc2hhbGxvdyh0b2tlbi5zdGFydClcblxuICAgICAgICBpZiAoZGF0YS5zdGFydC5vZmZzZXQgPT09IGRhdGEuZW5kLm9mZnNldCkge1xuICAgICAgICAgIGFzc2lnbihkYXRhLCB0b2tlbilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBldmVudHMuc3BsaWNlKFxuICAgICAgICAgICAgZXZlbnRJbmRleCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBbJ2VudGVyJywgdG9rZW4sIGNvbnRleHRdLFxuICAgICAgICAgICAgWydleGl0JywgdG9rZW4sIGNvbnRleHRdXG4gICAgICAgICAgKVxuICAgICAgICAgIGV2ZW50SW5kZXggKz0gMlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGV2ZW50SW5kZXgrK1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBldmVudHNcbn1cblxuZXhwb3J0cy5yZXNvbHZlciA9IHJlc29sdmVyXG5leHBvcnRzLnN0cmluZyA9IHN0cmluZ1xuZXhwb3J0cy50ZXh0ID0gdGV4dFxuIiwgIid1c2Ugc3RyaWN0J1xuXG5mdW5jdGlvbiBtaW5pZmxhdCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgID8gW11cbiAgICA6ICdsZW5ndGgnIGluIHZhbHVlXG4gICAgPyB2YWx1ZVxuICAgIDogW3ZhbHVlXVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1pbmlmbGF0XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2NvbnN0YW50L2hhcy1vd24tcHJvcGVydHkuanMnKVxudmFyIGNodW5rZWRTcGxpY2UgPSByZXF1aXJlKCcuL2NodW5rZWQtc3BsaWNlLmpzJylcbnZhciBtaW5pZmxhdCA9IHJlcXVpcmUoJy4vbWluaWZsYXQuanMnKVxuXG5mdW5jdGlvbiBjb21iaW5lRXh0ZW5zaW9ucyhleHRlbnNpb25zKSB7XG4gIHZhciBhbGwgPSB7fVxuICB2YXIgaW5kZXggPSAtMVxuXG4gIHdoaWxlICgrK2luZGV4IDwgZXh0ZW5zaW9ucy5sZW5ndGgpIHtcbiAgICBleHRlbnNpb24oYWxsLCBleHRlbnNpb25zW2luZGV4XSlcbiAgfVxuXG4gIHJldHVybiBhbGxcbn1cblxuZnVuY3Rpb24gZXh0ZW5zaW9uKGFsbCwgZXh0ZW5zaW9uKSB7XG4gIHZhciBob29rXG4gIHZhciBsZWZ0XG4gIHZhciByaWdodFxuICB2YXIgY29kZVxuXG4gIGZvciAoaG9vayBpbiBleHRlbnNpb24pIHtcbiAgICBsZWZ0ID0gaGFzT3duUHJvcGVydHkuY2FsbChhbGwsIGhvb2spID8gYWxsW2hvb2tdIDogKGFsbFtob29rXSA9IHt9KVxuICAgIHJpZ2h0ID0gZXh0ZW5zaW9uW2hvb2tdXG5cbiAgICBmb3IgKGNvZGUgaW4gcmlnaHQpIHtcbiAgICAgIGxlZnRbY29kZV0gPSBjb25zdHJ1Y3RzKFxuICAgICAgICBtaW5pZmxhdChyaWdodFtjb2RlXSksXG4gICAgICAgIGhhc093blByb3BlcnR5LmNhbGwobGVmdCwgY29kZSkgPyBsZWZ0W2NvZGVdIDogW11cbiAgICAgIClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uc3RydWN0cyhsaXN0LCBleGlzdGluZykge1xuICB2YXIgaW5kZXggPSAtMVxuICB2YXIgYmVmb3JlID0gW11cblxuICB3aGlsZSAoKytpbmRleCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgOyhsaXN0W2luZGV4XS5hZGQgPT09ICdhZnRlcicgPyBleGlzdGluZyA6IGJlZm9yZSkucHVzaChsaXN0W2luZGV4XSlcbiAgfVxuXG4gIGNodW5rZWRTcGxpY2UoZXhpc3RpbmcsIDAsIDAsIGJlZm9yZSlcbiAgcmV0dXJuIGV4aXN0aW5nXG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29tYmluZUV4dGVuc2lvbnNcbiIsICIndXNlIHN0cmljdCdcblxudmFyIGNodW5rZWRTcGxpY2UgPSByZXF1aXJlKCcuL2NodW5rZWQtc3BsaWNlLmpzJylcblxuZnVuY3Rpb24gY2h1bmtlZFB1c2gobGlzdCwgaXRlbXMpIHtcbiAgaWYgKGxpc3QubGVuZ3RoKSB7XG4gICAgY2h1bmtlZFNwbGljZShsaXN0LCBsaXN0Lmxlbmd0aCwgMCwgaXRlbXMpXG4gICAgcmV0dXJuIGxpc3RcbiAgfVxuXG4gIHJldHVybiBpdGVtc1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNodW5rZWRQdXNoXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbmZ1bmN0aW9uIHJlc29sdmVBbGwoY29uc3RydWN0cywgZXZlbnRzLCBjb250ZXh0KSB7XG4gIHZhciBjYWxsZWQgPSBbXVxuICB2YXIgaW5kZXggPSAtMVxuICB2YXIgcmVzb2x2ZVxuXG4gIHdoaWxlICgrK2luZGV4IDwgY29uc3RydWN0cy5sZW5ndGgpIHtcbiAgICByZXNvbHZlID0gY29uc3RydWN0c1tpbmRleF0ucmVzb2x2ZUFsbFxuXG4gICAgaWYgKHJlc29sdmUgJiYgY2FsbGVkLmluZGV4T2YocmVzb2x2ZSkgPCAwKSB7XG4gICAgICBldmVudHMgPSByZXNvbHZlKGV2ZW50cywgY29udGV4dClcbiAgICAgIGNhbGxlZC5wdXNoKHJlc29sdmUpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV2ZW50c1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlc29sdmVBbGxcbiIsICIndXNlIHN0cmljdCdcblxudmFyIGZyb21DaGFyQ29kZSA9IHJlcXVpcmUoJy4uL2NvbnN0YW50L2Zyb20tY2hhci1jb2RlLmpzJylcblxuZnVuY3Rpb24gc2VyaWFsaXplQ2h1bmtzKGNodW5rcykge1xuICB2YXIgaW5kZXggPSAtMVxuICB2YXIgcmVzdWx0ID0gW11cbiAgdmFyIGNodW5rXG4gIHZhciB2YWx1ZVxuICB2YXIgYXRUYWJcblxuICB3aGlsZSAoKytpbmRleCA8IGNodW5rcy5sZW5ndGgpIHtcbiAgICBjaHVuayA9IGNodW5rc1tpbmRleF1cblxuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IGNodW5rXG4gICAgfSBlbHNlIGlmIChjaHVuayA9PT0gLTUpIHtcbiAgICAgIHZhbHVlID0gJ1xccidcbiAgICB9IGVsc2UgaWYgKGNodW5rID09PSAtNCkge1xuICAgICAgdmFsdWUgPSAnXFxuJ1xuICAgIH0gZWxzZSBpZiAoY2h1bmsgPT09IC0zKSB7XG4gICAgICB2YWx1ZSA9ICdcXHInICsgJ1xcbidcbiAgICB9IGVsc2UgaWYgKGNodW5rID09PSAtMikge1xuICAgICAgdmFsdWUgPSAnXFx0J1xuICAgIH0gZWxzZSBpZiAoY2h1bmsgPT09IC0xKSB7XG4gICAgICBpZiAoYXRUYWIpIGNvbnRpbnVlXG4gICAgICB2YWx1ZSA9ICcgJ1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDdXJyZW50bHkgb25seSByZXBsYWNlbWVudCBjaGFyYWN0ZXIuXG4gICAgICB2YWx1ZSA9IGZyb21DaGFyQ29kZShjaHVuaylcbiAgICB9XG5cbiAgICBhdFRhYiA9IGNodW5rID09PSAtMlxuICAgIHJlc3VsdC5wdXNoKHZhbHVlKVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNlcmlhbGl6ZUNodW5rc1xuIiwgIid1c2Ugc3RyaWN0J1xuXG5mdW5jdGlvbiBzbGljZUNodW5rcyhjaHVua3MsIHRva2VuKSB7XG4gIHZhciBzdGFydEluZGV4ID0gdG9rZW4uc3RhcnQuX2luZGV4XG4gIHZhciBzdGFydEJ1ZmZlckluZGV4ID0gdG9rZW4uc3RhcnQuX2J1ZmZlckluZGV4XG4gIHZhciBlbmRJbmRleCA9IHRva2VuLmVuZC5faW5kZXhcbiAgdmFyIGVuZEJ1ZmZlckluZGV4ID0gdG9rZW4uZW5kLl9idWZmZXJJbmRleFxuICB2YXIgdmlld1xuXG4gIGlmIChzdGFydEluZGV4ID09PSBlbmRJbmRleCkge1xuICAgIHZpZXcgPSBbY2h1bmtzW3N0YXJ0SW5kZXhdLnNsaWNlKHN0YXJ0QnVmZmVySW5kZXgsIGVuZEJ1ZmZlckluZGV4KV1cbiAgfSBlbHNlIHtcbiAgICB2aWV3ID0gY2h1bmtzLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KVxuXG4gICAgaWYgKHN0YXJ0QnVmZmVySW5kZXggPiAtMSkge1xuICAgICAgdmlld1swXSA9IHZpZXdbMF0uc2xpY2Uoc3RhcnRCdWZmZXJJbmRleClcbiAgICB9XG5cbiAgICBpZiAoZW5kQnVmZmVySW5kZXggPiAwKSB7XG4gICAgICB2aWV3LnB1c2goY2h1bmtzW2VuZEluZGV4XS5zbGljZSgwLCBlbmRCdWZmZXJJbmRleCkpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZpZXdcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzbGljZUNodW5rc1xuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgYXNzaWduID0gcmVxdWlyZSgnLi4vY29uc3RhbnQvYXNzaWduLmpzJylcbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcuanMnKVxudmFyIGNodW5rZWRQdXNoID0gcmVxdWlyZSgnLi9jaHVua2VkLXB1c2guanMnKVxudmFyIGNodW5rZWRTcGxpY2UgPSByZXF1aXJlKCcuL2NodW5rZWQtc3BsaWNlLmpzJylcbnZhciBtaW5pZmxhdCA9IHJlcXVpcmUoJy4vbWluaWZsYXQuanMnKVxudmFyIHJlc29sdmVBbGwgPSByZXF1aXJlKCcuL3Jlc29sdmUtYWxsLmpzJylcbnZhciBzZXJpYWxpemVDaHVua3MgPSByZXF1aXJlKCcuL3NlcmlhbGl6ZS1jaHVua3MuanMnKVxudmFyIHNoYWxsb3cgPSByZXF1aXJlKCcuL3NoYWxsb3cuanMnKVxudmFyIHNsaWNlQ2h1bmtzID0gcmVxdWlyZSgnLi9zbGljZS1jaHVua3MuanMnKVxuXG4vLyBDcmVhdGUgYSB0b2tlbml6ZXIuXG4vLyBUb2tlbml6ZXJzIGRlYWwgd2l0aCBvbmUgdHlwZSBvZiBkYXRhIChlLmcuLCBjb250YWluZXJzLCBmbG93LCB0ZXh0KS5cbi8vIFRoZSBwYXJzZXIgaXMgdGhlIG9iamVjdCBkZWFsaW5nIHdpdGggaXQgYWxsLlxuLy8gYGluaXRpYWxpemVgIHdvcmtzIGxpa2Ugb3RoZXIgY29uc3RydWN0cywgZXhjZXB0IHRoYXQgb25seSBpdHMgYHRva2VuaXplYFxuLy8gZnVuY3Rpb24gaXMgdXNlZCwgaW4gd2hpY2ggY2FzZSBpdCBkb2Vzblx1MjAxOXQgcmVjZWl2ZSBhbiBgb2tgIG9yIGBub2tgLlxuLy8gYGZyb21gIGNhbiBiZSBnaXZlbiB0byBzZXQgdGhlIHBvaW50IGJlZm9yZSB0aGUgZmlyc3QgY2hhcmFjdGVyLCBhbHRob3VnaFxuLy8gd2hlbiBmdXJ0aGVyIGxpbmVzIGFyZSBpbmRlbnRlZCwgdGhleSBtdXN0IGJlIHNldCB3aXRoIGBkZWZpbmVTa2lwYC5cbmZ1bmN0aW9uIGNyZWF0ZVRva2VuaXplcihwYXJzZXIsIGluaXRpYWxpemUsIGZyb20pIHtcbiAgdmFyIHBvaW50ID0gZnJvbVxuICAgID8gc2hhbGxvdyhmcm9tKVxuICAgIDoge1xuICAgICAgICBsaW5lOiAxLFxuICAgICAgICBjb2x1bW46IDEsXG4gICAgICAgIG9mZnNldDogMFxuICAgICAgfVxuICB2YXIgY29sdW1uU3RhcnQgPSB7fVxuICB2YXIgcmVzb2x2ZUFsbENvbnN0cnVjdHMgPSBbXVxuICB2YXIgY2h1bmtzID0gW11cbiAgdmFyIHN0YWNrID0gW11cblxuICB2YXIgZWZmZWN0cyA9IHtcbiAgICBjb25zdW1lOiBjb25zdW1lLFxuICAgIGVudGVyOiBlbnRlcixcbiAgICBleGl0OiBleGl0LFxuICAgIGF0dGVtcHQ6IGNvbnN0cnVjdEZhY3Rvcnkob25zdWNjZXNzZnVsY29uc3RydWN0KSxcbiAgICBjaGVjazogY29uc3RydWN0RmFjdG9yeShvbnN1Y2Nlc3NmdWxjaGVjayksXG4gICAgaW50ZXJydXB0OiBjb25zdHJ1Y3RGYWN0b3J5KG9uc3VjY2Vzc2Z1bGNoZWNrLCB7XG4gICAgICBpbnRlcnJ1cHQ6IHRydWVcbiAgICB9KSxcbiAgICBsYXp5OiBjb25zdHJ1Y3RGYWN0b3J5KG9uc3VjY2Vzc2Z1bGNoZWNrLCB7XG4gICAgICBsYXp5OiB0cnVlXG4gICAgfSlcbiAgfSAvLyBTdGF0ZSBhbmQgdG9vbHMgZm9yIHJlc29sdmluZyBhbmQgc2VyaWFsaXppbmcuXG5cbiAgdmFyIGNvbnRleHQgPSB7XG4gICAgcHJldmlvdXM6IG51bGwsXG4gICAgZXZlbnRzOiBbXSxcbiAgICBwYXJzZXI6IHBhcnNlcixcbiAgICBzbGljZVN0cmVhbTogc2xpY2VTdHJlYW0sXG4gICAgc2xpY2VTZXJpYWxpemU6IHNsaWNlU2VyaWFsaXplLFxuICAgIG5vdzogbm93LFxuICAgIGRlZmluZVNraXA6IHNraXAsXG4gICAgd3JpdGU6IHdyaXRlXG4gIH0gLy8gVGhlIHN0YXRlIGZ1bmN0aW9uLlxuXG4gIHZhciBzdGF0ZSA9IGluaXRpYWxpemUudG9rZW5pemUuY2FsbChjb250ZXh0LCBlZmZlY3RzKSAvLyBUcmFjayB3aGljaCBjaGFyYWN0ZXIgd2UgZXhwZWN0IHRvIGJlIGNvbnN1bWVkLCB0byBjYXRjaCBidWdzLlxuXG4gIGlmIChpbml0aWFsaXplLnJlc29sdmVBbGwpIHtcbiAgICByZXNvbHZlQWxsQ29uc3RydWN0cy5wdXNoKGluaXRpYWxpemUpXG4gIH0gLy8gU3RvcmUgd2hlcmUgd2UgYXJlIGluIHRoZSBpbnB1dCBzdHJlYW0uXG5cbiAgcG9pbnQuX2luZGV4ID0gMFxuICBwb2ludC5fYnVmZmVySW5kZXggPSAtMVxuICByZXR1cm4gY29udGV4dFxuXG4gIGZ1bmN0aW9uIHdyaXRlKHNsaWNlKSB7XG4gICAgY2h1bmtzID0gY2h1bmtlZFB1c2goY2h1bmtzLCBzbGljZSlcbiAgICBtYWluKCkgLy8gRXhpdCBpZiB3ZVx1MjAxOXJlIG5vdCBkb25lLCByZXNvbHZlIG1pZ2h0IGNoYW5nZSBzdHVmZi5cblxuICAgIGlmIChjaHVua3NbY2h1bmtzLmxlbmd0aCAtIDFdICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICBhZGRSZXN1bHQoaW5pdGlhbGl6ZSwgMCkgLy8gT3RoZXJ3aXNlLCByZXNvbHZlLCBhbmQgZXhpdC5cblxuICAgIGNvbnRleHQuZXZlbnRzID0gcmVzb2x2ZUFsbChyZXNvbHZlQWxsQ29uc3RydWN0cywgY29udGV4dC5ldmVudHMsIGNvbnRleHQpXG4gICAgcmV0dXJuIGNvbnRleHQuZXZlbnRzXG4gIH0gLy9cbiAgLy8gVG9vbHMuXG4gIC8vXG5cbiAgZnVuY3Rpb24gc2xpY2VTZXJpYWxpemUodG9rZW4pIHtcbiAgICByZXR1cm4gc2VyaWFsaXplQ2h1bmtzKHNsaWNlU3RyZWFtKHRva2VuKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHNsaWNlU3RyZWFtKHRva2VuKSB7XG4gICAgcmV0dXJuIHNsaWNlQ2h1bmtzKGNodW5rcywgdG9rZW4pXG4gIH1cblxuICBmdW5jdGlvbiBub3coKSB7XG4gICAgcmV0dXJuIHNoYWxsb3cocG9pbnQpXG4gIH1cblxuICBmdW5jdGlvbiBza2lwKHZhbHVlKSB7XG4gICAgY29sdW1uU3RhcnRbdmFsdWUubGluZV0gPSB2YWx1ZS5jb2x1bW5cbiAgICBhY2NvdW50Rm9yUG90ZW50aWFsU2tpcCgpXG4gIH0gLy9cbiAgLy8gU3RhdGUgbWFuYWdlbWVudC5cbiAgLy9cbiAgLy8gTWFpbiBsb29wIChub3RlIHRoYXQgYF9pbmRleGAgYW5kIGBfYnVmZmVySW5kZXhgIGluIGBwb2ludGAgYXJlIG1vZGlmaWVkIGJ5XG4gIC8vIGBjb25zdW1lYCkuXG4gIC8vIEhlcmUgaXMgd2hlcmUgd2Ugd2FsayB0aHJvdWdoIHRoZSBjaHVua3MsIHdoaWNoIGVpdGhlciBpbmNsdWRlIHN0cmluZ3Mgb2ZcbiAgLy8gc2V2ZXJhbCBjaGFyYWN0ZXJzLCBvciBudW1lcmljYWwgY2hhcmFjdGVyIGNvZGVzLlxuICAvLyBUaGUgcmVhc29uIHRvIGRvIHRoaXMgaW4gYSBsb29wIGluc3RlYWQgb2YgYSBjYWxsIGlzIHNvIHRoZSBzdGFjayBjYW5cbiAgLy8gZHJhaW4uXG5cbiAgZnVuY3Rpb24gbWFpbigpIHtcbiAgICB2YXIgY2h1bmtJbmRleFxuICAgIHZhciBjaHVua1xuXG4gICAgd2hpbGUgKHBvaW50Ll9pbmRleCA8IGNodW5rcy5sZW5ndGgpIHtcbiAgICAgIGNodW5rID0gY2h1bmtzW3BvaW50Ll9pbmRleF0gLy8gSWYgd2VcdTIwMTlyZSBpbiBhIGJ1ZmZlciBjaHVuaywgbG9vcCB0aHJvdWdoIGl0LlxuXG4gICAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgICBjaHVua0luZGV4ID0gcG9pbnQuX2luZGV4XG5cbiAgICAgICAgaWYgKHBvaW50Ll9idWZmZXJJbmRleCA8IDApIHtcbiAgICAgICAgICBwb2ludC5fYnVmZmVySW5kZXggPSAwXG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgcG9pbnQuX2luZGV4ID09PSBjaHVua0luZGV4ICYmXG4gICAgICAgICAgcG9pbnQuX2J1ZmZlckluZGV4IDwgY2h1bmsubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgIGdvKGNodW5rLmNoYXJDb2RlQXQocG9pbnQuX2J1ZmZlckluZGV4KSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ28oY2h1bmspXG4gICAgICB9XG4gICAgfVxuICB9IC8vIERlYWwgd2l0aCBvbmUgY29kZS5cblxuICBmdW5jdGlvbiBnbyhjb2RlKSB7XG4gICAgc3RhdGUgPSBzdGF0ZShjb2RlKVxuICB9IC8vIE1vdmUgYSBjaGFyYWN0ZXIgZm9yd2FyZC5cblxuICBmdW5jdGlvbiBjb25zdW1lKGNvZGUpIHtcbiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSB7XG4gICAgICBwb2ludC5saW5lKytcbiAgICAgIHBvaW50LmNvbHVtbiA9IDFcbiAgICAgIHBvaW50Lm9mZnNldCArPSBjb2RlID09PSAtMyA/IDIgOiAxXG4gICAgICBhY2NvdW50Rm9yUG90ZW50aWFsU2tpcCgpXG4gICAgfSBlbHNlIGlmIChjb2RlICE9PSAtMSkge1xuICAgICAgcG9pbnQuY29sdW1uKytcbiAgICAgIHBvaW50Lm9mZnNldCsrXG4gICAgfSAvLyBOb3QgaW4gYSBzdHJpbmcgY2h1bmsuXG5cbiAgICBpZiAocG9pbnQuX2J1ZmZlckluZGV4IDwgMCkge1xuICAgICAgcG9pbnQuX2luZGV4KytcbiAgICB9IGVsc2Uge1xuICAgICAgcG9pbnQuX2J1ZmZlckluZGV4KysgLy8gQXQgZW5kIG9mIHN0cmluZyBjaHVuay5cblxuICAgICAgaWYgKHBvaW50Ll9idWZmZXJJbmRleCA9PT0gY2h1bmtzW3BvaW50Ll9pbmRleF0ubGVuZ3RoKSB7XG4gICAgICAgIHBvaW50Ll9idWZmZXJJbmRleCA9IC0xXG4gICAgICAgIHBvaW50Ll9pbmRleCsrXG4gICAgICB9XG4gICAgfSAvLyBFeHBvc2UgdGhlIHByZXZpb3VzIGNoYXJhY3Rlci5cblxuICAgIGNvbnRleHQucHJldmlvdXMgPSBjb2RlIC8vIE1hcmsgYXMgY29uc3VtZWQuXG4gIH0gLy8gU3RhcnQgYSB0b2tlbi5cblxuICBmdW5jdGlvbiBlbnRlcih0eXBlLCBmaWVsZHMpIHtcbiAgICB2YXIgdG9rZW4gPSBmaWVsZHMgfHwge31cbiAgICB0b2tlbi50eXBlID0gdHlwZVxuICAgIHRva2VuLnN0YXJ0ID0gbm93KClcbiAgICBjb250ZXh0LmV2ZW50cy5wdXNoKFsnZW50ZXInLCB0b2tlbiwgY29udGV4dF0pXG4gICAgc3RhY2sucHVzaCh0b2tlbilcbiAgICByZXR1cm4gdG9rZW5cbiAgfSAvLyBTdG9wIGEgdG9rZW4uXG5cbiAgZnVuY3Rpb24gZXhpdCh0eXBlKSB7XG4gICAgdmFyIHRva2VuID0gc3RhY2sucG9wKClcbiAgICB0b2tlbi5lbmQgPSBub3coKVxuICAgIGNvbnRleHQuZXZlbnRzLnB1c2goWydleGl0JywgdG9rZW4sIGNvbnRleHRdKVxuICAgIHJldHVybiB0b2tlblxuICB9IC8vIFVzZSByZXN1bHRzLlxuXG4gIGZ1bmN0aW9uIG9uc3VjY2Vzc2Z1bGNvbnN0cnVjdChjb25zdHJ1Y3QsIGluZm8pIHtcbiAgICBhZGRSZXN1bHQoY29uc3RydWN0LCBpbmZvLmZyb20pXG4gIH0gLy8gRGlzY2FyZCByZXN1bHRzLlxuXG4gIGZ1bmN0aW9uIG9uc3VjY2Vzc2Z1bGNoZWNrKGNvbnN0cnVjdCwgaW5mbykge1xuICAgIGluZm8ucmVzdG9yZSgpXG4gIH0gLy8gRmFjdG9yeSB0byBhdHRlbXB0L2NoZWNrL2ludGVycnVwdC5cblxuICBmdW5jdGlvbiBjb25zdHJ1Y3RGYWN0b3J5KG9ucmV0dXJuLCBmaWVsZHMpIHtcbiAgICByZXR1cm4gaG9vayAvLyBIYW5kbGUgZWl0aGVyIGFuIG9iamVjdCBtYXBwaW5nIGNvZGVzIHRvIGNvbnN0cnVjdHMsIGEgbGlzdCBvZlxuICAgIC8vIGNvbnN0cnVjdHMsIG9yIGEgc2luZ2xlIGNvbnN0cnVjdC5cblxuICAgIGZ1bmN0aW9uIGhvb2soY29uc3RydWN0cywgcmV0dXJuU3RhdGUsIGJvZ3VzU3RhdGUpIHtcbiAgICAgIHZhciBsaXN0T2ZDb25zdHJ1Y3RzXG4gICAgICB2YXIgY29uc3RydWN0SW5kZXhcbiAgICAgIHZhciBjdXJyZW50Q29uc3RydWN0XG4gICAgICB2YXIgaW5mb1xuICAgICAgcmV0dXJuIGNvbnN0cnVjdHMudG9rZW5pemUgfHwgJ2xlbmd0aCcgaW4gY29uc3RydWN0c1xuICAgICAgICA/IGhhbmRsZUxpc3RPZkNvbnN0cnVjdHMobWluaWZsYXQoY29uc3RydWN0cykpXG4gICAgICAgIDogaGFuZGxlTWFwT2ZDb25zdHJ1Y3RzXG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZU1hcE9mQ29uc3RydWN0cyhjb2RlKSB7XG4gICAgICAgIGlmIChjb2RlIGluIGNvbnN0cnVjdHMgfHwgbnVsbCBpbiBjb25zdHJ1Y3RzKSB7XG4gICAgICAgICAgcmV0dXJuIGhhbmRsZUxpc3RPZkNvbnN0cnVjdHMoXG4gICAgICAgICAgICBjb25zdHJ1Y3RzLm51bGxcbiAgICAgICAgICAgICAgPyAvKiBjOCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgICAgIG1pbmlmbGF0KGNvbnN0cnVjdHNbY29kZV0pLmNvbmNhdChtaW5pZmxhdChjb25zdHJ1Y3RzLm51bGwpKVxuICAgICAgICAgICAgICA6IGNvbnN0cnVjdHNbY29kZV1cbiAgICAgICAgICApKGNvZGUpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYm9ndXNTdGF0ZShjb2RlKVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBoYW5kbGVMaXN0T2ZDb25zdHJ1Y3RzKGxpc3QpIHtcbiAgICAgICAgbGlzdE9mQ29uc3RydWN0cyA9IGxpc3RcbiAgICAgICAgY29uc3RydWN0SW5kZXggPSAwXG4gICAgICAgIHJldHVybiBoYW5kbGVDb25zdHJ1Y3QobGlzdFtjb25zdHJ1Y3RJbmRleF0pXG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZUNvbnN0cnVjdChjb25zdHJ1Y3QpIHtcbiAgICAgICAgcmV0dXJuIHN0YXJ0XG5cbiAgICAgICAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgICAgICAgIC8vIFRvIGRvOiBub3QgbmVkZSB0byBzdG9yZSBpZiB0aGVyZSBpcyBubyBib2d1cyBzdGF0ZSwgcHJvYmFibHk/XG4gICAgICAgICAgLy8gQ3VycmVudGx5IGRvZXNuXHUyMDE5dCB3b3JrIGJlY2F1c2UgYGluc3BlY3RgIGluIGRvY3VtZW50IGRvZXMgYSBjaGVja1xuICAgICAgICAgIC8vIHcvbyBhIGJvZ3VzLCB3aGljaCBkb2Vzblx1MjAxOXQgbWFrZSBzZW5zZS4gQnV0IGl0IGRvZXMgc2VlbSB0byBoZWxwIHBlcmZcbiAgICAgICAgICAvLyBieSBub3Qgc3RvcmluZy5cbiAgICAgICAgICBpbmZvID0gc3RvcmUoKVxuICAgICAgICAgIGN1cnJlbnRDb25zdHJ1Y3QgPSBjb25zdHJ1Y3RcblxuICAgICAgICAgIGlmICghY29uc3RydWN0LnBhcnRpYWwpIHtcbiAgICAgICAgICAgIGNvbnRleHQuY3VycmVudENvbnN0cnVjdCA9IGNvbnN0cnVjdFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGNvbnN0cnVjdC5uYW1lICYmXG4gICAgICAgICAgICBjb250ZXh0LnBhcnNlci5jb25zdHJ1Y3RzLmRpc2FibGUubnVsbC5pbmRleE9mKGNvbnN0cnVjdC5uYW1lKSA+IC0xXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9rKClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29uc3RydWN0LnRva2VuaXplLmNhbGwoXG4gICAgICAgICAgICBmaWVsZHMgPyBhc3NpZ24oe30sIGNvbnRleHQsIGZpZWxkcykgOiBjb250ZXh0LFxuICAgICAgICAgICAgZWZmZWN0cyxcbiAgICAgICAgICAgIG9rLFxuICAgICAgICAgICAgbm9rXG4gICAgICAgICAgKShjb2RlKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG9rKGNvZGUpIHtcbiAgICAgICAgb25yZXR1cm4oY3VycmVudENvbnN0cnVjdCwgaW5mbylcbiAgICAgICAgcmV0dXJuIHJldHVyblN0YXRlXG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG5vayhjb2RlKSB7XG4gICAgICAgIGluZm8ucmVzdG9yZSgpXG5cbiAgICAgICAgaWYgKCsrY29uc3RydWN0SW5kZXggPCBsaXN0T2ZDb25zdHJ1Y3RzLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBoYW5kbGVDb25zdHJ1Y3QobGlzdE9mQ29uc3RydWN0c1tjb25zdHJ1Y3RJbmRleF0pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYm9ndXNTdGF0ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFJlc3VsdChjb25zdHJ1Y3QsIGZyb20pIHtcbiAgICBpZiAoY29uc3RydWN0LnJlc29sdmVBbGwgJiYgcmVzb2x2ZUFsbENvbnN0cnVjdHMuaW5kZXhPZihjb25zdHJ1Y3QpIDwgMCkge1xuICAgICAgcmVzb2x2ZUFsbENvbnN0cnVjdHMucHVzaChjb25zdHJ1Y3QpXG4gICAgfVxuXG4gICAgaWYgKGNvbnN0cnVjdC5yZXNvbHZlKSB7XG4gICAgICBjaHVua2VkU3BsaWNlKFxuICAgICAgICBjb250ZXh0LmV2ZW50cyxcbiAgICAgICAgZnJvbSxcbiAgICAgICAgY29udGV4dC5ldmVudHMubGVuZ3RoIC0gZnJvbSxcbiAgICAgICAgY29uc3RydWN0LnJlc29sdmUoY29udGV4dC5ldmVudHMuc2xpY2UoZnJvbSksIGNvbnRleHQpXG4gICAgICApXG4gICAgfVxuXG4gICAgaWYgKGNvbnN0cnVjdC5yZXNvbHZlVG8pIHtcbiAgICAgIGNvbnRleHQuZXZlbnRzID0gY29uc3RydWN0LnJlc29sdmVUbyhjb250ZXh0LmV2ZW50cywgY29udGV4dClcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdG9yZSgpIHtcbiAgICB2YXIgc3RhcnRQb2ludCA9IG5vdygpXG4gICAgdmFyIHN0YXJ0UHJldmlvdXMgPSBjb250ZXh0LnByZXZpb3VzXG4gICAgdmFyIHN0YXJ0Q3VycmVudENvbnN0cnVjdCA9IGNvbnRleHQuY3VycmVudENvbnN0cnVjdFxuICAgIHZhciBzdGFydEV2ZW50c0luZGV4ID0gY29udGV4dC5ldmVudHMubGVuZ3RoXG4gICAgdmFyIHN0YXJ0U3RhY2sgPSBBcnJheS5mcm9tKHN0YWNrKVxuICAgIHJldHVybiB7XG4gICAgICByZXN0b3JlOiByZXN0b3JlLFxuICAgICAgZnJvbTogc3RhcnRFdmVudHNJbmRleFxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc3RvcmUoKSB7XG4gICAgICBwb2ludCA9IHN0YXJ0UG9pbnRcbiAgICAgIGNvbnRleHQucHJldmlvdXMgPSBzdGFydFByZXZpb3VzXG4gICAgICBjb250ZXh0LmN1cnJlbnRDb25zdHJ1Y3QgPSBzdGFydEN1cnJlbnRDb25zdHJ1Y3RcbiAgICAgIGNvbnRleHQuZXZlbnRzLmxlbmd0aCA9IHN0YXJ0RXZlbnRzSW5kZXhcbiAgICAgIHN0YWNrID0gc3RhcnRTdGFja1xuICAgICAgYWNjb3VudEZvclBvdGVudGlhbFNraXAoKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFjY291bnRGb3JQb3RlbnRpYWxTa2lwKCkge1xuICAgIGlmIChwb2ludC5saW5lIGluIGNvbHVtblN0YXJ0ICYmIHBvaW50LmNvbHVtbiA8IDIpIHtcbiAgICAgIHBvaW50LmNvbHVtbiA9IGNvbHVtblN0YXJ0W3BvaW50LmxpbmVdXG4gICAgICBwb2ludC5vZmZzZXQgKz0gY29sdW1uU3RhcnRbcG9pbnQubGluZV0gLSAxXG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlVG9rZW5pemVyXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbmZ1bmN0aW9uIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZSkge1xuICByZXR1cm4gY29kZSA8IDAgfHwgY29kZSA9PT0gMzJcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbi8vIFRoaXMgbW9kdWxlIGlzIGdlbmVyYXRlZCBieSBgc2NyaXB0L2AuXG4vL1xuLy8gQ29tbW9uTWFyayBoYW5kbGVzIGF0dGVudGlvbiAoZW1waGFzaXMsIHN0cm9uZykgbWFya2VycyBiYXNlZCBvbiB3aGF0IGNvbWVzXG4vLyBiZWZvcmUgb3IgYWZ0ZXIgdGhlbS5cbi8vIE9uZSBzdWNoIGRpZmZlcmVuY2UgaXMgaWYgdGhvc2UgY2hhcmFjdGVycyBhcmUgVW5pY29kZSBwdW5jdHVhdGlvbi5cbi8vIFRoaXMgc2NyaXB0IGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBVbmljb2RlIGRhdGEuXG52YXIgdW5pY29kZVB1bmN0dWF0aW9uID0gL1shLVxcLzotQFxcWy1gXFx7LX5cXHhBMVxceEE3XFx4QUJcXHhCNlxceEI3XFx4QkJcXHhCRlxcdTAzN0VcXHUwMzg3XFx1MDU1QS1cXHUwNTVGXFx1MDU4OVxcdTA1OEFcXHUwNUJFXFx1MDVDMFxcdTA1QzNcXHUwNUM2XFx1MDVGM1xcdTA1RjRcXHUwNjA5XFx1MDYwQVxcdTA2MENcXHUwNjBEXFx1MDYxQlxcdTA2MUVcXHUwNjFGXFx1MDY2QS1cXHUwNjZEXFx1MDZENFxcdTA3MDAtXFx1MDcwRFxcdTA3RjctXFx1MDdGOVxcdTA4MzAtXFx1MDgzRVxcdTA4NUVcXHUwOTY0XFx1MDk2NVxcdTA5NzBcXHUwOUZEXFx1MEE3NlxcdTBBRjBcXHUwQzc3XFx1MEM4NFxcdTBERjRcXHUwRTRGXFx1MEU1QVxcdTBFNUJcXHUwRjA0LVxcdTBGMTJcXHUwRjE0XFx1MEYzQS1cXHUwRjNEXFx1MEY4NVxcdTBGRDAtXFx1MEZENFxcdTBGRDlcXHUwRkRBXFx1MTA0QS1cXHUxMDRGXFx1MTBGQlxcdTEzNjAtXFx1MTM2OFxcdTE0MDBcXHUxNjZFXFx1MTY5QlxcdTE2OUNcXHUxNkVCLVxcdTE2RURcXHUxNzM1XFx1MTczNlxcdTE3RDQtXFx1MTdENlxcdTE3RDgtXFx1MTdEQVxcdTE4MDAtXFx1MTgwQVxcdTE5NDRcXHUxOTQ1XFx1MUExRVxcdTFBMUZcXHUxQUEwLVxcdTFBQTZcXHUxQUE4LVxcdTFBQURcXHUxQjVBLVxcdTFCNjBcXHUxQkZDLVxcdTFCRkZcXHUxQzNCLVxcdTFDM0ZcXHUxQzdFXFx1MUM3RlxcdTFDQzAtXFx1MUNDN1xcdTFDRDNcXHUyMDEwLVxcdTIwMjdcXHUyMDMwLVxcdTIwNDNcXHUyMDQ1LVxcdTIwNTFcXHUyMDUzLVxcdTIwNUVcXHUyMDdEXFx1MjA3RVxcdTIwOERcXHUyMDhFXFx1MjMwOC1cXHUyMzBCXFx1MjMyOVxcdTIzMkFcXHUyNzY4LVxcdTI3NzVcXHUyN0M1XFx1MjdDNlxcdTI3RTYtXFx1MjdFRlxcdTI5ODMtXFx1Mjk5OFxcdTI5RDgtXFx1MjlEQlxcdTI5RkNcXHUyOUZEXFx1MkNGOS1cXHUyQ0ZDXFx1MkNGRVxcdTJDRkZcXHUyRDcwXFx1MkUwMC1cXHUyRTJFXFx1MkUzMC1cXHUyRTRGXFx1MkU1MlxcdTMwMDEtXFx1MzAwM1xcdTMwMDgtXFx1MzAxMVxcdTMwMTQtXFx1MzAxRlxcdTMwMzBcXHUzMDNEXFx1MzBBMFxcdTMwRkJcXHVBNEZFXFx1QTRGRlxcdUE2MEQtXFx1QTYwRlxcdUE2NzNcXHVBNjdFXFx1QTZGMi1cXHVBNkY3XFx1QTg3NC1cXHVBODc3XFx1QThDRVxcdUE4Q0ZcXHVBOEY4LVxcdUE4RkFcXHVBOEZDXFx1QTkyRVxcdUE5MkZcXHVBOTVGXFx1QTlDMS1cXHVBOUNEXFx1QTlERVxcdUE5REZcXHVBQTVDLVxcdUFBNUZcXHVBQURFXFx1QUFERlxcdUFBRjBcXHVBQUYxXFx1QUJFQlxcdUZEM0VcXHVGRDNGXFx1RkUxMC1cXHVGRTE5XFx1RkUzMC1cXHVGRTUyXFx1RkU1NC1cXHVGRTYxXFx1RkU2M1xcdUZFNjhcXHVGRTZBXFx1RkU2QlxcdUZGMDEtXFx1RkYwM1xcdUZGMDUtXFx1RkYwQVxcdUZGMEMtXFx1RkYwRlxcdUZGMUFcXHVGRjFCXFx1RkYxRlxcdUZGMjBcXHVGRjNCLVxcdUZGM0RcXHVGRjNGXFx1RkY1QlxcdUZGNURcXHVGRjVGLVxcdUZGNjVdL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHVuaWNvZGVQdW5jdHVhdGlvblxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgZnJvbUNoYXJDb2RlID0gcmVxdWlyZSgnLi4vY29uc3RhbnQvZnJvbS1jaGFyLWNvZGUuanMnKVxuXG5mdW5jdGlvbiByZWdleENoZWNrKHJlZ2V4KSB7XG4gIHJldHVybiBjaGVja1xuXG4gIGZ1bmN0aW9uIGNoZWNrKGNvZGUpIHtcbiAgICByZXR1cm4gcmVnZXgudGVzdChmcm9tQ2hhckNvZGUoY29kZSkpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWdleENoZWNrXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciB1bmljb2RlUHVuY3R1YXRpb25SZWdleCA9IHJlcXVpcmUoJy4uL2NvbnN0YW50L3VuaWNvZGUtcHVuY3R1YXRpb24tcmVnZXguanMnKVxudmFyIHJlZ2V4Q2hlY2sgPSByZXF1aXJlKCcuLi91dGlsL3JlZ2V4LWNoZWNrLmpzJylcblxuLy8gSW4gZmFjdCBhZGRzIHRvIHRoZSBidW5kbGUgc2l6ZS5cblxudmFyIHVuaWNvZGVQdW5jdHVhdGlvbiA9IHJlZ2V4Q2hlY2sodW5pY29kZVB1bmN0dWF0aW9uUmVnZXgpXG5cbm1vZHVsZS5leHBvcnRzID0gdW5pY29kZVB1bmN0dWF0aW9uXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciByZWdleENoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9yZWdleC1jaGVjay5qcycpXG5cbnZhciB1bmljb2RlV2hpdGVzcGFjZSA9IHJlZ2V4Q2hlY2soL1xccy8pXG5cbm1vZHVsZS5leHBvcnRzID0gdW5pY29kZVdoaXRlc3BhY2VcbiIsICIndXNlIHN0cmljdCdcblxudmFyIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmctb3Itc3BhY2UuanMnKVxudmFyIHVuaWNvZGVQdW5jdHVhdGlvbiA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci91bmljb2RlLXB1bmN0dWF0aW9uLmpzJylcbnZhciB1bmljb2RlV2hpdGVzcGFjZSA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci91bmljb2RlLXdoaXRlc3BhY2UuanMnKVxuXG4vLyBDbGFzc2lmeSB3aGV0aGVyIGEgY2hhcmFjdGVyIGlzIHVuaWNvZGUgd2hpdGVzcGFjZSwgdW5pY29kZSBwdW5jdHVhdGlvbiwgb3Jcbi8vIGFueXRoaW5nIGVsc2UuXG4vLyBVc2VkIGZvciBhdHRlbnRpb24gKGVtcGhhc2lzLCBzdHJvbmcpLCB3aG9zZSBzZXF1ZW5jZXMgY2FuIG9wZW4gb3IgY2xvc2Vcbi8vIGJhc2VkIG9uIHRoZSBjbGFzcyBvZiBzdXJyb3VuZGluZyBjaGFyYWN0ZXJzLlxuZnVuY3Rpb24gY2xhc3NpZnlDaGFyYWN0ZXIoY29kZSkge1xuICBpZiAoXG4gICAgY29kZSA9PT0gbnVsbCB8fFxuICAgIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZSkgfHxcbiAgICB1bmljb2RlV2hpdGVzcGFjZShjb2RlKVxuICApIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgaWYgKHVuaWNvZGVQdW5jdHVhdGlvbihjb2RlKSkge1xuICAgIHJldHVybiAyXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzc2lmeUNoYXJhY3RlclxuIiwgIid1c2Ugc3RyaWN0J1xuXG4vLyBjaHVua3MgKHJlcGxhY2VtZW50IGNoYXJhY3RlcnMsIHRhYnMsIG9yIGxpbmUgZW5kaW5ncykuXG5cbmZ1bmN0aW9uIG1vdmVQb2ludChwb2ludCwgb2Zmc2V0KSB7XG4gIHBvaW50LmNvbHVtbiArPSBvZmZzZXRcbiAgcG9pbnQub2Zmc2V0ICs9IG9mZnNldFxuICBwb2ludC5fYnVmZmVySW5kZXggKz0gb2Zmc2V0XG4gIHJldHVybiBwb2ludFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1vdmVQb2ludFxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgY2h1bmtlZFB1c2ggPSByZXF1aXJlKCcuLi91dGlsL2NodW5rZWQtcHVzaC5qcycpXG52YXIgY2h1bmtlZFNwbGljZSA9IHJlcXVpcmUoJy4uL3V0aWwvY2h1bmtlZC1zcGxpY2UuanMnKVxudmFyIGNsYXNzaWZ5Q2hhcmFjdGVyID0gcmVxdWlyZSgnLi4vdXRpbC9jbGFzc2lmeS1jaGFyYWN0ZXIuanMnKVxudmFyIG1vdmVQb2ludCA9IHJlcXVpcmUoJy4uL3V0aWwvbW92ZS1wb2ludC5qcycpXG52YXIgcmVzb2x2ZUFsbCA9IHJlcXVpcmUoJy4uL3V0aWwvcmVzb2x2ZS1hbGwuanMnKVxudmFyIHNoYWxsb3cgPSByZXF1aXJlKCcuLi91dGlsL3NoYWxsb3cuanMnKVxuXG52YXIgYXR0ZW50aW9uID0ge1xuICBuYW1lOiAnYXR0ZW50aW9uJyxcbiAgdG9rZW5pemU6IHRva2VuaXplQXR0ZW50aW9uLFxuICByZXNvbHZlQWxsOiByZXNvbHZlQWxsQXR0ZW50aW9uXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVBbGxBdHRlbnRpb24oZXZlbnRzLCBjb250ZXh0KSB7XG4gIHZhciBpbmRleCA9IC0xXG4gIHZhciBvcGVuXG4gIHZhciBncm91cFxuICB2YXIgdGV4dFxuICB2YXIgb3BlbmluZ1NlcXVlbmNlXG4gIHZhciBjbG9zaW5nU2VxdWVuY2VcbiAgdmFyIHVzZVxuICB2YXIgbmV4dEV2ZW50c1xuICB2YXIgb2Zmc2V0IC8vIFdhbGsgdGhyb3VnaCBhbGwgZXZlbnRzLlxuICAvL1xuICAvLyBOb3RlOiBwZXJmb3JtYW5jZSBvZiB0aGlzIGlzIGZpbmUgb24gYW4gbWIgb2Ygbm9ybWFsIG1hcmtkb3duLCBidXQgaXRcdTIwMTlzXG4gIC8vIGEgYm90dGxlbmVjayBmb3IgbWFsaWNpb3VzIHN0dWZmLlxuXG4gIHdoaWxlICgrK2luZGV4IDwgZXZlbnRzLmxlbmd0aCkge1xuICAgIC8vIEZpbmQgYSB0b2tlbiB0aGF0IGNhbiBjbG9zZS5cbiAgICBpZiAoXG4gICAgICBldmVudHNbaW5kZXhdWzBdID09PSAnZW50ZXInICYmXG4gICAgICBldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdhdHRlbnRpb25TZXF1ZW5jZScgJiZcbiAgICAgIGV2ZW50c1tpbmRleF1bMV0uX2Nsb3NlXG4gICAgKSB7XG4gICAgICBvcGVuID0gaW5kZXggLy8gTm93IHdhbGsgYmFjayB0byBmaW5kIGFuIG9wZW5lci5cblxuICAgICAgd2hpbGUgKG9wZW4tLSkge1xuICAgICAgICAvLyBGaW5kIGEgdG9rZW4gdGhhdCBjYW4gb3BlbiB0aGUgY2xvc2VyLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgZXZlbnRzW29wZW5dWzBdID09PSAnZXhpdCcgJiZcbiAgICAgICAgICBldmVudHNbb3Blbl1bMV0udHlwZSA9PT0gJ2F0dGVudGlvblNlcXVlbmNlJyAmJlxuICAgICAgICAgIGV2ZW50c1tvcGVuXVsxXS5fb3BlbiAmJiAvLyBJZiB0aGUgbWFya2VycyBhcmUgdGhlIHNhbWU6XG4gICAgICAgICAgY29udGV4dC5zbGljZVNlcmlhbGl6ZShldmVudHNbb3Blbl1bMV0pLmNoYXJDb2RlQXQoMCkgPT09XG4gICAgICAgICAgICBjb250ZXh0LnNsaWNlU2VyaWFsaXplKGV2ZW50c1tpbmRleF1bMV0pLmNoYXJDb2RlQXQoMClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIG9wZW5pbmcgY2FuIGNsb3NlIG9yIHRoZSBjbG9zaW5nIGNhbiBvcGVuLFxuICAgICAgICAgIC8vIGFuZCB0aGUgY2xvc2Ugc2l6ZSAqaXMgbm90KiBhIG11bHRpcGxlIG9mIHRocmVlLFxuICAgICAgICAgIC8vIGJ1dCB0aGUgc3VtIG9mIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIHNpemUgKmlzKiBtdWx0aXBsZSBvZiB0aHJlZSxcbiAgICAgICAgICAvLyB0aGVuIGRvblx1MjAxOXQgbWF0Y2guXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGV2ZW50c1tvcGVuXVsxXS5fY2xvc2UgfHwgZXZlbnRzW2luZGV4XVsxXS5fb3BlbikgJiZcbiAgICAgICAgICAgIChldmVudHNbaW5kZXhdWzFdLmVuZC5vZmZzZXQgLSBldmVudHNbaW5kZXhdWzFdLnN0YXJ0Lm9mZnNldCkgJSAzICYmXG4gICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAoZXZlbnRzW29wZW5dWzFdLmVuZC5vZmZzZXQgLVxuICAgICAgICAgICAgICAgIGV2ZW50c1tvcGVuXVsxXS5zdGFydC5vZmZzZXQgK1xuICAgICAgICAgICAgICAgIGV2ZW50c1tpbmRleF1bMV0uZW5kLm9mZnNldCAtXG4gICAgICAgICAgICAgICAgZXZlbnRzW2luZGV4XVsxXS5zdGFydC5vZmZzZXQpICVcbiAgICAgICAgICAgICAgM1xuICAgICAgICAgICAgKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9IC8vIE51bWJlciBvZiBtYXJrZXJzIHRvIHVzZSBmcm9tIHRoZSBzZXF1ZW5jZS5cblxuICAgICAgICAgIHVzZSA9XG4gICAgICAgICAgICBldmVudHNbb3Blbl1bMV0uZW5kLm9mZnNldCAtIGV2ZW50c1tvcGVuXVsxXS5zdGFydC5vZmZzZXQgPiAxICYmXG4gICAgICAgICAgICBldmVudHNbaW5kZXhdWzFdLmVuZC5vZmZzZXQgLSBldmVudHNbaW5kZXhdWzFdLnN0YXJ0Lm9mZnNldCA+IDFcbiAgICAgICAgICAgICAgPyAyXG4gICAgICAgICAgICAgIDogMVxuICAgICAgICAgIG9wZW5pbmdTZXF1ZW5jZSA9IHtcbiAgICAgICAgICAgIHR5cGU6IHVzZSA+IDEgPyAnc3Ryb25nU2VxdWVuY2UnIDogJ2VtcGhhc2lzU2VxdWVuY2UnLFxuICAgICAgICAgICAgc3RhcnQ6IG1vdmVQb2ludChzaGFsbG93KGV2ZW50c1tvcGVuXVsxXS5lbmQpLCAtdXNlKSxcbiAgICAgICAgICAgIGVuZDogc2hhbGxvdyhldmVudHNbb3Blbl1bMV0uZW5kKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjbG9zaW5nU2VxdWVuY2UgPSB7XG4gICAgICAgICAgICB0eXBlOiB1c2UgPiAxID8gJ3N0cm9uZ1NlcXVlbmNlJyA6ICdlbXBoYXNpc1NlcXVlbmNlJyxcbiAgICAgICAgICAgIHN0YXJ0OiBzaGFsbG93KGV2ZW50c1tpbmRleF1bMV0uc3RhcnQpLFxuICAgICAgICAgICAgZW5kOiBtb3ZlUG9pbnQoc2hhbGxvdyhldmVudHNbaW5kZXhdWzFdLnN0YXJ0KSwgdXNlKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0ZXh0ID0ge1xuICAgICAgICAgICAgdHlwZTogdXNlID4gMSA/ICdzdHJvbmdUZXh0JyA6ICdlbXBoYXNpc1RleHQnLFxuICAgICAgICAgICAgc3RhcnQ6IHNoYWxsb3coZXZlbnRzW29wZW5dWzFdLmVuZCksXG4gICAgICAgICAgICBlbmQ6IHNoYWxsb3coZXZlbnRzW2luZGV4XVsxXS5zdGFydClcbiAgICAgICAgICB9XG4gICAgICAgICAgZ3JvdXAgPSB7XG4gICAgICAgICAgICB0eXBlOiB1c2UgPiAxID8gJ3N0cm9uZycgOiAnZW1waGFzaXMnLFxuICAgICAgICAgICAgc3RhcnQ6IHNoYWxsb3cob3BlbmluZ1NlcXVlbmNlLnN0YXJ0KSxcbiAgICAgICAgICAgIGVuZDogc2hhbGxvdyhjbG9zaW5nU2VxdWVuY2UuZW5kKVxuICAgICAgICAgIH1cbiAgICAgICAgICBldmVudHNbb3Blbl1bMV0uZW5kID0gc2hhbGxvdyhvcGVuaW5nU2VxdWVuY2Uuc3RhcnQpXG4gICAgICAgICAgZXZlbnRzW2luZGV4XVsxXS5zdGFydCA9IHNoYWxsb3coY2xvc2luZ1NlcXVlbmNlLmVuZClcbiAgICAgICAgICBuZXh0RXZlbnRzID0gW10gLy8gSWYgdGhlcmUgYXJlIG1vcmUgbWFya2VycyBpbiB0aGUgb3BlbmluZywgYWRkIHRoZW0gYmVmb3JlLlxuXG4gICAgICAgICAgaWYgKGV2ZW50c1tvcGVuXVsxXS5lbmQub2Zmc2V0IC0gZXZlbnRzW29wZW5dWzFdLnN0YXJ0Lm9mZnNldCkge1xuICAgICAgICAgICAgbmV4dEV2ZW50cyA9IGNodW5rZWRQdXNoKG5leHRFdmVudHMsIFtcbiAgICAgICAgICAgICAgWydlbnRlcicsIGV2ZW50c1tvcGVuXVsxXSwgY29udGV4dF0sXG4gICAgICAgICAgICAgIFsnZXhpdCcsIGV2ZW50c1tvcGVuXVsxXSwgY29udGV4dF1cbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgfSAvLyBPcGVuaW5nLlxuXG4gICAgICAgICAgbmV4dEV2ZW50cyA9IGNodW5rZWRQdXNoKG5leHRFdmVudHMsIFtcbiAgICAgICAgICAgIFsnZW50ZXInLCBncm91cCwgY29udGV4dF0sXG4gICAgICAgICAgICBbJ2VudGVyJywgb3BlbmluZ1NlcXVlbmNlLCBjb250ZXh0XSxcbiAgICAgICAgICAgIFsnZXhpdCcsIG9wZW5pbmdTZXF1ZW5jZSwgY29udGV4dF0sXG4gICAgICAgICAgICBbJ2VudGVyJywgdGV4dCwgY29udGV4dF1cbiAgICAgICAgICBdKSAvLyBCZXR3ZWVuLlxuXG4gICAgICAgICAgbmV4dEV2ZW50cyA9IGNodW5rZWRQdXNoKFxuICAgICAgICAgICAgbmV4dEV2ZW50cyxcbiAgICAgICAgICAgIHJlc29sdmVBbGwoXG4gICAgICAgICAgICAgIGNvbnRleHQucGFyc2VyLmNvbnN0cnVjdHMuaW5zaWRlU3Bhbi5udWxsLFxuICAgICAgICAgICAgICBldmVudHMuc2xpY2Uob3BlbiArIDEsIGluZGV4KSxcbiAgICAgICAgICAgICAgY29udGV4dFxuICAgICAgICAgICAgKVxuICAgICAgICAgICkgLy8gQ2xvc2luZy5cblxuICAgICAgICAgIG5leHRFdmVudHMgPSBjaHVua2VkUHVzaChuZXh0RXZlbnRzLCBbXG4gICAgICAgICAgICBbJ2V4aXQnLCB0ZXh0LCBjb250ZXh0XSxcbiAgICAgICAgICAgIFsnZW50ZXInLCBjbG9zaW5nU2VxdWVuY2UsIGNvbnRleHRdLFxuICAgICAgICAgICAgWydleGl0JywgY2xvc2luZ1NlcXVlbmNlLCBjb250ZXh0XSxcbiAgICAgICAgICAgIFsnZXhpdCcsIGdyb3VwLCBjb250ZXh0XVxuICAgICAgICAgIF0pIC8vIElmIHRoZXJlIGFyZSBtb3JlIG1hcmtlcnMgaW4gdGhlIGNsb3NpbmcsIGFkZCB0aGVtIGFmdGVyLlxuXG4gICAgICAgICAgaWYgKGV2ZW50c1tpbmRleF1bMV0uZW5kLm9mZnNldCAtIGV2ZW50c1tpbmRleF1bMV0uc3RhcnQub2Zmc2V0KSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAyXG4gICAgICAgICAgICBuZXh0RXZlbnRzID0gY2h1bmtlZFB1c2gobmV4dEV2ZW50cywgW1xuICAgICAgICAgICAgICBbJ2VudGVyJywgZXZlbnRzW2luZGV4XVsxXSwgY29udGV4dF0sXG4gICAgICAgICAgICAgIFsnZXhpdCcsIGV2ZW50c1tpbmRleF1bMV0sIGNvbnRleHRdXG4gICAgICAgICAgICBdKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAwXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2h1bmtlZFNwbGljZShldmVudHMsIG9wZW4gLSAxLCBpbmRleCAtIG9wZW4gKyAzLCBuZXh0RXZlbnRzKVxuICAgICAgICAgIGluZGV4ID0gb3BlbiArIG5leHRFdmVudHMubGVuZ3RoIC0gb2Zmc2V0IC0gMlxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gUmVtb3ZlIHJlbWFpbmluZyBzZXF1ZW5jZXMuXG5cbiAgaW5kZXggPSAtMVxuXG4gIHdoaWxlICgrK2luZGV4IDwgZXZlbnRzLmxlbmd0aCkge1xuICAgIGlmIChldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdhdHRlbnRpb25TZXF1ZW5jZScpIHtcbiAgICAgIGV2ZW50c1tpbmRleF1bMV0udHlwZSA9ICdkYXRhJ1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBldmVudHNcbn1cblxuZnVuY3Rpb24gdG9rZW5pemVBdHRlbnRpb24oZWZmZWN0cywgb2spIHtcbiAgdmFyIGJlZm9yZSA9IGNsYXNzaWZ5Q2hhcmFjdGVyKHRoaXMucHJldmlvdXMpXG4gIHZhciBtYXJrZXJcbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIGVmZmVjdHMuZW50ZXIoJ2F0dGVudGlvblNlcXVlbmNlJylcbiAgICBtYXJrZXIgPSBjb2RlXG4gICAgcmV0dXJuIHNlcXVlbmNlKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBzZXF1ZW5jZShjb2RlKSB7XG4gICAgdmFyIHRva2VuXG4gICAgdmFyIGFmdGVyXG4gICAgdmFyIG9wZW5cbiAgICB2YXIgY2xvc2VcblxuICAgIGlmIChjb2RlID09PSBtYXJrZXIpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHNlcXVlbmNlXG4gICAgfVxuXG4gICAgdG9rZW4gPSBlZmZlY3RzLmV4aXQoJ2F0dGVudGlvblNlcXVlbmNlJylcbiAgICBhZnRlciA9IGNsYXNzaWZ5Q2hhcmFjdGVyKGNvZGUpXG4gICAgb3BlbiA9ICFhZnRlciB8fCAoYWZ0ZXIgPT09IDIgJiYgYmVmb3JlKVxuICAgIGNsb3NlID0gIWJlZm9yZSB8fCAoYmVmb3JlID09PSAyICYmIGFmdGVyKVxuICAgIHRva2VuLl9vcGVuID0gbWFya2VyID09PSA0MiA/IG9wZW4gOiBvcGVuICYmIChiZWZvcmUgfHwgIWNsb3NlKVxuICAgIHRva2VuLl9jbG9zZSA9IG1hcmtlciA9PT0gNDIgPyBjbG9zZSA6IGNsb3NlICYmIChhZnRlciB8fCAhb3BlbilcbiAgICByZXR1cm4gb2soY29kZSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGF0dGVudGlvblxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgcmVnZXhDaGVjayA9IHJlcXVpcmUoJy4uL3V0aWwvcmVnZXgtY2hlY2suanMnKVxuXG52YXIgYXNjaWlBbHBoYSA9IHJlZ2V4Q2hlY2soL1tBLVphLXpdLylcblxubW9kdWxlLmV4cG9ydHMgPSBhc2NpaUFscGhhXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciByZWdleENoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9yZWdleC1jaGVjay5qcycpXG5cbnZhciBhc2NpaUFscGhhbnVtZXJpYyA9IHJlZ2V4Q2hlY2soL1tcXGRBLVphLXpdLylcblxubW9kdWxlLmV4cG9ydHMgPSBhc2NpaUFscGhhbnVtZXJpY1xuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgcmVnZXhDaGVjayA9IHJlcXVpcmUoJy4uL3V0aWwvcmVnZXgtY2hlY2suanMnKVxuXG52YXIgYXNjaWlBdGV4dCA9IHJlZ2V4Q2hlY2soL1sjLScqK1xcLS05PT9BLVpeLX5dLylcblxubW9kdWxlLmV4cG9ydHMgPSBhc2NpaUF0ZXh0XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbi8vIE5vdGU6IEVPRiBpcyBzZWVuIGFzIEFTQ0lJIGNvbnRyb2wgaGVyZSwgYmVjYXVzZSBgbnVsbCA8IDMyID09IHRydWVgLlxuZnVuY3Rpb24gYXNjaWlDb250cm9sKGNvZGUpIHtcbiAgcmV0dXJuIChcbiAgICAvLyBTcGVjaWFsIHdoaXRlc3BhY2UgY29kZXMgKHdoaWNoIGhhdmUgbmVnYXRpdmUgdmFsdWVzKSwgQzAgYW5kIENvbnRyb2xcbiAgICAvLyBjaGFyYWN0ZXIgREVMXG4gICAgY29kZSA8IDMyIHx8IGNvZGUgPT09IDEyN1xuICApXG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNjaWlDb250cm9sXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBhc2NpaUFscGhhID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL2FzY2lpLWFscGhhLmpzJylcbnZhciBhc2NpaUFscGhhbnVtZXJpYyA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9hc2NpaS1hbHBoYW51bWVyaWMuanMnKVxudmFyIGFzY2lpQXRleHQgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvYXNjaWktYXRleHQuanMnKVxudmFyIGFzY2lpQ29udHJvbCA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9hc2NpaS1jb250cm9sLmpzJylcblxudmFyIGF1dG9saW5rID0ge1xuICBuYW1lOiAnYXV0b2xpbmsnLFxuICB0b2tlbml6ZTogdG9rZW5pemVBdXRvbGlua1xufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUF1dG9saW5rKGVmZmVjdHMsIG9rLCBub2spIHtcbiAgdmFyIHNpemUgPSAxXG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKCdhdXRvbGluaycpXG4gICAgZWZmZWN0cy5lbnRlcignYXV0b2xpbmtNYXJrZXInKVxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIGVmZmVjdHMuZXhpdCgnYXV0b2xpbmtNYXJrZXInKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2F1dG9saW5rUHJvdG9jb2wnKVxuICAgIHJldHVybiBvcGVuXG4gIH1cblxuICBmdW5jdGlvbiBvcGVuKGNvZGUpIHtcbiAgICBpZiAoYXNjaWlBbHBoYShjb2RlKSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gc2NoZW1lT3JFbWFpbEF0ZXh0XG4gICAgfVxuXG4gICAgcmV0dXJuIGFzY2lpQXRleHQoY29kZSkgPyBlbWFpbEF0ZXh0KGNvZGUpIDogbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBzY2hlbWVPckVtYWlsQXRleHQoY29kZSkge1xuICAgIHJldHVybiBjb2RlID09PSA0MyB8fCBjb2RlID09PSA0NSB8fCBjb2RlID09PSA0NiB8fCBhc2NpaUFscGhhbnVtZXJpYyhjb2RlKVxuICAgICAgPyBzY2hlbWVJbnNpZGVPckVtYWlsQXRleHQoY29kZSlcbiAgICAgIDogZW1haWxBdGV4dChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gc2NoZW1lSW5zaWRlT3JFbWFpbEF0ZXh0KGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNTgpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHVybEluc2lkZVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChjb2RlID09PSA0MyB8fCBjb2RlID09PSA0NSB8fCBjb2RlID09PSA0NiB8fCBhc2NpaUFscGhhbnVtZXJpYyhjb2RlKSkgJiZcbiAgICAgIHNpemUrKyA8IDMyXG4gICAgKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBzY2hlbWVJbnNpZGVPckVtYWlsQXRleHRcbiAgICB9XG5cbiAgICByZXR1cm4gZW1haWxBdGV4dChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gdXJsSW5zaWRlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNjIpIHtcbiAgICAgIGVmZmVjdHMuZXhpdCgnYXV0b2xpbmtQcm90b2NvbCcpXG4gICAgICByZXR1cm4gZW5kKGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IDMyIHx8IGNvZGUgPT09IDYwIHx8IGFzY2lpQ29udHJvbChjb2RlKSkge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiB1cmxJbnNpZGVcbiAgfVxuXG4gIGZ1bmN0aW9uIGVtYWlsQXRleHQoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA2NCkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBzaXplID0gMFxuICAgICAgcmV0dXJuIGVtYWlsQXRTaWduT3JEb3RcbiAgICB9XG5cbiAgICBpZiAoYXNjaWlBdGV4dChjb2RlKSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gZW1haWxBdGV4dFxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGVtYWlsQXRTaWduT3JEb3QoY29kZSkge1xuICAgIHJldHVybiBhc2NpaUFscGhhbnVtZXJpYyhjb2RlKSA/IGVtYWlsTGFiZWwoY29kZSkgOiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGVtYWlsTGFiZWwoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA0Nikge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBzaXplID0gMFxuICAgICAgcmV0dXJuIGVtYWlsQXRTaWduT3JEb3RcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gNjIpIHtcbiAgICAgIC8vIEV4aXQsIHRoZW4gY2hhbmdlIHRoZSB0eXBlLlxuICAgICAgZWZmZWN0cy5leGl0KCdhdXRvbGlua1Byb3RvY29sJykudHlwZSA9ICdhdXRvbGlua0VtYWlsJ1xuICAgICAgcmV0dXJuIGVuZChjb2RlKVxuICAgIH1cblxuICAgIHJldHVybiBlbWFpbFZhbHVlKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBlbWFpbFZhbHVlKGNvZGUpIHtcbiAgICBpZiAoKGNvZGUgPT09IDQ1IHx8IGFzY2lpQWxwaGFudW1lcmljKGNvZGUpKSAmJiBzaXplKysgPCA2Mykge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gY29kZSA9PT0gNDUgPyBlbWFpbFZhbHVlIDogZW1haWxMYWJlbFxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuZChjb2RlKSB7XG4gICAgZWZmZWN0cy5lbnRlcignYXV0b2xpbmtNYXJrZXInKVxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIGVmZmVjdHMuZXhpdCgnYXV0b2xpbmtNYXJrZXInKVxuICAgIGVmZmVjdHMuZXhpdCgnYXV0b2xpbmsnKVxuICAgIHJldHVybiBva1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXV0b2xpbmtcbiIsICIndXNlIHN0cmljdCdcblxudmFyIG1hcmtkb3duU3BhY2UgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tc3BhY2UuanMnKVxudmFyIGZhY3RvcnlTcGFjZSA9IHJlcXVpcmUoJy4vZmFjdG9yeS1zcGFjZS5qcycpXG5cbnZhciBibG9ja1F1b3RlID0ge1xuICBuYW1lOiAnYmxvY2tRdW90ZScsXG4gIHRva2VuaXplOiB0b2tlbml6ZUJsb2NrUXVvdGVTdGFydCxcbiAgY29udGludWF0aW9uOiB7XG4gICAgdG9rZW5pemU6IHRva2VuaXplQmxvY2tRdW90ZUNvbnRpbnVhdGlvblxuICB9LFxuICBleGl0OiBleGl0XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplQmxvY2tRdW90ZVN0YXJ0KGVmZmVjdHMsIG9rLCBub2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNjIpIHtcbiAgICAgIGlmICghc2VsZi5jb250YWluZXJTdGF0ZS5vcGVuKSB7XG4gICAgICAgIGVmZmVjdHMuZW50ZXIoJ2Jsb2NrUXVvdGUnLCB7XG4gICAgICAgICAgX2NvbnRhaW5lcjogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgICBzZWxmLmNvbnRhaW5lclN0YXRlLm9wZW4gPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2Jsb2NrUXVvdGVQcmVmaXgnKVxuICAgICAgZWZmZWN0cy5lbnRlcignYmxvY2tRdW90ZU1hcmtlcicpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdCgnYmxvY2tRdW90ZU1hcmtlcicpXG4gICAgICByZXR1cm4gYWZ0ZXJcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBhZnRlcihjb2RlKSB7XG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2Jsb2NrUXVvdGVQcmVmaXhXaGl0ZXNwYWNlJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgZWZmZWN0cy5leGl0KCdibG9ja1F1b3RlUHJlZml4V2hpdGVzcGFjZScpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2Jsb2NrUXVvdGVQcmVmaXgnKVxuICAgICAgcmV0dXJuIG9rXG4gICAgfVxuXG4gICAgZWZmZWN0cy5leGl0KCdibG9ja1F1b3RlUHJlZml4JylcbiAgICByZXR1cm4gb2soY29kZSlcbiAgfVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUJsb2NrUXVvdGVDb250aW51YXRpb24oZWZmZWN0cywgb2ssIG5vaykge1xuICByZXR1cm4gZmFjdG9yeVNwYWNlKFxuICAgIGVmZmVjdHMsXG4gICAgZWZmZWN0cy5hdHRlbXB0KGJsb2NrUXVvdGUsIG9rLCBub2spLFxuICAgICdsaW5lUHJlZml4JyxcbiAgICB0aGlzLnBhcnNlci5jb25zdHJ1Y3RzLmRpc2FibGUubnVsbC5pbmRleE9mKCdjb2RlSW5kZW50ZWQnKSA+IC0xXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiA0XG4gIClcbn1cblxuZnVuY3Rpb24gZXhpdChlZmZlY3RzKSB7XG4gIGVmZmVjdHMuZXhpdCgnYmxvY2tRdW90ZScpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmxvY2tRdW90ZVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgcmVnZXhDaGVjayA9IHJlcXVpcmUoJy4uL3V0aWwvcmVnZXgtY2hlY2suanMnKVxuXG52YXIgYXNjaWlQdW5jdHVhdGlvbiA9IHJlZ2V4Q2hlY2soL1shLS86LUBbLWB7LX5dLylcblxubW9kdWxlLmV4cG9ydHMgPSBhc2NpaVB1bmN0dWF0aW9uXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBhc2NpaVB1bmN0dWF0aW9uID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL2FzY2lpLXB1bmN0dWF0aW9uLmpzJylcblxudmFyIGNoYXJhY3RlckVzY2FwZSA9IHtcbiAgbmFtZTogJ2NoYXJhY3RlckVzY2FwZScsXG4gIHRva2VuaXplOiB0b2tlbml6ZUNoYXJhY3RlckVzY2FwZVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUNoYXJhY3RlckVzY2FwZShlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKCdjaGFyYWN0ZXJFc2NhcGUnKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2VzY2FwZU1hcmtlcicpXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgZWZmZWN0cy5leGl0KCdlc2NhcGVNYXJrZXInKVxuICAgIHJldHVybiBvcGVuXG4gIH1cblxuICBmdW5jdGlvbiBvcGVuKGNvZGUpIHtcbiAgICBpZiAoYXNjaWlQdW5jdHVhdGlvbihjb2RlKSkge1xuICAgICAgZWZmZWN0cy5lbnRlcignY2hhcmFjdGVyRXNjYXBlVmFsdWUnKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2NoYXJhY3RlckVzY2FwZVZhbHVlJylcbiAgICAgIGVmZmVjdHMuZXhpdCgnY2hhcmFjdGVyRXNjYXBlJylcbiAgICAgIHJldHVybiBva1xuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNoYXJhY3RlckVzY2FwZVxuIiwgIid1c2Ugc3RyaWN0J1xuXG4vKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cblxudmFyIGVsXG5cbnZhciBzZW1pY29sb24gPSA1OSAvLyAgJzsnXG5cbm1vZHVsZS5leHBvcnRzID0gZGVjb2RlRW50aXR5XG5cbmZ1bmN0aW9uIGRlY29kZUVudGl0eShjaGFyYWN0ZXJzKSB7XG4gIHZhciBlbnRpdHkgPSAnJicgKyBjaGFyYWN0ZXJzICsgJzsnXG4gIHZhciBjaGFyXG5cbiAgZWwgPSBlbCB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJylcbiAgZWwuaW5uZXJIVE1MID0gZW50aXR5XG4gIGNoYXIgPSBlbC50ZXh0Q29udGVudFxuXG4gIC8vIFNvbWUgZW50aXRpZXMgZG8gbm90IHJlcXVpcmUgdGhlIGNsb3Npbmcgc2VtaWNvbG9uIChgJm5vdGAgLSBmb3IgaW5zdGFuY2UpLFxuICAvLyB3aGljaCBsZWFkcyB0byBzaXR1YXRpb25zIHdoZXJlIHBhcnNpbmcgdGhlIGFzc3VtZWQgZW50aXR5IG9mICZub3RpdDsgd2lsbFxuICAvLyByZXN1bHQgaW4gdGhlIHN0cmluZyBgXHUwMEFDaXQ7YC4gIFdoZW4gd2UgZW5jb3VudGVyIGEgdHJhaWxpbmcgc2VtaWNvbG9uIGFmdGVyXG4gIC8vIHBhcnNpbmcgYW5kIHRoZSBlbnRpdHkgdG8gZGVjb2RlIHdhcyBub3QgYSBzZW1pY29sb24gKGAmc2VtaTtgKSwgd2UgY2FuXG4gIC8vIGFzc3VtZSB0aGF0IHRoZSBtYXRjaGluZyB3YXMgaW5jb21wbGV0ZVxuICBpZiAoY2hhci5jaGFyQ29kZUF0KGNoYXIubGVuZ3RoIC0gMSkgPT09IHNlbWljb2xvbiAmJiBjaGFyYWN0ZXJzICE9PSAnc2VtaScpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIElmIHRoZSBkZWNvZGVkIHN0cmluZyBpcyBlcXVhbCB0byB0aGUgaW5wdXQsIHRoZSBlbnRpdHkgd2FzIG5vdCB2YWxpZFxuICByZXR1cm4gY2hhciA9PT0gZW50aXR5ID8gZmFsc2UgOiBjaGFyXG59XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciByZWdleENoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9yZWdleC1jaGVjay5qcycpXG5cbnZhciBhc2NpaURpZ2l0ID0gcmVnZXhDaGVjaygvXFxkLylcblxubW9kdWxlLmV4cG9ydHMgPSBhc2NpaURpZ2l0XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciByZWdleENoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9yZWdleC1jaGVjay5qcycpXG5cbnZhciBhc2NpaUhleERpZ2l0ID0gcmVnZXhDaGVjaygvW1xcZEEtRmEtZl0vKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzY2lpSGV4RGlnaXRcbiIsICIndXNlIHN0cmljdCdcblxudmFyIGRlY29kZUVudGl0eSA9IHJlcXVpcmUoJ3BhcnNlLWVudGl0aWVzL2RlY29kZS1lbnRpdHkuanMnKVxudmFyIGFzY2lpQWxwaGFudW1lcmljID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL2FzY2lpLWFscGhhbnVtZXJpYy5qcycpXG52YXIgYXNjaWlEaWdpdCA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9hc2NpaS1kaWdpdC5qcycpXG52YXIgYXNjaWlIZXhEaWdpdCA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9hc2NpaS1oZXgtZGlnaXQuanMnKVxuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHRMZWdhY3koZSkge1xuICByZXR1cm4gZSAmJiB0eXBlb2YgZSA9PT0gJ29iamVjdCcgJiYgJ2RlZmF1bHQnIGluIGUgPyBlIDoge2RlZmF1bHQ6IGV9XG59XG5cbnZhciBkZWNvZGVFbnRpdHlfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovIF9pbnRlcm9wRGVmYXVsdExlZ2FjeShkZWNvZGVFbnRpdHkpXG5cbnZhciBjaGFyYWN0ZXJSZWZlcmVuY2UgPSB7XG4gIG5hbWU6ICdjaGFyYWN0ZXJSZWZlcmVuY2UnLFxuICB0b2tlbml6ZTogdG9rZW5pemVDaGFyYWN0ZXJSZWZlcmVuY2Vcbn1cblxuZnVuY3Rpb24gdG9rZW5pemVDaGFyYWN0ZXJSZWZlcmVuY2UoZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIHNpemUgPSAwXG4gIHZhciBtYXhcbiAgdmFyIHRlc3RcbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIGVmZmVjdHMuZW50ZXIoJ2NoYXJhY3RlclJlZmVyZW5jZScpXG4gICAgZWZmZWN0cy5lbnRlcignY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VyJylcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBlZmZlY3RzLmV4aXQoJ2NoYXJhY3RlclJlZmVyZW5jZU1hcmtlcicpXG4gICAgcmV0dXJuIG9wZW5cbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW4oY29kZSkge1xuICAgIGlmIChjb2RlID09PSAzNSkge1xuICAgICAgZWZmZWN0cy5lbnRlcignY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VyTnVtZXJpYycpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdCgnY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VyTnVtZXJpYycpXG4gICAgICByZXR1cm4gbnVtZXJpY1xuICAgIH1cblxuICAgIGVmZmVjdHMuZW50ZXIoJ2NoYXJhY3RlclJlZmVyZW5jZVZhbHVlJylcbiAgICBtYXggPSAzMVxuICAgIHRlc3QgPSBhc2NpaUFscGhhbnVtZXJpY1xuICAgIHJldHVybiB2YWx1ZShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gbnVtZXJpYyhjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDg4IHx8IGNvZGUgPT09IDEyMCkge1xuICAgICAgZWZmZWN0cy5lbnRlcignY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VySGV4YWRlY2ltYWwnKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2NoYXJhY3RlclJlZmVyZW5jZU1hcmtlckhleGFkZWNpbWFsJylcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2NoYXJhY3RlclJlZmVyZW5jZVZhbHVlJylcbiAgICAgIG1heCA9IDZcbiAgICAgIHRlc3QgPSBhc2NpaUhleERpZ2l0XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICBlZmZlY3RzLmVudGVyKCdjaGFyYWN0ZXJSZWZlcmVuY2VWYWx1ZScpXG4gICAgbWF4ID0gN1xuICAgIHRlc3QgPSBhc2NpaURpZ2l0XG4gICAgcmV0dXJuIHZhbHVlKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiB2YWx1ZShjb2RlKSB7XG4gICAgdmFyIHRva2VuXG5cbiAgICBpZiAoY29kZSA9PT0gNTkgJiYgc2l6ZSkge1xuICAgICAgdG9rZW4gPSBlZmZlY3RzLmV4aXQoJ2NoYXJhY3RlclJlZmVyZW5jZVZhbHVlJylcblxuICAgICAgaWYgKFxuICAgICAgICB0ZXN0ID09PSBhc2NpaUFscGhhbnVtZXJpYyAmJlxuICAgICAgICAhZGVjb2RlRW50aXR5X19kZWZhdWx0WydkZWZhdWx0J10oc2VsZi5zbGljZVNlcmlhbGl6ZSh0b2tlbikpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgICAgfVxuXG4gICAgICBlZmZlY3RzLmVudGVyKCdjaGFyYWN0ZXJSZWZlcmVuY2VNYXJrZXInKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2NoYXJhY3RlclJlZmVyZW5jZU1hcmtlcicpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2NoYXJhY3RlclJlZmVyZW5jZScpXG4gICAgICByZXR1cm4gb2tcbiAgICB9XG5cbiAgICBpZiAodGVzdChjb2RlKSAmJiBzaXplKysgPCBtYXgpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2hhcmFjdGVyUmVmZXJlbmNlXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcuanMnKVxudmFyIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmctb3Itc3BhY2UuanMnKVxudmFyIHByZWZpeFNpemUgPSByZXF1aXJlKCcuLi91dGlsL3ByZWZpeC1zaXplLmpzJylcbnZhciBmYWN0b3J5U3BhY2UgPSByZXF1aXJlKCcuL2ZhY3Rvcnktc3BhY2UuanMnKVxuXG52YXIgY29kZUZlbmNlZCA9IHtcbiAgbmFtZTogJ2NvZGVGZW5jZWQnLFxuICB0b2tlbml6ZTogdG9rZW5pemVDb2RlRmVuY2VkLFxuICBjb25jcmV0ZTogdHJ1ZVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUNvZGVGZW5jZWQoZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIGNsb3NpbmdGZW5jZUNvbnN0cnVjdCA9IHtcbiAgICB0b2tlbml6ZTogdG9rZW5pemVDbG9zaW5nRmVuY2UsXG4gICAgcGFydGlhbDogdHJ1ZVxuICB9XG4gIHZhciBpbml0aWFsUHJlZml4ID0gcHJlZml4U2l6ZSh0aGlzLmV2ZW50cywgJ2xpbmVQcmVmaXgnKVxuICB2YXIgc2l6ZU9wZW4gPSAwXG4gIHZhciBtYXJrZXJcbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIGVmZmVjdHMuZW50ZXIoJ2NvZGVGZW5jZWQnKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2NvZGVGZW5jZWRGZW5jZScpXG4gICAgZWZmZWN0cy5lbnRlcignY29kZUZlbmNlZEZlbmNlU2VxdWVuY2UnKVxuICAgIG1hcmtlciA9IGNvZGVcbiAgICByZXR1cm4gc2VxdWVuY2VPcGVuKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBzZXF1ZW5jZU9wZW4oY29kZSkge1xuICAgIGlmIChjb2RlID09PSBtYXJrZXIpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgc2l6ZU9wZW4rK1xuICAgICAgcmV0dXJuIHNlcXVlbmNlT3BlblxuICAgIH1cblxuICAgIGVmZmVjdHMuZXhpdCgnY29kZUZlbmNlZEZlbmNlU2VxdWVuY2UnKVxuICAgIHJldHVybiBzaXplT3BlbiA8IDNcbiAgICAgID8gbm9rKGNvZGUpXG4gICAgICA6IGZhY3RvcnlTcGFjZShlZmZlY3RzLCBpbmZvT3BlbiwgJ3doaXRlc3BhY2UnKShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gaW5mb09wZW4oY29kZSkge1xuICAgIGlmIChjb2RlID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgcmV0dXJuIG9wZW5BZnRlcihjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuZW50ZXIoJ2NvZGVGZW5jZWRGZW5jZUluZm8nKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2NodW5rU3RyaW5nJywge1xuICAgICAgY29udGVudFR5cGU6ICdzdHJpbmcnXG4gICAgfSlcbiAgICByZXR1cm4gaW5mbyhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gaW5mbyhjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlKSkge1xuICAgICAgZWZmZWN0cy5leGl0KCdjaHVua1N0cmluZycpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2NvZGVGZW5jZWRGZW5jZUluZm8nKVxuICAgICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBpbmZvQWZ0ZXIsICd3aGl0ZXNwYWNlJykoY29kZSlcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gOTYgJiYgY29kZSA9PT0gbWFya2VyKSByZXR1cm4gbm9rKGNvZGUpXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgcmV0dXJuIGluZm9cbiAgfVxuXG4gIGZ1bmN0aW9uIGluZm9BZnRlcihjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSB7XG4gICAgICByZXR1cm4gb3BlbkFmdGVyKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcignY29kZUZlbmNlZEZlbmNlTWV0YScpXG4gICAgZWZmZWN0cy5lbnRlcignY2h1bmtTdHJpbmcnLCB7XG4gICAgICBjb250ZW50VHlwZTogJ3N0cmluZydcbiAgICB9KVxuICAgIHJldHVybiBtZXRhKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBtZXRhKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZXhpdCgnY2h1bmtTdHJpbmcnKVxuICAgICAgZWZmZWN0cy5leGl0KCdjb2RlRmVuY2VkRmVuY2VNZXRhJylcbiAgICAgIHJldHVybiBvcGVuQWZ0ZXIoY29kZSlcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gOTYgJiYgY29kZSA9PT0gbWFya2VyKSByZXR1cm4gbm9rKGNvZGUpXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgcmV0dXJuIG1ldGFcbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5BZnRlcihjb2RlKSB7XG4gICAgZWZmZWN0cy5leGl0KCdjb2RlRmVuY2VkRmVuY2UnKVxuICAgIHJldHVybiBzZWxmLmludGVycnVwdCA/IG9rKGNvZGUpIDogY29udGVudChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29udGVudChjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBhZnRlcihjb2RlKVxuICAgIH1cblxuICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2xpbmVFbmRpbmcnKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2xpbmVFbmRpbmcnKVxuICAgICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdChcbiAgICAgICAgY2xvc2luZ0ZlbmNlQ29uc3RydWN0LFxuICAgICAgICBhZnRlcixcbiAgICAgICAgaW5pdGlhbFByZWZpeFxuICAgICAgICAgID8gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGNvbnRlbnQsICdsaW5lUHJlZml4JywgaW5pdGlhbFByZWZpeCArIDEpXG4gICAgICAgICAgOiBjb250ZW50XG4gICAgICApXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcignY29kZUZsb3dWYWx1ZScpXG4gICAgcmV0dXJuIGNvbnRlbnRDb250aW51ZShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29udGVudENvbnRpbnVlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZXhpdCgnY29kZUZsb3dWYWx1ZScpXG4gICAgICByZXR1cm4gY29udGVudChjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBjb250ZW50Q29udGludWVcbiAgfVxuXG4gIGZ1bmN0aW9uIGFmdGVyKGNvZGUpIHtcbiAgICBlZmZlY3RzLmV4aXQoJ2NvZGVGZW5jZWQnKVxuICAgIHJldHVybiBvayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gdG9rZW5pemVDbG9zaW5nRmVuY2UoZWZmZWN0cywgb2ssIG5vaykge1xuICAgIHZhciBzaXplID0gMFxuICAgIHJldHVybiBmYWN0b3J5U3BhY2UoXG4gICAgICBlZmZlY3RzLFxuICAgICAgY2xvc2luZ1NlcXVlbmNlU3RhcnQsXG4gICAgICAnbGluZVByZWZpeCcsXG4gICAgICB0aGlzLnBhcnNlci5jb25zdHJ1Y3RzLmRpc2FibGUubnVsbC5pbmRleE9mKCdjb2RlSW5kZW50ZWQnKSA+IC0xXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogNFxuICAgIClcblxuICAgIGZ1bmN0aW9uIGNsb3NpbmdTZXF1ZW5jZVN0YXJ0KGNvZGUpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2NvZGVGZW5jZWRGZW5jZScpXG4gICAgICBlZmZlY3RzLmVudGVyKCdjb2RlRmVuY2VkRmVuY2VTZXF1ZW5jZScpXG4gICAgICByZXR1cm4gY2xvc2luZ1NlcXVlbmNlKGNvZGUpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvc2luZ1NlcXVlbmNlKGNvZGUpIHtcbiAgICAgIGlmIChjb2RlID09PSBtYXJrZXIpIHtcbiAgICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICAgIHNpemUrK1xuICAgICAgICByZXR1cm4gY2xvc2luZ1NlcXVlbmNlXG4gICAgICB9XG5cbiAgICAgIGlmIChzaXplIDwgc2l6ZU9wZW4pIHJldHVybiBub2soY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdCgnY29kZUZlbmNlZEZlbmNlU2VxdWVuY2UnKVxuICAgICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBjbG9zaW5nU2VxdWVuY2VFbmQsICd3aGl0ZXNwYWNlJykoY29kZSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbG9zaW5nU2VxdWVuY2VFbmQoY29kZSkge1xuICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSB7XG4gICAgICAgIGVmZmVjdHMuZXhpdCgnY29kZUZlbmNlZEZlbmNlJylcbiAgICAgICAgcmV0dXJuIG9rKGNvZGUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2soY29kZSlcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb2RlRmVuY2VkXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcuanMnKVxudmFyIGNodW5rZWRTcGxpY2UgPSByZXF1aXJlKCcuLi91dGlsL2NodW5rZWQtc3BsaWNlLmpzJylcbnZhciBwcmVmaXhTaXplID0gcmVxdWlyZSgnLi4vdXRpbC9wcmVmaXgtc2l6ZS5qcycpXG52YXIgZmFjdG9yeVNwYWNlID0gcmVxdWlyZSgnLi9mYWN0b3J5LXNwYWNlLmpzJylcblxudmFyIGNvZGVJbmRlbnRlZCA9IHtcbiAgbmFtZTogJ2NvZGVJbmRlbnRlZCcsXG4gIHRva2VuaXplOiB0b2tlbml6ZUNvZGVJbmRlbnRlZCxcbiAgcmVzb2x2ZTogcmVzb2x2ZUNvZGVJbmRlbnRlZFxufVxudmFyIGluZGVudGVkQ29udGVudENvbnN0cnVjdCA9IHtcbiAgdG9rZW5pemU6IHRva2VuaXplSW5kZW50ZWRDb250ZW50LFxuICBwYXJ0aWFsOiB0cnVlXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb2RlSW5kZW50ZWQoZXZlbnRzLCBjb250ZXh0KSB7XG4gIHZhciBjb2RlID0ge1xuICAgIHR5cGU6ICdjb2RlSW5kZW50ZWQnLFxuICAgIHN0YXJ0OiBldmVudHNbMF1bMV0uc3RhcnQsXG4gICAgZW5kOiBldmVudHNbZXZlbnRzLmxlbmd0aCAtIDFdWzFdLmVuZFxuICB9XG4gIGNodW5rZWRTcGxpY2UoZXZlbnRzLCAwLCAwLCBbWydlbnRlcicsIGNvZGUsIGNvbnRleHRdXSlcbiAgY2h1bmtlZFNwbGljZShldmVudHMsIGV2ZW50cy5sZW5ndGgsIDAsIFtbJ2V4aXQnLCBjb2RlLCBjb250ZXh0XV0pXG4gIHJldHVybiBldmVudHNcbn1cblxuZnVuY3Rpb24gdG9rZW5pemVDb2RlSW5kZW50ZWQoZWZmZWN0cywgb2ssIG5vaykge1xuICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KGluZGVudGVkQ29udGVudENvbnN0cnVjdCwgYWZ0ZXJQcmVmaXgsIG5vaylcblxuICBmdW5jdGlvbiBhZnRlclByZWZpeChjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBvayhjb2RlKVxuICAgIH1cblxuICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoaW5kZW50ZWRDb250ZW50Q29uc3RydWN0LCBhZnRlclByZWZpeCwgb2spKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcignY29kZUZsb3dWYWx1ZScpXG4gICAgcmV0dXJuIGNvbnRlbnQoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnRlbnQoY29kZSkge1xuICAgIGlmIChjb2RlID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgZWZmZWN0cy5leGl0KCdjb2RlRmxvd1ZhbHVlJylcbiAgICAgIHJldHVybiBhZnRlclByZWZpeChjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBjb250ZW50XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9rZW5pemVJbmRlbnRlZENvbnRlbnQoZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBhZnRlclByZWZpeCwgJ2xpbmVQcmVmaXgnLCA0ICsgMSlcblxuICBmdW5jdGlvbiBhZnRlclByZWZpeChjb2RlKSB7XG4gICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgZWZmZWN0cy5lbnRlcignbGluZUVuZGluZycpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdCgnbGluZUVuZGluZycpXG4gICAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGFmdGVyUHJlZml4LCAnbGluZVByZWZpeCcsIDQgKyAxKVxuICAgIH1cblxuICAgIHJldHVybiBwcmVmaXhTaXplKHNlbGYuZXZlbnRzLCAnbGluZVByZWZpeCcpIDwgNCA/IG5vayhjb2RlKSA6IG9rKGNvZGUpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb2RlSW5kZW50ZWRcbiIsICIndXNlIHN0cmljdCdcblxudmFyIG1hcmtkb3duTGluZUVuZGluZyA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9tYXJrZG93bi1saW5lLWVuZGluZy5qcycpXG5cbnZhciBjb2RlVGV4dCA9IHtcbiAgbmFtZTogJ2NvZGVUZXh0JyxcbiAgdG9rZW5pemU6IHRva2VuaXplQ29kZVRleHQsXG4gIHJlc29sdmU6IHJlc29sdmVDb2RlVGV4dCxcbiAgcHJldmlvdXM6IHByZXZpb3VzXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb2RlVGV4dChldmVudHMpIHtcbiAgdmFyIHRhaWxFeGl0SW5kZXggPSBldmVudHMubGVuZ3RoIC0gNFxuICB2YXIgaGVhZEVudGVySW5kZXggPSAzXG4gIHZhciBpbmRleFxuICB2YXIgZW50ZXIgLy8gSWYgd2Ugc3RhcnQgYW5kIGVuZCB3aXRoIGFuIEVPTCBvciBhIHNwYWNlLlxuXG4gIGlmIChcbiAgICAoZXZlbnRzW2hlYWRFbnRlckluZGV4XVsxXS50eXBlID09PSAnbGluZUVuZGluZycgfHxcbiAgICAgIGV2ZW50c1toZWFkRW50ZXJJbmRleF1bMV0udHlwZSA9PT0gJ3NwYWNlJykgJiZcbiAgICAoZXZlbnRzW3RhaWxFeGl0SW5kZXhdWzFdLnR5cGUgPT09ICdsaW5lRW5kaW5nJyB8fFxuICAgICAgZXZlbnRzW3RhaWxFeGl0SW5kZXhdWzFdLnR5cGUgPT09ICdzcGFjZScpXG4gICkge1xuICAgIGluZGV4ID0gaGVhZEVudGVySW5kZXggLy8gQW5kIHdlIGhhdmUgZGF0YS5cblxuICAgIHdoaWxlICgrK2luZGV4IDwgdGFpbEV4aXRJbmRleCkge1xuICAgICAgaWYgKGV2ZW50c1tpbmRleF1bMV0udHlwZSA9PT0gJ2NvZGVUZXh0RGF0YScpIHtcbiAgICAgICAgLy8gVGhlbiB3ZSBoYXZlIHBhZGRpbmcuXG4gICAgICAgIGV2ZW50c1t0YWlsRXhpdEluZGV4XVsxXS50eXBlID0gZXZlbnRzW2hlYWRFbnRlckluZGV4XVsxXS50eXBlID1cbiAgICAgICAgICAnY29kZVRleHRQYWRkaW5nJ1xuICAgICAgICBoZWFkRW50ZXJJbmRleCArPSAyXG4gICAgICAgIHRhaWxFeGl0SW5kZXggLT0gMlxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBNZXJnZSBhZGphY2VudCBzcGFjZXMgYW5kIGRhdGEuXG5cbiAgaW5kZXggPSBoZWFkRW50ZXJJbmRleCAtIDFcbiAgdGFpbEV4aXRJbmRleCsrXG5cbiAgd2hpbGUgKCsraW5kZXggPD0gdGFpbEV4aXRJbmRleCkge1xuICAgIGlmIChlbnRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoaW5kZXggIT09IHRhaWxFeGl0SW5kZXggJiYgZXZlbnRzW2luZGV4XVsxXS50eXBlICE9PSAnbGluZUVuZGluZycpIHtcbiAgICAgICAgZW50ZXIgPSBpbmRleFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBpbmRleCA9PT0gdGFpbEV4aXRJbmRleCB8fFxuICAgICAgZXZlbnRzW2luZGV4XVsxXS50eXBlID09PSAnbGluZUVuZGluZydcbiAgICApIHtcbiAgICAgIGV2ZW50c1tlbnRlcl1bMV0udHlwZSA9ICdjb2RlVGV4dERhdGEnXG5cbiAgICAgIGlmIChpbmRleCAhPT0gZW50ZXIgKyAyKSB7XG4gICAgICAgIGV2ZW50c1tlbnRlcl1bMV0uZW5kID0gZXZlbnRzW2luZGV4IC0gMV1bMV0uZW5kXG4gICAgICAgIGV2ZW50cy5zcGxpY2UoZW50ZXIgKyAyLCBpbmRleCAtIGVudGVyIC0gMilcbiAgICAgICAgdGFpbEV4aXRJbmRleCAtPSBpbmRleCAtIGVudGVyIC0gMlxuICAgICAgICBpbmRleCA9IGVudGVyICsgMlxuICAgICAgfVxuXG4gICAgICBlbnRlciA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBldmVudHNcbn1cblxuZnVuY3Rpb24gcHJldmlvdXMoY29kZSkge1xuICAvLyBJZiB0aGVyZSBpcyBhIHByZXZpb3VzIGNvZGUsIHRoZXJlIHdpbGwgYWx3YXlzIGJlIGEgdGFpbC5cbiAgcmV0dXJuIChcbiAgICBjb2RlICE9PSA5NiB8fFxuICAgIHRoaXMuZXZlbnRzW3RoaXMuZXZlbnRzLmxlbmd0aCAtIDFdWzFdLnR5cGUgPT09ICdjaGFyYWN0ZXJFc2NhcGUnXG4gIClcbn1cblxuZnVuY3Rpb24gdG9rZW5pemVDb2RlVGV4dChlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHZhciBzaXplT3BlbiA9IDBcbiAgdmFyIHNpemVcbiAgdmFyIHRva2VuXG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKCdjb2RlVGV4dCcpXG4gICAgZWZmZWN0cy5lbnRlcignY29kZVRleHRTZXF1ZW5jZScpXG4gICAgcmV0dXJuIG9wZW5pbmdTZXF1ZW5jZShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gb3BlbmluZ1NlcXVlbmNlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gOTYpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgc2l6ZU9wZW4rK1xuICAgICAgcmV0dXJuIG9wZW5pbmdTZXF1ZW5jZVxuICAgIH1cblxuICAgIGVmZmVjdHMuZXhpdCgnY29kZVRleHRTZXF1ZW5jZScpXG4gICAgcmV0dXJuIGdhcChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZ2FwKGNvZGUpIHtcbiAgICAvLyBFT0YuXG4gICAgaWYgKGNvZGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBub2soY29kZSlcbiAgICB9IC8vIENsb3NpbmcgZmVuY2U/XG4gICAgLy8gQ291bGQgYWxzbyBiZSBkYXRhLlxuXG4gICAgaWYgKGNvZGUgPT09IDk2KSB7XG4gICAgICB0b2tlbiA9IGVmZmVjdHMuZW50ZXIoJ2NvZGVUZXh0U2VxdWVuY2UnKVxuICAgICAgc2l6ZSA9IDBcbiAgICAgIHJldHVybiBjbG9zaW5nU2VxdWVuY2UoY29kZSlcbiAgICB9IC8vIFRhYnMgZG9uXHUyMDE5dCB3b3JrLCBhbmQgdmlydHVhbCBzcGFjZXMgZG9uXHUyMDE5dCBtYWtlIHNlbnNlLlxuXG4gICAgaWYgKGNvZGUgPT09IDMyKSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCdzcGFjZScpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdCgnc3BhY2UnKVxuICAgICAgcmV0dXJuIGdhcFxuICAgIH1cblxuICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2xpbmVFbmRpbmcnKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2xpbmVFbmRpbmcnKVxuICAgICAgcmV0dXJuIGdhcFxuICAgIH0gLy8gRGF0YS5cblxuICAgIGVmZmVjdHMuZW50ZXIoJ2NvZGVUZXh0RGF0YScpXG4gICAgcmV0dXJuIGRhdGEoY29kZSlcbiAgfSAvLyBJbiBjb2RlLlxuXG4gIGZ1bmN0aW9uIGRhdGEoY29kZSkge1xuICAgIGlmIChcbiAgICAgIGNvZGUgPT09IG51bGwgfHxcbiAgICAgIGNvZGUgPT09IDMyIHx8XG4gICAgICBjb2RlID09PSA5NiB8fFxuICAgICAgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpXG4gICAgKSB7XG4gICAgICBlZmZlY3RzLmV4aXQoJ2NvZGVUZXh0RGF0YScpXG4gICAgICByZXR1cm4gZ2FwKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgcmV0dXJuIGRhdGFcbiAgfSAvLyBDbG9zaW5nIGZlbmNlLlxuXG4gIGZ1bmN0aW9uIGNsb3NpbmdTZXF1ZW5jZShjb2RlKSB7XG4gICAgLy8gTW9yZS5cbiAgICBpZiAoY29kZSA9PT0gOTYpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgc2l6ZSsrXG4gICAgICByZXR1cm4gY2xvc2luZ1NlcXVlbmNlXG4gICAgfSAvLyBEb25lIVxuXG4gICAgaWYgKHNpemUgPT09IHNpemVPcGVuKSB7XG4gICAgICBlZmZlY3RzLmV4aXQoJ2NvZGVUZXh0U2VxdWVuY2UnKVxuICAgICAgZWZmZWN0cy5leGl0KCdjb2RlVGV4dCcpXG4gICAgICByZXR1cm4gb2soY29kZSlcbiAgICB9IC8vIE1vcmUgb3IgbGVzcyBhY2NlbnRzOiBtYXJrIGFzIGRhdGEuXG5cbiAgICB0b2tlbi50eXBlID0gJ2NvZGVUZXh0RGF0YSdcbiAgICByZXR1cm4gZGF0YShjb2RlKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29kZVRleHRcbiIsICIndXNlIHN0cmljdCdcblxudmFyIGFzY2lpQ29udHJvbCA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9hc2NpaS1jb250cm9sLmpzJylcbnZhciBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLW9yLXNwYWNlLmpzJylcbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcuanMnKVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXBhcmFtc1xuZnVuY3Rpb24gZGVzdGluYXRpb25GYWN0b3J5KFxuICBlZmZlY3RzLFxuICBvayxcbiAgbm9rLFxuICB0eXBlLFxuICBsaXRlcmFsVHlwZSxcbiAgbGl0ZXJhbE1hcmtlclR5cGUsXG4gIHJhd1R5cGUsXG4gIHN0cmluZ1R5cGUsXG4gIG1heFxuKSB7XG4gIHZhciBsaW1pdCA9IG1heCB8fCBJbmZpbml0eVxuICB2YXIgYmFsYW5jZSA9IDBcbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA2MCkge1xuICAgICAgZWZmZWN0cy5lbnRlcih0eXBlKVxuICAgICAgZWZmZWN0cy5lbnRlcihsaXRlcmFsVHlwZSlcbiAgICAgIGVmZmVjdHMuZW50ZXIobGl0ZXJhbE1hcmtlclR5cGUpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdChsaXRlcmFsTWFya2VyVHlwZSlcbiAgICAgIHJldHVybiBkZXN0aW5hdGlvbkVuY2xvc2VkQmVmb3JlXG4gICAgfVxuXG4gICAgaWYgKGFzY2lpQ29udHJvbChjb2RlKSB8fCBjb2RlID09PSA0MSkge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuZW50ZXIodHlwZSlcbiAgICBlZmZlY3RzLmVudGVyKHJhd1R5cGUpXG4gICAgZWZmZWN0cy5lbnRlcihzdHJpbmdUeXBlKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2NodW5rU3RyaW5nJywge1xuICAgICAgY29udGVudFR5cGU6ICdzdHJpbmcnXG4gICAgfSlcbiAgICByZXR1cm4gZGVzdGluYXRpb25SYXcoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3RpbmF0aW9uRW5jbG9zZWRCZWZvcmUoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA2Mikge1xuICAgICAgZWZmZWN0cy5lbnRlcihsaXRlcmFsTWFya2VyVHlwZSlcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgZWZmZWN0cy5leGl0KGxpdGVyYWxNYXJrZXJUeXBlKVxuICAgICAgZWZmZWN0cy5leGl0KGxpdGVyYWxUeXBlKVxuICAgICAgZWZmZWN0cy5leGl0KHR5cGUpXG4gICAgICByZXR1cm4gb2tcbiAgICB9XG5cbiAgICBlZmZlY3RzLmVudGVyKHN0cmluZ1R5cGUpXG4gICAgZWZmZWN0cy5lbnRlcignY2h1bmtTdHJpbmcnLCB7XG4gICAgICBjb250ZW50VHlwZTogJ3N0cmluZydcbiAgICB9KVxuICAgIHJldHVybiBkZXN0aW5hdGlvbkVuY2xvc2VkKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBkZXN0aW5hdGlvbkVuY2xvc2VkKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNjIpIHtcbiAgICAgIGVmZmVjdHMuZXhpdCgnY2h1bmtTdHJpbmcnKVxuICAgICAgZWZmZWN0cy5leGl0KHN0cmluZ1R5cGUpXG4gICAgICByZXR1cm4gZGVzdGluYXRpb25FbmNsb3NlZEJlZm9yZShjb2RlKVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IDYwIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBjb2RlID09PSA5MiA/IGRlc3RpbmF0aW9uRW5jbG9zZWRFc2NhcGUgOiBkZXN0aW5hdGlvbkVuY2xvc2VkXG4gIH1cblxuICBmdW5jdGlvbiBkZXN0aW5hdGlvbkVuY2xvc2VkRXNjYXBlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNjAgfHwgY29kZSA9PT0gNjIgfHwgY29kZSA9PT0gOTIpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uRW5jbG9zZWRcbiAgICB9XG5cbiAgICByZXR1cm4gZGVzdGluYXRpb25FbmNsb3NlZChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZGVzdGluYXRpb25SYXcoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA0MCkge1xuICAgICAgaWYgKCsrYmFsYW5jZSA+IGxpbWl0KSByZXR1cm4gbm9rKGNvZGUpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBkZXN0aW5hdGlvblJhd1xuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA0MSkge1xuICAgICAgaWYgKCFiYWxhbmNlLS0pIHtcbiAgICAgICAgZWZmZWN0cy5leGl0KCdjaHVua1N0cmluZycpXG4gICAgICAgIGVmZmVjdHMuZXhpdChzdHJpbmdUeXBlKVxuICAgICAgICBlZmZlY3RzLmV4aXQocmF3VHlwZSlcbiAgICAgICAgZWZmZWN0cy5leGl0KHR5cGUpXG4gICAgICAgIHJldHVybiBvayhjb2RlKVxuICAgICAgfVxuXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBkZXN0aW5hdGlvblJhd1xuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZSkpIHtcbiAgICAgIGlmIChiYWxhbmNlKSByZXR1cm4gbm9rKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2NodW5rU3RyaW5nJylcbiAgICAgIGVmZmVjdHMuZXhpdChzdHJpbmdUeXBlKVxuICAgICAgZWZmZWN0cy5leGl0KHJhd1R5cGUpXG4gICAgICBlZmZlY3RzLmV4aXQodHlwZSlcbiAgICAgIHJldHVybiBvayhjb2RlKVxuICAgIH1cblxuICAgIGlmIChhc2NpaUNvbnRyb2woY29kZSkpIHJldHVybiBub2soY29kZSlcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICByZXR1cm4gY29kZSA9PT0gOTIgPyBkZXN0aW5hdGlvblJhd0VzY2FwZSA6IGRlc3RpbmF0aW9uUmF3XG4gIH1cblxuICBmdW5jdGlvbiBkZXN0aW5hdGlvblJhd0VzY2FwZShjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDQwIHx8IGNvZGUgPT09IDQxIHx8IGNvZGUgPT09IDkyKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBkZXN0aW5hdGlvblJhd1xuICAgIH1cblxuICAgIHJldHVybiBkZXN0aW5hdGlvblJhdyhjb2RlKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVzdGluYXRpb25GYWN0b3J5XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcuanMnKVxudmFyIG1hcmtkb3duU3BhY2UgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tc3BhY2UuanMnKVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXBhcmFtc1xuZnVuY3Rpb24gbGFiZWxGYWN0b3J5KGVmZmVjdHMsIG9rLCBub2ssIHR5cGUsIG1hcmtlclR5cGUsIHN0cmluZ1R5cGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciBzaXplID0gMFxuICB2YXIgZGF0YVxuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgZWZmZWN0cy5lbnRlcih0eXBlKVxuICAgIGVmZmVjdHMuZW50ZXIobWFya2VyVHlwZSlcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBlZmZlY3RzLmV4aXQobWFya2VyVHlwZSlcbiAgICBlZmZlY3RzLmVudGVyKHN0cmluZ1R5cGUpXG4gICAgcmV0dXJuIGF0QnJlYWtcbiAgfVxuXG4gIGZ1bmN0aW9uIGF0QnJlYWsoY29kZSkge1xuICAgIGlmIChcbiAgICAgIGNvZGUgPT09IG51bGwgfHxcbiAgICAgIGNvZGUgPT09IDkxIHx8XG4gICAgICAoY29kZSA9PT0gOTMgJiYgIWRhdGEpIHx8XG4gICAgICAvKiBjOCBpZ25vcmUgbmV4dCAqL1xuICAgICAgKGNvZGUgPT09IDk0ICYmXG4gICAgICAgIC8qIGM4IGlnbm9yZSBuZXh0ICovXG4gICAgICAgICFzaXplICYmXG4gICAgICAgIC8qIGM4IGlnbm9yZSBuZXh0ICovXG4gICAgICAgICdfaGlkZGVuRm9vdG5vdGVTdXBwb3J0JyBpbiBzZWxmLnBhcnNlci5jb25zdHJ1Y3RzKSB8fFxuICAgICAgc2l6ZSA+IDk5OVxuICAgICkge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA5Mykge1xuICAgICAgZWZmZWN0cy5leGl0KHN0cmluZ1R5cGUpXG4gICAgICBlZmZlY3RzLmVudGVyKG1hcmtlclR5cGUpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdChtYXJrZXJUeXBlKVxuICAgICAgZWZmZWN0cy5leGl0KHR5cGUpXG4gICAgICByZXR1cm4gb2tcbiAgICB9XG5cbiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCdsaW5lRW5kaW5nJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgZWZmZWN0cy5leGl0KCdsaW5lRW5kaW5nJylcbiAgICAgIHJldHVybiBhdEJyZWFrXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcignY2h1bmtTdHJpbmcnLCB7XG4gICAgICBjb250ZW50VHlwZTogJ3N0cmluZydcbiAgICB9KVxuICAgIHJldHVybiBsYWJlbChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gbGFiZWwoY29kZSkge1xuICAgIGlmIChcbiAgICAgIGNvZGUgPT09IG51bGwgfHxcbiAgICAgIGNvZGUgPT09IDkxIHx8XG4gICAgICBjb2RlID09PSA5MyB8fFxuICAgICAgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpIHx8XG4gICAgICBzaXplKysgPiA5OTlcbiAgICApIHtcbiAgICAgIGVmZmVjdHMuZXhpdCgnY2h1bmtTdHJpbmcnKVxuICAgICAgcmV0dXJuIGF0QnJlYWsoY29kZSlcbiAgICB9XG5cbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBkYXRhID0gZGF0YSB8fCAhbWFya2Rvd25TcGFjZShjb2RlKVxuICAgIHJldHVybiBjb2RlID09PSA5MiA/IGxhYmVsRXNjYXBlIDogbGFiZWxcbiAgfVxuXG4gIGZ1bmN0aW9uIGxhYmVsRXNjYXBlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gOTEgfHwgY29kZSA9PT0gOTIgfHwgY29kZSA9PT0gOTMpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgc2l6ZSsrXG4gICAgICByZXR1cm4gbGFiZWxcbiAgICB9XG5cbiAgICByZXR1cm4gbGFiZWwoY29kZSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxhYmVsRmFjdG9yeVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgbWFya2Rvd25MaW5lRW5kaW5nID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLmpzJylcbnZhciBtYXJrZG93blNwYWNlID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLXNwYWNlLmpzJylcbnZhciBmYWN0b3J5U3BhY2UgPSByZXF1aXJlKCcuL2ZhY3Rvcnktc3BhY2UuanMnKVxuXG5mdW5jdGlvbiB3aGl0ZXNwYWNlRmFjdG9yeShlZmZlY3RzLCBvaykge1xuICB2YXIgc2VlblxuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgZWZmZWN0cy5lbnRlcignbGluZUVuZGluZycpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdCgnbGluZUVuZGluZycpXG4gICAgICBzZWVuID0gdHJ1ZVxuICAgICAgcmV0dXJuIHN0YXJ0XG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkpIHtcbiAgICAgIHJldHVybiBmYWN0b3J5U3BhY2UoXG4gICAgICAgIGVmZmVjdHMsXG4gICAgICAgIHN0YXJ0LFxuICAgICAgICBzZWVuID8gJ2xpbmVQcmVmaXgnIDogJ2xpbmVTdWZmaXgnXG4gICAgICApKGNvZGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIG9rKGNvZGUpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3aGl0ZXNwYWNlRmFjdG9yeVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgbWFya2Rvd25MaW5lRW5kaW5nID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLmpzJylcbnZhciBmYWN0b3J5U3BhY2UgPSByZXF1aXJlKCcuL2ZhY3Rvcnktc3BhY2UuanMnKVxuXG5mdW5jdGlvbiB0aXRsZUZhY3RvcnkoZWZmZWN0cywgb2ssIG5vaywgdHlwZSwgbWFya2VyVHlwZSwgc3RyaW5nVHlwZSkge1xuICB2YXIgbWFya2VyXG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKHR5cGUpXG4gICAgZWZmZWN0cy5lbnRlcihtYXJrZXJUeXBlKVxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIGVmZmVjdHMuZXhpdChtYXJrZXJUeXBlKVxuICAgIG1hcmtlciA9IGNvZGUgPT09IDQwID8gNDEgOiBjb2RlXG4gICAgcmV0dXJuIGF0Rmlyc3RUaXRsZUJyZWFrXG4gIH1cblxuICBmdW5jdGlvbiBhdEZpcnN0VGl0bGVCcmVhayhjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG1hcmtlcikge1xuICAgICAgZWZmZWN0cy5lbnRlcihtYXJrZXJUeXBlKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQobWFya2VyVHlwZSlcbiAgICAgIGVmZmVjdHMuZXhpdCh0eXBlKVxuICAgICAgcmV0dXJuIG9rXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcihzdHJpbmdUeXBlKVxuICAgIHJldHVybiBhdFRpdGxlQnJlYWsoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGF0VGl0bGVCcmVhayhjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG1hcmtlcikge1xuICAgICAgZWZmZWN0cy5leGl0KHN0cmluZ1R5cGUpXG4gICAgICByZXR1cm4gYXRGaXJzdFRpdGxlQnJlYWsobWFya2VyKVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbm9rKGNvZGUpXG4gICAgfSAvLyBOb3RlOiBibGFuayBsaW5lcyBjYW5cdTIwMTl0IGV4aXN0IGluIGNvbnRlbnQuXG5cbiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCdsaW5lRW5kaW5nJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgZWZmZWN0cy5leGl0KCdsaW5lRW5kaW5nJylcbiAgICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYXRUaXRsZUJyZWFrLCAnbGluZVByZWZpeCcpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcignY2h1bmtTdHJpbmcnLCB7XG4gICAgICBjb250ZW50VHlwZTogJ3N0cmluZydcbiAgICB9KVxuICAgIHJldHVybiB0aXRsZShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gdGl0bGUoY29kZSkge1xuICAgIGlmIChjb2RlID09PSBtYXJrZXIgfHwgY29kZSA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZXhpdCgnY2h1bmtTdHJpbmcnKVxuICAgICAgcmV0dXJuIGF0VGl0bGVCcmVhayhjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBjb2RlID09PSA5MiA/IHRpdGxlRXNjYXBlIDogdGl0bGVcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpdGxlRXNjYXBlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbWFya2VyIHx8IGNvZGUgPT09IDkyKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiB0aXRsZVxuICAgIH1cblxuICAgIHJldHVybiB0aXRsZShjb2RlKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdGl0bGVGYWN0b3J5XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcuanMnKVxudmFyIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmctb3Itc3BhY2UuanMnKVxudmFyIG5vcm1hbGl6ZUlkZW50aWZpZXIgPSByZXF1aXJlKCcuLi91dGlsL25vcm1hbGl6ZS1pZGVudGlmaWVyLmpzJylcbnZhciBmYWN0b3J5RGVzdGluYXRpb24gPSByZXF1aXJlKCcuL2ZhY3RvcnktZGVzdGluYXRpb24uanMnKVxudmFyIGZhY3RvcnlMYWJlbCA9IHJlcXVpcmUoJy4vZmFjdG9yeS1sYWJlbC5qcycpXG52YXIgZmFjdG9yeVNwYWNlID0gcmVxdWlyZSgnLi9mYWN0b3J5LXNwYWNlLmpzJylcbnZhciBmYWN0b3J5V2hpdGVzcGFjZSA9IHJlcXVpcmUoJy4vZmFjdG9yeS13aGl0ZXNwYWNlLmpzJylcbnZhciBmYWN0b3J5VGl0bGUgPSByZXF1aXJlKCcuL2ZhY3RvcnktdGl0bGUuanMnKVxuXG52YXIgZGVmaW5pdGlvbiA9IHtcbiAgbmFtZTogJ2RlZmluaXRpb24nLFxuICB0b2tlbml6ZTogdG9rZW5pemVEZWZpbml0aW9uXG59XG52YXIgdGl0bGVDb25zdHJ1Y3QgPSB7XG4gIHRva2VuaXplOiB0b2tlbml6ZVRpdGxlLFxuICBwYXJ0aWFsOiB0cnVlXG59XG5cbmZ1bmN0aW9uIHRva2VuaXplRGVmaW5pdGlvbihlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICB2YXIgaWRlbnRpZmllclxuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgZWZmZWN0cy5lbnRlcignZGVmaW5pdGlvbicpXG4gICAgcmV0dXJuIGZhY3RvcnlMYWJlbC5jYWxsKFxuICAgICAgc2VsZixcbiAgICAgIGVmZmVjdHMsXG4gICAgICBsYWJlbEFmdGVyLFxuICAgICAgbm9rLFxuICAgICAgJ2RlZmluaXRpb25MYWJlbCcsXG4gICAgICAnZGVmaW5pdGlvbkxhYmVsTWFya2VyJyxcbiAgICAgICdkZWZpbml0aW9uTGFiZWxTdHJpbmcnXG4gICAgKShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gbGFiZWxBZnRlcihjb2RlKSB7XG4gICAgaWRlbnRpZmllciA9IG5vcm1hbGl6ZUlkZW50aWZpZXIoXG4gICAgICBzZWxmLnNsaWNlU2VyaWFsaXplKHNlbGYuZXZlbnRzW3NlbGYuZXZlbnRzLmxlbmd0aCAtIDFdWzFdKS5zbGljZSgxLCAtMSlcbiAgICApXG5cbiAgICBpZiAoY29kZSA9PT0gNTgpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2RlZmluaXRpb25NYXJrZXInKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2RlZmluaXRpb25NYXJrZXInKSAvLyBOb3RlOiBibGFuayBsaW5lcyBjYW5cdTIwMTl0IGV4aXN0IGluIGNvbnRlbnQuXG5cbiAgICAgIHJldHVybiBmYWN0b3J5V2hpdGVzcGFjZShcbiAgICAgICAgZWZmZWN0cyxcbiAgICAgICAgZmFjdG9yeURlc3RpbmF0aW9uKFxuICAgICAgICAgIGVmZmVjdHMsXG4gICAgICAgICAgZWZmZWN0cy5hdHRlbXB0KFxuICAgICAgICAgICAgdGl0bGVDb25zdHJ1Y3QsXG4gICAgICAgICAgICBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXIsICd3aGl0ZXNwYWNlJyksXG4gICAgICAgICAgICBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXIsICd3aGl0ZXNwYWNlJylcbiAgICAgICAgICApLFxuICAgICAgICAgIG5vayxcbiAgICAgICAgICAnZGVmaW5pdGlvbkRlc3RpbmF0aW9uJyxcbiAgICAgICAgICAnZGVmaW5pdGlvbkRlc3RpbmF0aW9uTGl0ZXJhbCcsXG4gICAgICAgICAgJ2RlZmluaXRpb25EZXN0aW5hdGlvbkxpdGVyYWxNYXJrZXInLFxuICAgICAgICAgICdkZWZpbml0aW9uRGVzdGluYXRpb25SYXcnLFxuICAgICAgICAgICdkZWZpbml0aW9uRGVzdGluYXRpb25TdHJpbmcnXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBhZnRlcihjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmV4aXQoJ2RlZmluaXRpb24nKVxuXG4gICAgICBpZiAoc2VsZi5wYXJzZXIuZGVmaW5lZC5pbmRleE9mKGlkZW50aWZpZXIpIDwgMCkge1xuICAgICAgICBzZWxmLnBhcnNlci5kZWZpbmVkLnB1c2goaWRlbnRpZmllcilcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9rKGNvZGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplVGl0bGUoZWZmZWN0cywgb2ssIG5vaykge1xuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgcmV0dXJuIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZSlcbiAgICAgID8gZmFjdG9yeVdoaXRlc3BhY2UoZWZmZWN0cywgYmVmb3JlKShjb2RlKVxuICAgICAgOiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGJlZm9yZShjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDM0IHx8IGNvZGUgPT09IDM5IHx8IGNvZGUgPT09IDQwKSB7XG4gICAgICByZXR1cm4gZmFjdG9yeVRpdGxlKFxuICAgICAgICBlZmZlY3RzLFxuICAgICAgICBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYWZ0ZXIsICd3aGl0ZXNwYWNlJyksXG4gICAgICAgIG5vayxcbiAgICAgICAgJ2RlZmluaXRpb25UaXRsZScsXG4gICAgICAgICdkZWZpbml0aW9uVGl0bGVNYXJrZXInLFxuICAgICAgICAnZGVmaW5pdGlvblRpdGxlU3RyaW5nJ1xuICAgICAgKShjb2RlKVxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGFmdGVyKGNvZGUpIHtcbiAgICByZXR1cm4gY29kZSA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkgPyBvayhjb2RlKSA6IG5vayhjb2RlKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvblxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgbWFya2Rvd25MaW5lRW5kaW5nID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLmpzJylcblxudmFyIGhhcmRCcmVha0VzY2FwZSA9IHtcbiAgbmFtZTogJ2hhcmRCcmVha0VzY2FwZScsXG4gIHRva2VuaXplOiB0b2tlbml6ZUhhcmRCcmVha0VzY2FwZVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUhhcmRCcmVha0VzY2FwZShlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKCdoYXJkQnJlYWtFc2NhcGUnKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2VzY2FwZU1hcmtlcicpXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgcmV0dXJuIG9wZW5cbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW4oY29kZSkge1xuICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZXhpdCgnZXNjYXBlTWFya2VyJylcbiAgICAgIGVmZmVjdHMuZXhpdCgnaGFyZEJyZWFrRXNjYXBlJylcbiAgICAgIHJldHVybiBvayhjb2RlKVxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhcmRCcmVha0VzY2FwZVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgbWFya2Rvd25MaW5lRW5kaW5nID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLmpzJylcbnZhciBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLW9yLXNwYWNlLmpzJylcbnZhciBtYXJrZG93blNwYWNlID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLXNwYWNlLmpzJylcbnZhciBjaHVua2VkU3BsaWNlID0gcmVxdWlyZSgnLi4vdXRpbC9jaHVua2VkLXNwbGljZS5qcycpXG52YXIgZmFjdG9yeVNwYWNlID0gcmVxdWlyZSgnLi9mYWN0b3J5LXNwYWNlLmpzJylcblxudmFyIGhlYWRpbmdBdHggPSB7XG4gIG5hbWU6ICdoZWFkaW5nQXR4JyxcbiAgdG9rZW5pemU6IHRva2VuaXplSGVhZGluZ0F0eCxcbiAgcmVzb2x2ZTogcmVzb2x2ZUhlYWRpbmdBdHhcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUhlYWRpbmdBdHgoZXZlbnRzLCBjb250ZXh0KSB7XG4gIHZhciBjb250ZW50RW5kID0gZXZlbnRzLmxlbmd0aCAtIDJcbiAgdmFyIGNvbnRlbnRTdGFydCA9IDNcbiAgdmFyIGNvbnRlbnRcbiAgdmFyIHRleHQgLy8gUHJlZml4IHdoaXRlc3BhY2UsIHBhcnQgb2YgdGhlIG9wZW5pbmcuXG5cbiAgaWYgKGV2ZW50c1tjb250ZW50U3RhcnRdWzFdLnR5cGUgPT09ICd3aGl0ZXNwYWNlJykge1xuICAgIGNvbnRlbnRTdGFydCArPSAyXG4gIH0gLy8gU3VmZml4IHdoaXRlc3BhY2UsIHBhcnQgb2YgdGhlIGNsb3NpbmcuXG5cbiAgaWYgKFxuICAgIGNvbnRlbnRFbmQgLSAyID4gY29udGVudFN0YXJ0ICYmXG4gICAgZXZlbnRzW2NvbnRlbnRFbmRdWzFdLnR5cGUgPT09ICd3aGl0ZXNwYWNlJ1xuICApIHtcbiAgICBjb250ZW50RW5kIC09IDJcbiAgfVxuXG4gIGlmIChcbiAgICBldmVudHNbY29udGVudEVuZF1bMV0udHlwZSA9PT0gJ2F0eEhlYWRpbmdTZXF1ZW5jZScgJiZcbiAgICAoY29udGVudFN0YXJ0ID09PSBjb250ZW50RW5kIC0gMSB8fFxuICAgICAgKGNvbnRlbnRFbmQgLSA0ID4gY29udGVudFN0YXJ0ICYmXG4gICAgICAgIGV2ZW50c1tjb250ZW50RW5kIC0gMl1bMV0udHlwZSA9PT0gJ3doaXRlc3BhY2UnKSlcbiAgKSB7XG4gICAgY29udGVudEVuZCAtPSBjb250ZW50U3RhcnQgKyAxID09PSBjb250ZW50RW5kID8gMiA6IDRcbiAgfVxuXG4gIGlmIChjb250ZW50RW5kID4gY29udGVudFN0YXJ0KSB7XG4gICAgY29udGVudCA9IHtcbiAgICAgIHR5cGU6ICdhdHhIZWFkaW5nVGV4dCcsXG4gICAgICBzdGFydDogZXZlbnRzW2NvbnRlbnRTdGFydF1bMV0uc3RhcnQsXG4gICAgICBlbmQ6IGV2ZW50c1tjb250ZW50RW5kXVsxXS5lbmRcbiAgICB9XG4gICAgdGV4dCA9IHtcbiAgICAgIHR5cGU6ICdjaHVua1RleHQnLFxuICAgICAgc3RhcnQ6IGV2ZW50c1tjb250ZW50U3RhcnRdWzFdLnN0YXJ0LFxuICAgICAgZW5kOiBldmVudHNbY29udGVudEVuZF1bMV0uZW5kLFxuICAgICAgY29udGVudFR5cGU6ICd0ZXh0J1xuICAgIH1cbiAgICBjaHVua2VkU3BsaWNlKGV2ZW50cywgY29udGVudFN0YXJ0LCBjb250ZW50RW5kIC0gY29udGVudFN0YXJ0ICsgMSwgW1xuICAgICAgWydlbnRlcicsIGNvbnRlbnQsIGNvbnRleHRdLFxuICAgICAgWydlbnRlcicsIHRleHQsIGNvbnRleHRdLFxuICAgICAgWydleGl0JywgdGV4dCwgY29udGV4dF0sXG4gICAgICBbJ2V4aXQnLCBjb250ZW50LCBjb250ZXh0XVxuICAgIF0pXG4gIH1cblxuICByZXR1cm4gZXZlbnRzXG59XG5cbmZ1bmN0aW9uIHRva2VuaXplSGVhZGluZ0F0eChlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICB2YXIgc2l6ZSA9IDBcbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIGVmZmVjdHMuZW50ZXIoJ2F0eEhlYWRpbmcnKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2F0eEhlYWRpbmdTZXF1ZW5jZScpXG4gICAgcmV0dXJuIGZlbmNlT3Blbkluc2lkZShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZmVuY2VPcGVuSW5zaWRlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gMzUgJiYgc2l6ZSsrIDwgNikge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gZmVuY2VPcGVuSW5zaWRlXG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlKSkge1xuICAgICAgZWZmZWN0cy5leGl0KCdhdHhIZWFkaW5nU2VxdWVuY2UnKVxuICAgICAgcmV0dXJuIHNlbGYuaW50ZXJydXB0ID8gb2soY29kZSkgOiBoZWFkaW5nQnJlYWsoY29kZSlcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBoZWFkaW5nQnJlYWsoY29kZSkge1xuICAgIGlmIChjb2RlID09PSAzNSkge1xuICAgICAgZWZmZWN0cy5lbnRlcignYXR4SGVhZGluZ1NlcXVlbmNlJylcbiAgICAgIHJldHVybiBzZXF1ZW5jZShjb2RlKVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgZWZmZWN0cy5leGl0KCdhdHhIZWFkaW5nJylcbiAgICAgIHJldHVybiBvayhjb2RlKVxuICAgIH1cblxuICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGUpKSB7XG4gICAgICByZXR1cm4gZmFjdG9yeVNwYWNlKGVmZmVjdHMsIGhlYWRpbmdCcmVhaywgJ3doaXRlc3BhY2UnKShjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuZW50ZXIoJ2F0eEhlYWRpbmdUZXh0JylcbiAgICByZXR1cm4gZGF0YShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gc2VxdWVuY2UoY29kZSkge1xuICAgIGlmIChjb2RlID09PSAzNSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gc2VxdWVuY2VcbiAgICB9XG5cbiAgICBlZmZlY3RzLmV4aXQoJ2F0eEhlYWRpbmdTZXF1ZW5jZScpXG4gICAgcmV0dXJuIGhlYWRpbmdCcmVhayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZGF0YShjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gMzUgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlKSkge1xuICAgICAgZWZmZWN0cy5leGl0KCdhdHhIZWFkaW5nVGV4dCcpXG4gICAgICByZXR1cm4gaGVhZGluZ0JyZWFrKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgcmV0dXJuIGRhdGFcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhlYWRpbmdBdHhcbiIsICIndXNlIHN0cmljdCdcblxuLy8gVGhpcyBtb2R1bGUgaXMgY29waWVkIGZyb20gPGh0dHBzOi8vc3BlYy5jb21tb25tYXJrLm9yZy8wLjI5LyNodG1sLWJsb2Nrcz4uXG52YXIgYmFzaWNzID0gW1xuICAnYWRkcmVzcycsXG4gICdhcnRpY2xlJyxcbiAgJ2FzaWRlJyxcbiAgJ2Jhc2UnLFxuICAnYmFzZWZvbnQnLFxuICAnYmxvY2txdW90ZScsXG4gICdib2R5JyxcbiAgJ2NhcHRpb24nLFxuICAnY2VudGVyJyxcbiAgJ2NvbCcsXG4gICdjb2xncm91cCcsXG4gICdkZCcsXG4gICdkZXRhaWxzJyxcbiAgJ2RpYWxvZycsXG4gICdkaXInLFxuICAnZGl2JyxcbiAgJ2RsJyxcbiAgJ2R0JyxcbiAgJ2ZpZWxkc2V0JyxcbiAgJ2ZpZ2NhcHRpb24nLFxuICAnZmlndXJlJyxcbiAgJ2Zvb3RlcicsXG4gICdmb3JtJyxcbiAgJ2ZyYW1lJyxcbiAgJ2ZyYW1lc2V0JyxcbiAgJ2gxJyxcbiAgJ2gyJyxcbiAgJ2gzJyxcbiAgJ2g0JyxcbiAgJ2g1JyxcbiAgJ2g2JyxcbiAgJ2hlYWQnLFxuICAnaGVhZGVyJyxcbiAgJ2hyJyxcbiAgJ2h0bWwnLFxuICAnaWZyYW1lJyxcbiAgJ2xlZ2VuZCcsXG4gICdsaScsXG4gICdsaW5rJyxcbiAgJ21haW4nLFxuICAnbWVudScsXG4gICdtZW51aXRlbScsXG4gICduYXYnLFxuICAnbm9mcmFtZXMnLFxuICAnb2wnLFxuICAnb3B0Z3JvdXAnLFxuICAnb3B0aW9uJyxcbiAgJ3AnLFxuICAncGFyYW0nLFxuICAnc2VjdGlvbicsXG4gICdzb3VyY2UnLFxuICAnc3VtbWFyeScsXG4gICd0YWJsZScsXG4gICd0Ym9keScsXG4gICd0ZCcsXG4gICd0Zm9vdCcsXG4gICd0aCcsXG4gICd0aGVhZCcsXG4gICd0aXRsZScsXG4gICd0cicsXG4gICd0cmFjaycsXG4gICd1bCdcbl1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNpY3NcbiIsICIndXNlIHN0cmljdCdcblxuLy8gVGhpcyBtb2R1bGUgaXMgY29waWVkIGZyb20gPGh0dHBzOi8vc3BlYy5jb21tb25tYXJrLm9yZy8wLjI5LyNodG1sLWJsb2Nrcz4uXG52YXIgcmF3cyA9IFsncHJlJywgJ3NjcmlwdCcsICdzdHlsZScsICd0ZXh0YXJlYSddXG5cbm1vZHVsZS5leHBvcnRzID0gcmF3c1xuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgYXNjaWlBbHBoYSA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9hc2NpaS1hbHBoYS5qcycpXG52YXIgYXNjaWlBbHBoYW51bWVyaWMgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvYXNjaWktYWxwaGFudW1lcmljLmpzJylcbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcuanMnKVxudmFyIG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmctb3Itc3BhY2UuanMnKVxudmFyIG1hcmtkb3duU3BhY2UgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvbWFya2Rvd24tc3BhY2UuanMnKVxudmFyIGZyb21DaGFyQ29kZSA9IHJlcXVpcmUoJy4uL2NvbnN0YW50L2Zyb20tY2hhci1jb2RlLmpzJylcbnZhciBodG1sQmxvY2tOYW1lcyA9IHJlcXVpcmUoJy4uL2NvbnN0YW50L2h0bWwtYmxvY2stbmFtZXMuanMnKVxudmFyIGh0bWxSYXdOYW1lcyA9IHJlcXVpcmUoJy4uL2NvbnN0YW50L2h0bWwtcmF3LW5hbWVzLmpzJylcbnZhciBwYXJ0aWFsQmxhbmtMaW5lID0gcmVxdWlyZSgnLi9wYXJ0aWFsLWJsYW5rLWxpbmUuanMnKVxuXG52YXIgaHRtbEZsb3cgPSB7XG4gIG5hbWU6ICdodG1sRmxvdycsXG4gIHRva2VuaXplOiB0b2tlbml6ZUh0bWxGbG93LFxuICByZXNvbHZlVG86IHJlc29sdmVUb0h0bWxGbG93LFxuICBjb25jcmV0ZTogdHJ1ZVxufVxudmFyIG5leHRCbGFua0NvbnN0cnVjdCA9IHtcbiAgdG9rZW5pemU6IHRva2VuaXplTmV4dEJsYW5rLFxuICBwYXJ0aWFsOiB0cnVlXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUb0h0bWxGbG93KGV2ZW50cykge1xuICB2YXIgaW5kZXggPSBldmVudHMubGVuZ3RoXG5cbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICBpZiAoZXZlbnRzW2luZGV4XVswXSA9PT0gJ2VudGVyJyAmJiBldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdodG1sRmxvdycpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKGluZGV4ID4gMSAmJiBldmVudHNbaW5kZXggLSAyXVsxXS50eXBlID09PSAnbGluZVByZWZpeCcpIHtcbiAgICAvLyBBZGQgdGhlIHByZWZpeCBzdGFydCB0byB0aGUgSFRNTCB0b2tlbi5cbiAgICBldmVudHNbaW5kZXhdWzFdLnN0YXJ0ID0gZXZlbnRzW2luZGV4IC0gMl1bMV0uc3RhcnQgLy8gQWRkIHRoZSBwcmVmaXggc3RhcnQgdG8gdGhlIEhUTUwgbGluZSB0b2tlbi5cblxuICAgIGV2ZW50c1tpbmRleCArIDFdWzFdLnN0YXJ0ID0gZXZlbnRzW2luZGV4IC0gMl1bMV0uc3RhcnQgLy8gUmVtb3ZlIHRoZSBsaW5lIHByZWZpeC5cblxuICAgIGV2ZW50cy5zcGxpY2UoaW5kZXggLSAyLCAyKVxuICB9XG5cbiAgcmV0dXJuIGV2ZW50c1xufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUh0bWxGbG93KGVmZmVjdHMsIG9rLCBub2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciBraW5kXG4gIHZhciBzdGFydFRhZ1xuICB2YXIgYnVmZmVyXG4gIHZhciBpbmRleFxuICB2YXIgbWFya2VyXG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKCdodG1sRmxvdycpXG4gICAgZWZmZWN0cy5lbnRlcignaHRtbEZsb3dEYXRhJylcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICByZXR1cm4gb3BlblxuICB9XG5cbiAgZnVuY3Rpb24gb3Blbihjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDMzKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBkZWNsYXJhdGlvblN0YXJ0XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IDQ3KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiB0YWdDbG9zZVN0YXJ0XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IDYzKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGtpbmQgPSAzIC8vIFdoaWxlIHdlXHUyMDE5cmUgaW4gYW4gaW5zdHJ1Y3Rpb24gaW5zdGVhZCBvZiBhIGRlY2xhcmF0aW9uLCB3ZVx1MjAxOXJlIG9uIGEgYD9gXG4gICAgICAvLyByaWdodCBub3csIHNvIHdlIGRvIG5lZWQgdG8gc2VhcmNoIGZvciBgPmAsIHNpbWlsYXIgdG8gZGVjbGFyYXRpb25zLlxuXG4gICAgICByZXR1cm4gc2VsZi5pbnRlcnJ1cHQgPyBvayA6IGNvbnRpbnVhdGlvbkRlY2xhcmF0aW9uSW5zaWRlXG4gICAgfVxuXG4gICAgaWYgKGFzY2lpQWxwaGEoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgYnVmZmVyID0gZnJvbUNoYXJDb2RlKGNvZGUpXG4gICAgICBzdGFydFRhZyA9IHRydWVcbiAgICAgIHJldHVybiB0YWdOYW1lXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZGVjbGFyYXRpb25TdGFydChjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDQ1KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGtpbmQgPSAyXG4gICAgICByZXR1cm4gY29tbWVudE9wZW5JbnNpZGVcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gOTEpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAga2luZCA9IDVcbiAgICAgIGJ1ZmZlciA9ICdDREFUQVsnXG4gICAgICBpbmRleCA9IDBcbiAgICAgIHJldHVybiBjZGF0YU9wZW5JbnNpZGVcbiAgICB9XG5cbiAgICBpZiAoYXNjaWlBbHBoYShjb2RlKSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBraW5kID0gNFxuICAgICAgcmV0dXJuIHNlbGYuaW50ZXJydXB0ID8gb2sgOiBjb250aW51YXRpb25EZWNsYXJhdGlvbkluc2lkZVxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbW1lbnRPcGVuSW5zaWRlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNDUpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHNlbGYuaW50ZXJydXB0ID8gb2sgOiBjb250aW51YXRpb25EZWNsYXJhdGlvbkluc2lkZVxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNkYXRhT3Blbkluc2lkZShjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IGJ1ZmZlci5jaGFyQ29kZUF0KGluZGV4KyspKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBpbmRleCA9PT0gYnVmZmVyLmxlbmd0aFxuICAgICAgICA/IHNlbGYuaW50ZXJydXB0XG4gICAgICAgICAgPyBva1xuICAgICAgICAgIDogY29udGludWF0aW9uXG4gICAgICAgIDogY2RhdGFPcGVuSW5zaWRlXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gdGFnQ2xvc2VTdGFydChjb2RlKSB7XG4gICAgaWYgKGFzY2lpQWxwaGEoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgYnVmZmVyID0gZnJvbUNoYXJDb2RlKGNvZGUpXG4gICAgICByZXR1cm4gdGFnTmFtZVxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRhZ05hbWUoY29kZSkge1xuICAgIGlmIChcbiAgICAgIGNvZGUgPT09IG51bGwgfHxcbiAgICAgIGNvZGUgPT09IDQ3IHx8XG4gICAgICBjb2RlID09PSA2MiB8fFxuICAgICAgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlKVxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBjb2RlICE9PSA0NyAmJlxuICAgICAgICBzdGFydFRhZyAmJlxuICAgICAgICBodG1sUmF3TmFtZXMuaW5kZXhPZihidWZmZXIudG9Mb3dlckNhc2UoKSkgPiAtMVxuICAgICAgKSB7XG4gICAgICAgIGtpbmQgPSAxXG4gICAgICAgIHJldHVybiBzZWxmLmludGVycnVwdCA/IG9rKGNvZGUpIDogY29udGludWF0aW9uKGNvZGUpXG4gICAgICB9XG5cbiAgICAgIGlmIChodG1sQmxvY2tOYW1lcy5pbmRleE9mKGJ1ZmZlci50b0xvd2VyQ2FzZSgpKSA+IC0xKSB7XG4gICAgICAgIGtpbmQgPSA2XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IDQ3KSB7XG4gICAgICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICAgICAgcmV0dXJuIGJhc2ljU2VsZkNsb3NpbmdcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZWxmLmludGVycnVwdCA/IG9rKGNvZGUpIDogY29udGludWF0aW9uKGNvZGUpXG4gICAgICB9XG5cbiAgICAgIGtpbmQgPSA3IC8vIERvIG5vdCBzdXBwb3J0IGNvbXBsZXRlIEhUTUwgd2hlbiBpbnRlcnJ1cHRpbmcuXG5cbiAgICAgIHJldHVybiBzZWxmLmludGVycnVwdFxuICAgICAgICA/IG5vayhjb2RlKVxuICAgICAgICA6IHN0YXJ0VGFnXG4gICAgICAgID8gY29tcGxldGVBdHRyaWJ1dGVOYW1lQmVmb3JlKGNvZGUpXG4gICAgICAgIDogY29tcGxldGVDbG9zaW5nVGFnQWZ0ZXIoY29kZSlcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gNDUgfHwgYXNjaWlBbHBoYW51bWVyaWMoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgYnVmZmVyICs9IGZyb21DaGFyQ29kZShjb2RlKVxuICAgICAgcmV0dXJuIHRhZ05hbWVcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBiYXNpY1NlbGZDbG9zaW5nKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNjIpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHNlbGYuaW50ZXJydXB0ID8gb2sgOiBjb250aW51YXRpb25cbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjb21wbGV0ZUNsb3NpbmdUYWdBZnRlcihjb2RlKSB7XG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNvbXBsZXRlQ2xvc2luZ1RhZ0FmdGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBsZXRlRW5kKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjb21wbGV0ZUF0dHJpYnV0ZU5hbWVCZWZvcmUoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA0Nykge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gY29tcGxldGVFbmRcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gNTggfHwgY29kZSA9PT0gOTUgfHwgYXNjaWlBbHBoYShjb2RlKSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVOYW1lXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlTmFtZUJlZm9yZVxuICAgIH1cblxuICAgIHJldHVybiBjb21wbGV0ZUVuZChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29tcGxldGVBdHRyaWJ1dGVOYW1lKGNvZGUpIHtcbiAgICBpZiAoXG4gICAgICBjb2RlID09PSA0NSB8fFxuICAgICAgY29kZSA9PT0gNDYgfHxcbiAgICAgIGNvZGUgPT09IDU4IHx8XG4gICAgICBjb2RlID09PSA5NSB8fFxuICAgICAgYXNjaWlBbHBoYW51bWVyaWMoY29kZSlcbiAgICApIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlTmFtZVxuICAgIH1cblxuICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZU5hbWVBZnRlcihjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29tcGxldGVBdHRyaWJ1dGVOYW1lQWZ0ZXIoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA2MSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVWYWx1ZUJlZm9yZVxuICAgIH1cblxuICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZU5hbWVBZnRlclxuICAgIH1cblxuICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZU5hbWVCZWZvcmUoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVCZWZvcmUoY29kZSkge1xuICAgIGlmIChcbiAgICAgIGNvZGUgPT09IG51bGwgfHxcbiAgICAgIGNvZGUgPT09IDYwIHx8XG4gICAgICBjb2RlID09PSA2MSB8fFxuICAgICAgY29kZSA9PT0gNjIgfHxcbiAgICAgIGNvZGUgPT09IDk2XG4gICAgKSB7XG4gICAgICByZXR1cm4gbm9rKGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IDM0IHx8IGNvZGUgPT09IDM5KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIG1hcmtlciA9IGNvZGVcbiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlUXVvdGVkXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNvbXBsZXRlQXR0cmlidXRlVmFsdWVCZWZvcmVcbiAgICB9XG5cbiAgICBtYXJrZXIgPSB1bmRlZmluZWRcbiAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVVucXVvdGVkKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlUXVvdGVkKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbWFya2VyKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlUXVvdGVkQWZ0ZXJcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIHJldHVybiBub2soY29kZSlcbiAgICB9XG5cbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVF1b3RlZFxuICB9XG5cbiAgZnVuY3Rpb24gY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVVucXVvdGVkKGNvZGUpIHtcbiAgICBpZiAoXG4gICAgICBjb2RlID09PSBudWxsIHx8XG4gICAgICBjb2RlID09PSAzNCB8fFxuICAgICAgY29kZSA9PT0gMzkgfHxcbiAgICAgIGNvZGUgPT09IDYwIHx8XG4gICAgICBjb2RlID09PSA2MSB8fFxuICAgICAgY29kZSA9PT0gNjIgfHxcbiAgICAgIGNvZGUgPT09IDk2IHx8XG4gICAgICBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVOYW1lQWZ0ZXIoY29kZSlcbiAgICB9XG5cbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVWYWx1ZVVucXVvdGVkXG4gIH1cblxuICBmdW5jdGlvbiBjb21wbGV0ZUF0dHJpYnV0ZVZhbHVlUXVvdGVkQWZ0ZXIoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA0NyB8fCBjb2RlID09PSA2MiB8fCBtYXJrZG93blNwYWNlKGNvZGUpKSB7XG4gICAgICByZXR1cm4gY29tcGxldGVBdHRyaWJ1dGVOYW1lQmVmb3JlKGNvZGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29tcGxldGVFbmQoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA2Mikge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gY29tcGxldGVBZnRlclxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXBsZXRlQWZ0ZXIoY29kZSkge1xuICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBjb21wbGV0ZUFmdGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvZGUgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpXG4gICAgICA/IGNvbnRpbnVhdGlvbihjb2RlKVxuICAgICAgOiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnRpbnVhdGlvbihjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDQ1ICYmIGtpbmQgPT09IDIpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbkNvbW1lbnRJbnNpZGVcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gNjAgJiYga2luZCA9PT0gMSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gY29udGludWF0aW9uUmF3VGFnT3BlblxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA2MiAmJiBraW5kID09PSA0KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBjb250aW51YXRpb25DbG9zZVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA2MyAmJiBraW5kID09PSAzKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBjb250aW51YXRpb25EZWNsYXJhdGlvbkluc2lkZVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA5MyAmJiBraW5kID09PSA1KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBjb250aW51YXRpb25DaGFyYWN0ZXJEYXRhSW5zaWRlXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSAmJiAoa2luZCA9PT0gNiB8fCBraW5kID09PSA3KSkge1xuICAgICAgcmV0dXJuIGVmZmVjdHMuY2hlY2soXG4gICAgICAgIG5leHRCbGFua0NvbnN0cnVjdCxcbiAgICAgICAgY29udGludWF0aW9uQ2xvc2UsXG4gICAgICAgIGNvbnRpbnVhdGlvbkF0TGluZUVuZGluZ1xuICAgICAgKShjb2RlKVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbkF0TGluZUVuZGluZyhjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBjb250aW51YXRpb25cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnRpbnVhdGlvbkF0TGluZUVuZGluZyhjb2RlKSB7XG4gICAgZWZmZWN0cy5leGl0KCdodG1sRmxvd0RhdGEnKVxuICAgIHJldHVybiBodG1sQ29udGludWVTdGFydChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gaHRtbENvbnRpbnVlU3RhcnQoY29kZSkge1xuICAgIGlmIChjb2RlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZG9uZShjb2RlKVxuICAgIH1cblxuICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2xpbmVFbmRpbmcnKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2xpbmVFbmRpbmcnKVxuICAgICAgcmV0dXJuIGh0bWxDb250aW51ZVN0YXJ0XG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcignaHRtbEZsb3dEYXRhJylcbiAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjb250aW51YXRpb25Db21tZW50SW5zaWRlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNDUpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbkRlY2xhcmF0aW9uSW5zaWRlXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29udGludWF0aW9uUmF3VGFnT3Blbihjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDQ3KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGJ1ZmZlciA9ICcnXG4gICAgICByZXR1cm4gY29udGludWF0aW9uUmF3RW5kVGFnXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29udGludWF0aW9uUmF3RW5kVGFnKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNjIgJiYgaHRtbFJhd05hbWVzLmluZGV4T2YoYnVmZmVyLnRvTG93ZXJDYXNlKCkpID4gLTEpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbkNsb3NlXG4gICAgfVxuXG4gICAgaWYgKGFzY2lpQWxwaGEoY29kZSkgJiYgYnVmZmVyLmxlbmd0aCA8IDgpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgYnVmZmVyICs9IGZyb21DaGFyQ29kZShjb2RlKVxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvblJhd0VuZFRhZ1xuICAgIH1cblxuICAgIHJldHVybiBjb250aW51YXRpb24oY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnRpbnVhdGlvbkNoYXJhY3RlckRhdGFJbnNpZGUoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA5Mykge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gY29udGludWF0aW9uRGVjbGFyYXRpb25JbnNpZGVcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGludWF0aW9uKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjb250aW51YXRpb25EZWNsYXJhdGlvbkluc2lkZShjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDYyKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBjb250aW51YXRpb25DbG9zZVxuICAgIH1cblxuICAgIHJldHVybiBjb250aW51YXRpb24oY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnRpbnVhdGlvbkNsb3NlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZXhpdCgnaHRtbEZsb3dEYXRhJylcbiAgICAgIHJldHVybiBkb25lKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbkNsb3NlXG4gIH1cblxuICBmdW5jdGlvbiBkb25lKGNvZGUpIHtcbiAgICBlZmZlY3RzLmV4aXQoJ2h0bWxGbG93JylcbiAgICByZXR1cm4gb2soY29kZSlcbiAgfVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZU5leHRCbGFuayhlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBlZmZlY3RzLmV4aXQoJ2h0bWxGbG93RGF0YScpXG4gICAgZWZmZWN0cy5lbnRlcignbGluZUVuZGluZ0JsYW5rJylcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBlZmZlY3RzLmV4aXQoJ2xpbmVFbmRpbmdCbGFuaycpXG4gICAgcmV0dXJuIGVmZmVjdHMuYXR0ZW1wdChwYXJ0aWFsQmxhbmtMaW5lLCBvaywgbm9rKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaHRtbEZsb3dcbiIsICIndXNlIHN0cmljdCdcblxudmFyIGFzY2lpQWxwaGEgPSByZXF1aXJlKCcuLi9jaGFyYWN0ZXIvYXNjaWktYWxwaGEuanMnKVxudmFyIGFzY2lpQWxwaGFudW1lcmljID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL2FzY2lpLWFscGhhbnVtZXJpYy5qcycpXG52YXIgbWFya2Rvd25MaW5lRW5kaW5nID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLmpzJylcbnZhciBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLW9yLXNwYWNlLmpzJylcbnZhciBtYXJrZG93blNwYWNlID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLXNwYWNlLmpzJylcbnZhciBmYWN0b3J5U3BhY2UgPSByZXF1aXJlKCcuL2ZhY3Rvcnktc3BhY2UuanMnKVxuXG52YXIgaHRtbFRleHQgPSB7XG4gIG5hbWU6ICdodG1sVGV4dCcsXG4gIHRva2VuaXplOiB0b2tlbml6ZUh0bWxUZXh0XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplSHRtbFRleHQoZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIG1hcmtlclxuICB2YXIgYnVmZmVyXG4gIHZhciBpbmRleFxuICB2YXIgcmV0dXJuU3RhdGVcbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIGVmZmVjdHMuZW50ZXIoJ2h0bWxUZXh0JylcbiAgICBlZmZlY3RzLmVudGVyKCdodG1sVGV4dERhdGEnKVxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBvcGVuXG4gIH1cblxuICBmdW5jdGlvbiBvcGVuKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gMzMpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uT3BlblxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA0Nykge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gdGFnQ2xvc2VTdGFydFxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA2Mykge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25cbiAgICB9XG5cbiAgICBpZiAoYXNjaWlBbHBoYShjb2RlKSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gdGFnT3BlblxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY2xhcmF0aW9uT3Blbihjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDQ1KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBjb21tZW50T3BlblxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA5MSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBidWZmZXIgPSAnQ0RBVEFbJ1xuICAgICAgaW5kZXggPSAwXG4gICAgICByZXR1cm4gY2RhdGFPcGVuXG4gICAgfVxuXG4gICAgaWYgKGFzY2lpQWxwaGEoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGRlY2xhcmF0aW9uXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29tbWVudE9wZW4oY29kZSkge1xuICAgIGlmIChjb2RlID09PSA0NSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gY29tbWVudFN0YXJ0XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY29tbWVudFN0YXJ0KGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSA2Mikge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA0NSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gY29tbWVudFN0YXJ0RGFzaFxuICAgIH1cblxuICAgIHJldHVybiBjb21tZW50KGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjb21tZW50U3RhcnREYXNoKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSA2Mikge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIHJldHVybiBjb21tZW50KGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjb21tZW50KGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA0NSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gY29tbWVudENsb3NlXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgcmV0dXJuU3RhdGUgPSBjb21tZW50XG4gICAgICByZXR1cm4gYXRMaW5lRW5kaW5nKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgcmV0dXJuIGNvbW1lbnRcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbW1lbnRDbG9zZShjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDQ1KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBlbmRcbiAgICB9XG5cbiAgICByZXR1cm4gY29tbWVudChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY2RhdGFPcGVuKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gYnVmZmVyLmNoYXJDb2RlQXQoaW5kZXgrKykpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGluZGV4ID09PSBidWZmZXIubGVuZ3RoID8gY2RhdGEgOiBjZGF0YU9wZW5cbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjZGF0YShjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBub2soY29kZSlcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gOTMpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNkYXRhQ2xvc2VcbiAgICB9XG5cbiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSB7XG4gICAgICByZXR1cm5TdGF0ZSA9IGNkYXRhXG4gICAgICByZXR1cm4gYXRMaW5lRW5kaW5nKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgcmV0dXJuIGNkYXRhXG4gIH1cblxuICBmdW5jdGlvbiBjZGF0YUNsb3NlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gOTMpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNkYXRhRW5kXG4gICAgfVxuXG4gICAgcmV0dXJuIGNkYXRhKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjZGF0YUVuZChjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDYyKSB7XG4gICAgICByZXR1cm4gZW5kKGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IDkzKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBjZGF0YUVuZFxuICAgIH1cblxuICAgIHJldHVybiBjZGF0YShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZGVjbGFyYXRpb24oY29kZSkge1xuICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IDYyKSB7XG4gICAgICByZXR1cm4gZW5kKGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgcmV0dXJuU3RhdGUgPSBkZWNsYXJhdGlvblxuICAgICAgcmV0dXJuIGF0TGluZUVuZGluZyhjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBkZWNsYXJhdGlvblxuICB9XG5cbiAgZnVuY3Rpb24gaW5zdHJ1Y3Rpb24oY29kZSkge1xuICAgIGlmIChjb2RlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbm9rKGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IDYzKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBpbnN0cnVjdGlvbkNsb3NlXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgcmV0dXJuU3RhdGUgPSBpbnN0cnVjdGlvblxuICAgICAgcmV0dXJuIGF0TGluZUVuZGluZyhjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBpbnN0cnVjdGlvblxuICB9XG5cbiAgZnVuY3Rpb24gaW5zdHJ1Y3Rpb25DbG9zZShjb2RlKSB7XG4gICAgcmV0dXJuIGNvZGUgPT09IDYyID8gZW5kKGNvZGUpIDogaW5zdHJ1Y3Rpb24oY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRhZ0Nsb3NlU3RhcnQoY29kZSkge1xuICAgIGlmIChhc2NpaUFscGhhKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiB0YWdDbG9zZVxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRhZ0Nsb3NlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNDUgfHwgYXNjaWlBbHBoYW51bWVyaWMoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHRhZ0Nsb3NlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRhZ0Nsb3NlQmV0d2Vlbihjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gdGFnQ2xvc2VCZXR3ZWVuKGNvZGUpIHtcbiAgICBpZiAobWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSB7XG4gICAgICByZXR1cm5TdGF0ZSA9IHRhZ0Nsb3NlQmV0d2VlblxuICAgICAgcmV0dXJuIGF0TGluZUVuZGluZyhjb2RlKVxuICAgIH1cblxuICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiB0YWdDbG9zZUJldHdlZW5cbiAgICB9XG5cbiAgICByZXR1cm4gZW5kKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiB0YWdPcGVuKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNDUgfHwgYXNjaWlBbHBoYW51bWVyaWMoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHRhZ09wZW5cbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gNDcgfHwgY29kZSA9PT0gNjIgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlKSkge1xuICAgICAgcmV0dXJuIHRhZ09wZW5CZXR3ZWVuKGNvZGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gdGFnT3BlbkJldHdlZW4oY29kZSkge1xuICAgIGlmIChjb2RlID09PSA0Nykge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gZW5kXG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IDU4IHx8IGNvZGUgPT09IDk1IHx8IGFzY2lpQWxwaGEoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVOYW1lXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgcmV0dXJuU3RhdGUgPSB0YWdPcGVuQmV0d2VlblxuICAgICAgcmV0dXJuIGF0TGluZUVuZGluZyhjb2RlKVxuICAgIH1cblxuICAgIGlmIChtYXJrZG93blNwYWNlKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiB0YWdPcGVuQmV0d2VlblxuICAgIH1cblxuICAgIHJldHVybiBlbmQoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRhZ09wZW5BdHRyaWJ1dGVOYW1lKGNvZGUpIHtcbiAgICBpZiAoXG4gICAgICBjb2RlID09PSA0NSB8fFxuICAgICAgY29kZSA9PT0gNDYgfHxcbiAgICAgIGNvZGUgPT09IDU4IHx8XG4gICAgICBjb2RlID09PSA5NSB8fFxuICAgICAgYXNjaWlBbHBoYW51bWVyaWMoY29kZSlcbiAgICApIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVOYW1lXG4gICAgfVxuXG4gICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVOYW1lQWZ0ZXIoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRhZ09wZW5BdHRyaWJ1dGVOYW1lQWZ0ZXIoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA2MSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlQmVmb3JlXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgcmV0dXJuU3RhdGUgPSB0YWdPcGVuQXR0cmlidXRlTmFtZUFmdGVyXG4gICAgICByZXR1cm4gYXRMaW5lRW5kaW5nKGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVOYW1lQWZ0ZXJcbiAgICB9XG5cbiAgICByZXR1cm4gdGFnT3BlbkJldHdlZW4oY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZUJlZm9yZShjb2RlKSB7XG4gICAgaWYgKFxuICAgICAgY29kZSA9PT0gbnVsbCB8fFxuICAgICAgY29kZSA9PT0gNjAgfHxcbiAgICAgIGNvZGUgPT09IDYxIHx8XG4gICAgICBjb2RlID09PSA2MiB8fFxuICAgICAgY29kZSA9PT0gOTZcbiAgICApIHtcbiAgICAgIHJldHVybiBub2soY29kZSlcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gMzQgfHwgY29kZSA9PT0gMzkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgbWFya2VyID0gY29kZVxuICAgICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVF1b3RlZFxuICAgIH1cblxuICAgIGlmIChtYXJrZG93bkxpbmVFbmRpbmcoY29kZSkpIHtcbiAgICAgIHJldHVyblN0YXRlID0gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlQmVmb3JlXG4gICAgICByZXR1cm4gYXRMaW5lRW5kaW5nKGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZUJlZm9yZVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIG1hcmtlciA9IHVuZGVmaW5lZFxuICAgIHJldHVybiB0YWdPcGVuQXR0cmlidXRlVmFsdWVVbnF1b3RlZFxuICB9XG5cbiAgZnVuY3Rpb24gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlUXVvdGVkKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbWFya2VyKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiB0YWdPcGVuQXR0cmlidXRlVmFsdWVRdW90ZWRBZnRlclxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbm9rKGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSkge1xuICAgICAgcmV0dXJuU3RhdGUgPSB0YWdPcGVuQXR0cmlidXRlVmFsdWVRdW90ZWRcbiAgICAgIHJldHVybiBhdExpbmVFbmRpbmcoY29kZSlcbiAgICB9XG5cbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICByZXR1cm4gdGFnT3BlbkF0dHJpYnV0ZVZhbHVlUXVvdGVkXG4gIH1cblxuICBmdW5jdGlvbiB0YWdPcGVuQXR0cmlidXRlVmFsdWVRdW90ZWRBZnRlcihjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDYyIHx8IGNvZGUgPT09IDQ3IHx8IG1hcmtkb3duTGluZUVuZGluZ09yU3BhY2UoY29kZSkpIHtcbiAgICAgIHJldHVybiB0YWdPcGVuQmV0d2Vlbihjb2RlKVxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVVucXVvdGVkKGNvZGUpIHtcbiAgICBpZiAoXG4gICAgICBjb2RlID09PSBudWxsIHx8XG4gICAgICBjb2RlID09PSAzNCB8fFxuICAgICAgY29kZSA9PT0gMzkgfHxcbiAgICAgIGNvZGUgPT09IDYwIHx8XG4gICAgICBjb2RlID09PSA2MSB8fFxuICAgICAgY29kZSA9PT0gOTZcbiAgICApIHtcbiAgICAgIHJldHVybiBub2soY29kZSlcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gNjIgfHwgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlKSkge1xuICAgICAgcmV0dXJuIHRhZ09wZW5CZXR3ZWVuKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgcmV0dXJuIHRhZ09wZW5BdHRyaWJ1dGVWYWx1ZVVucXVvdGVkXG4gIH0gLy8gV2UgY2FuXHUyMDE5dCBoYXZlIGJsYW5rIGxpbmVzIGluIGNvbnRlbnQsIHNvIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgZW1wdHlcbiAgLy8gdG9rZW5zLlxuXG4gIGZ1bmN0aW9uIGF0TGluZUVuZGluZyhjb2RlKSB7XG4gICAgZWZmZWN0cy5leGl0KCdodG1sVGV4dERhdGEnKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2xpbmVFbmRpbmcnKVxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIGVmZmVjdHMuZXhpdCgnbGluZUVuZGluZycpXG4gICAgcmV0dXJuIGZhY3RvcnlTcGFjZShcbiAgICAgIGVmZmVjdHMsXG4gICAgICBhZnRlclByZWZpeCxcbiAgICAgICdsaW5lUHJlZml4JyxcbiAgICAgIHNlbGYucGFyc2VyLmNvbnN0cnVjdHMuZGlzYWJsZS5udWxsLmluZGV4T2YoJ2NvZGVJbmRlbnRlZCcpID4gLTFcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiA0XG4gICAgKVxuICB9XG5cbiAgZnVuY3Rpb24gYWZ0ZXJQcmVmaXgoY29kZSkge1xuICAgIGVmZmVjdHMuZW50ZXIoJ2h0bWxUZXh0RGF0YScpXG4gICAgcmV0dXJuIHJldHVyblN0YXRlKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBlbmQoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA2Mikge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2h0bWxUZXh0RGF0YScpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2h0bWxUZXh0JylcbiAgICAgIHJldHVybiBva1xuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGh0bWxUZXh0XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlID0gcmVxdWlyZSgnLi4vY2hhcmFjdGVyL21hcmtkb3duLWxpbmUtZW5kaW5nLW9yLXNwYWNlLmpzJylcbnZhciBjaHVua2VkUHVzaCA9IHJlcXVpcmUoJy4uL3V0aWwvY2h1bmtlZC1wdXNoLmpzJylcbnZhciBjaHVua2VkU3BsaWNlID0gcmVxdWlyZSgnLi4vdXRpbC9jaHVua2VkLXNwbGljZS5qcycpXG52YXIgbm9ybWFsaXplSWRlbnRpZmllciA9IHJlcXVpcmUoJy4uL3V0aWwvbm9ybWFsaXplLWlkZW50aWZpZXIuanMnKVxudmFyIHJlc29sdmVBbGwgPSByZXF1aXJlKCcuLi91dGlsL3Jlc29sdmUtYWxsLmpzJylcbnZhciBzaGFsbG93ID0gcmVxdWlyZSgnLi4vdXRpbC9zaGFsbG93LmpzJylcbnZhciBmYWN0b3J5RGVzdGluYXRpb24gPSByZXF1aXJlKCcuL2ZhY3RvcnktZGVzdGluYXRpb24uanMnKVxudmFyIGZhY3RvcnlMYWJlbCA9IHJlcXVpcmUoJy4vZmFjdG9yeS1sYWJlbC5qcycpXG52YXIgZmFjdG9yeVRpdGxlID0gcmVxdWlyZSgnLi9mYWN0b3J5LXRpdGxlLmpzJylcbnZhciBmYWN0b3J5V2hpdGVzcGFjZSA9IHJlcXVpcmUoJy4vZmFjdG9yeS13aGl0ZXNwYWNlLmpzJylcblxudmFyIGxhYmVsRW5kID0ge1xuICBuYW1lOiAnbGFiZWxFbmQnLFxuICB0b2tlbml6ZTogdG9rZW5pemVMYWJlbEVuZCxcbiAgcmVzb2x2ZVRvOiByZXNvbHZlVG9MYWJlbEVuZCxcbiAgcmVzb2x2ZUFsbDogcmVzb2x2ZUFsbExhYmVsRW5kXG59XG52YXIgcmVzb3VyY2VDb25zdHJ1Y3QgPSB7XG4gIHRva2VuaXplOiB0b2tlbml6ZVJlc291cmNlXG59XG52YXIgZnVsbFJlZmVyZW5jZUNvbnN0cnVjdCA9IHtcbiAgdG9rZW5pemU6IHRva2VuaXplRnVsbFJlZmVyZW5jZVxufVxudmFyIGNvbGxhcHNlZFJlZmVyZW5jZUNvbnN0cnVjdCA9IHtcbiAgdG9rZW5pemU6IHRva2VuaXplQ29sbGFwc2VkUmVmZXJlbmNlXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVBbGxMYWJlbEVuZChldmVudHMpIHtcbiAgdmFyIGluZGV4ID0gLTFcbiAgdmFyIHRva2VuXG5cbiAgd2hpbGUgKCsraW5kZXggPCBldmVudHMubGVuZ3RoKSB7XG4gICAgdG9rZW4gPSBldmVudHNbaW5kZXhdWzFdXG5cbiAgICBpZiAoXG4gICAgICAhdG9rZW4uX3VzZWQgJiZcbiAgICAgICh0b2tlbi50eXBlID09PSAnbGFiZWxJbWFnZScgfHxcbiAgICAgICAgdG9rZW4udHlwZSA9PT0gJ2xhYmVsTGluaycgfHxcbiAgICAgICAgdG9rZW4udHlwZSA9PT0gJ2xhYmVsRW5kJylcbiAgICApIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgbWFya2VyLlxuICAgICAgZXZlbnRzLnNwbGljZShpbmRleCArIDEsIHRva2VuLnR5cGUgPT09ICdsYWJlbEltYWdlJyA/IDQgOiAyKVxuICAgICAgdG9rZW4udHlwZSA9ICdkYXRhJ1xuICAgICAgaW5kZXgrK1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBldmVudHNcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRvTGFiZWxFbmQoZXZlbnRzLCBjb250ZXh0KSB7XG4gIHZhciBpbmRleCA9IGV2ZW50cy5sZW5ndGhcbiAgdmFyIG9mZnNldCA9IDBcbiAgdmFyIGdyb3VwXG4gIHZhciBsYWJlbFxuICB2YXIgdGV4dFxuICB2YXIgdG9rZW5cbiAgdmFyIG9wZW5cbiAgdmFyIGNsb3NlXG4gIHZhciBtZWRpYSAvLyBGaW5kIGFuIG9wZW5pbmcuXG5cbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICB0b2tlbiA9IGV2ZW50c1tpbmRleF1bMV1cblxuICAgIGlmIChvcGVuKSB7XG4gICAgICAvLyBJZiB3ZSBzZWUgYW5vdGhlciBsaW5rLCBvciBpbmFjdGl2ZSBsaW5rIGxhYmVsLCB3ZVx1MjAxOXZlIGJlZW4gaGVyZSBiZWZvcmUuXG4gICAgICBpZiAoXG4gICAgICAgIHRva2VuLnR5cGUgPT09ICdsaW5rJyB8fFxuICAgICAgICAodG9rZW4udHlwZSA9PT0gJ2xhYmVsTGluaycgJiYgdG9rZW4uX2luYWN0aXZlKVxuICAgICAgKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9IC8vIE1hcmsgb3RoZXIgbGluayBvcGVuaW5ncyBhcyBpbmFjdGl2ZSwgYXMgd2UgY2FuXHUyMDE5dCBoYXZlIGxpbmtzIGluXG4gICAgICAvLyBsaW5rcy5cblxuICAgICAgaWYgKGV2ZW50c1tpbmRleF1bMF0gPT09ICdlbnRlcicgJiYgdG9rZW4udHlwZSA9PT0gJ2xhYmVsTGluaycpIHtcbiAgICAgICAgdG9rZW4uX2luYWN0aXZlID0gdHJ1ZVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2xvc2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZXZlbnRzW2luZGV4XVswXSA9PT0gJ2VudGVyJyAmJlxuICAgICAgICAodG9rZW4udHlwZSA9PT0gJ2xhYmVsSW1hZ2UnIHx8IHRva2VuLnR5cGUgPT09ICdsYWJlbExpbmsnKSAmJlxuICAgICAgICAhdG9rZW4uX2JhbGFuY2VkXG4gICAgICApIHtcbiAgICAgICAgb3BlbiA9IGluZGV4XG5cbiAgICAgICAgaWYgKHRva2VuLnR5cGUgIT09ICdsYWJlbExpbmsnKSB7XG4gICAgICAgICAgb2Zmc2V0ID0gMlxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRva2VuLnR5cGUgPT09ICdsYWJlbEVuZCcpIHtcbiAgICAgIGNsb3NlID0gaW5kZXhcbiAgICB9XG4gIH1cblxuICBncm91cCA9IHtcbiAgICB0eXBlOiBldmVudHNbb3Blbl1bMV0udHlwZSA9PT0gJ2xhYmVsTGluaycgPyAnbGluaycgOiAnaW1hZ2UnLFxuICAgIHN0YXJ0OiBzaGFsbG93KGV2ZW50c1tvcGVuXVsxXS5zdGFydCksXG4gICAgZW5kOiBzaGFsbG93KGV2ZW50c1tldmVudHMubGVuZ3RoIC0gMV1bMV0uZW5kKVxuICB9XG4gIGxhYmVsID0ge1xuICAgIHR5cGU6ICdsYWJlbCcsXG4gICAgc3RhcnQ6IHNoYWxsb3coZXZlbnRzW29wZW5dWzFdLnN0YXJ0KSxcbiAgICBlbmQ6IHNoYWxsb3coZXZlbnRzW2Nsb3NlXVsxXS5lbmQpXG4gIH1cbiAgdGV4dCA9IHtcbiAgICB0eXBlOiAnbGFiZWxUZXh0JyxcbiAgICBzdGFydDogc2hhbGxvdyhldmVudHNbb3BlbiArIG9mZnNldCArIDJdWzFdLmVuZCksXG4gICAgZW5kOiBzaGFsbG93KGV2ZW50c1tjbG9zZSAtIDJdWzFdLnN0YXJ0KVxuICB9XG4gIG1lZGlhID0gW1xuICAgIFsnZW50ZXInLCBncm91cCwgY29udGV4dF0sXG4gICAgWydlbnRlcicsIGxhYmVsLCBjb250ZXh0XVxuICBdIC8vIE9wZW5pbmcgbWFya2VyLlxuXG4gIG1lZGlhID0gY2h1bmtlZFB1c2gobWVkaWEsIGV2ZW50cy5zbGljZShvcGVuICsgMSwgb3BlbiArIG9mZnNldCArIDMpKSAvLyBUZXh0IG9wZW4uXG5cbiAgbWVkaWEgPSBjaHVua2VkUHVzaChtZWRpYSwgW1snZW50ZXInLCB0ZXh0LCBjb250ZXh0XV0pIC8vIEJldHdlZW4uXG5cbiAgbWVkaWEgPSBjaHVua2VkUHVzaChcbiAgICBtZWRpYSxcbiAgICByZXNvbHZlQWxsKFxuICAgICAgY29udGV4dC5wYXJzZXIuY29uc3RydWN0cy5pbnNpZGVTcGFuLm51bGwsXG4gICAgICBldmVudHMuc2xpY2Uob3BlbiArIG9mZnNldCArIDQsIGNsb3NlIC0gMyksXG4gICAgICBjb250ZXh0XG4gICAgKVxuICApIC8vIFRleHQgY2xvc2UsIG1hcmtlciBjbG9zZSwgbGFiZWwgY2xvc2UuXG5cbiAgbWVkaWEgPSBjaHVua2VkUHVzaChtZWRpYSwgW1xuICAgIFsnZXhpdCcsIHRleHQsIGNvbnRleHRdLFxuICAgIGV2ZW50c1tjbG9zZSAtIDJdLFxuICAgIGV2ZW50c1tjbG9zZSAtIDFdLFxuICAgIFsnZXhpdCcsIGxhYmVsLCBjb250ZXh0XVxuICBdKSAvLyBSZWZlcmVuY2UsIHJlc291cmNlLCBvciBzby5cblxuICBtZWRpYSA9IGNodW5rZWRQdXNoKG1lZGlhLCBldmVudHMuc2xpY2UoY2xvc2UgKyAxKSkgLy8gTWVkaWEgY2xvc2UuXG5cbiAgbWVkaWEgPSBjaHVua2VkUHVzaChtZWRpYSwgW1snZXhpdCcsIGdyb3VwLCBjb250ZXh0XV0pXG4gIGNodW5rZWRTcGxpY2UoZXZlbnRzLCBvcGVuLCBldmVudHMubGVuZ3RoLCBtZWRpYSlcbiAgcmV0dXJuIGV2ZW50c1xufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUxhYmVsRW5kKGVmZmVjdHMsIG9rLCBub2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciBpbmRleCA9IHNlbGYuZXZlbnRzLmxlbmd0aFxuICB2YXIgbGFiZWxTdGFydFxuICB2YXIgZGVmaW5lZCAvLyBGaW5kIGFuIG9wZW5pbmcuXG5cbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICBpZiAoXG4gICAgICAoc2VsZi5ldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdsYWJlbEltYWdlJyB8fFxuICAgICAgICBzZWxmLmV2ZW50c1tpbmRleF1bMV0udHlwZSA9PT0gJ2xhYmVsTGluaycpICYmXG4gICAgICAhc2VsZi5ldmVudHNbaW5kZXhdWzFdLl9iYWxhbmNlZFxuICAgICkge1xuICAgICAgbGFiZWxTdGFydCA9IHNlbGYuZXZlbnRzW2luZGV4XVsxXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgaWYgKCFsYWJlbFN0YXJ0KSB7XG4gICAgICByZXR1cm4gbm9rKGNvZGUpXG4gICAgfSAvLyBJdFx1MjAxOXMgYSBiYWxhbmNlZCBicmFja2V0LCBidXQgY29udGFpbnMgYSBsaW5rLlxuXG4gICAgaWYgKGxhYmVsU3RhcnQuX2luYWN0aXZlKSByZXR1cm4gYmFsYW5jZWQoY29kZSlcbiAgICBkZWZpbmVkID1cbiAgICAgIHNlbGYucGFyc2VyLmRlZmluZWQuaW5kZXhPZihcbiAgICAgICAgbm9ybWFsaXplSWRlbnRpZmllcihcbiAgICAgICAgICBzZWxmLnNsaWNlU2VyaWFsaXplKHtcbiAgICAgICAgICAgIHN0YXJ0OiBsYWJlbFN0YXJ0LmVuZCxcbiAgICAgICAgICAgIGVuZDogc2VsZi5ub3coKVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICkgPiAtMVxuICAgIGVmZmVjdHMuZW50ZXIoJ2xhYmVsRW5kJylcbiAgICBlZmZlY3RzLmVudGVyKCdsYWJlbE1hcmtlcicpXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgZWZmZWN0cy5leGl0KCdsYWJlbE1hcmtlcicpXG4gICAgZWZmZWN0cy5leGl0KCdsYWJlbEVuZCcpXG4gICAgcmV0dXJuIGFmdGVyTGFiZWxFbmRcbiAgfVxuXG4gIGZ1bmN0aW9uIGFmdGVyTGFiZWxFbmQoY29kZSkge1xuICAgIC8vIFJlc291cmNlOiBgW2FzZF0oZmdoKWAuXG4gICAgaWYgKGNvZGUgPT09IDQwKSB7XG4gICAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KFxuICAgICAgICByZXNvdXJjZUNvbnN0cnVjdCxcbiAgICAgICAgb2ssXG4gICAgICAgIGRlZmluZWQgPyBvayA6IGJhbGFuY2VkXG4gICAgICApKGNvZGUpXG4gICAgfSAvLyBDb2xsYXBzZWQgKGBbYXNkXVtdYCkgb3IgZnVsbCAoYFthc2RdW2ZnaF1gKSByZWZlcmVuY2U/XG5cbiAgICBpZiAoY29kZSA9PT0gOTEpIHtcbiAgICAgIHJldHVybiBlZmZlY3RzLmF0dGVtcHQoXG4gICAgICAgIGZ1bGxSZWZlcmVuY2VDb25zdHJ1Y3QsXG4gICAgICAgIG9rLFxuICAgICAgICBkZWZpbmVkXG4gICAgICAgICAgPyBlZmZlY3RzLmF0dGVtcHQoY29sbGFwc2VkUmVmZXJlbmNlQ29uc3RydWN0LCBvaywgYmFsYW5jZWQpXG4gICAgICAgICAgOiBiYWxhbmNlZFxuICAgICAgKShjb2RlKVxuICAgIH0gLy8gU2hvcnRjdXQgcmVmZXJlbmNlOiBgW2FzZF1gP1xuXG4gICAgcmV0dXJuIGRlZmluZWQgPyBvayhjb2RlKSA6IGJhbGFuY2VkKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBiYWxhbmNlZChjb2RlKSB7XG4gICAgbGFiZWxTdGFydC5fYmFsYW5jZWQgPSB0cnVlXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplUmVzb3VyY2UoZWZmZWN0cywgb2ssIG5vaykge1xuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgZWZmZWN0cy5lbnRlcigncmVzb3VyY2UnKVxuICAgIGVmZmVjdHMuZW50ZXIoJ3Jlc291cmNlTWFya2VyJylcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBlZmZlY3RzLmV4aXQoJ3Jlc291cmNlTWFya2VyJylcbiAgICByZXR1cm4gZmFjdG9yeVdoaXRlc3BhY2UoZWZmZWN0cywgb3BlbilcbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW4oY29kZSkge1xuICAgIGlmIChjb2RlID09PSA0MSkge1xuICAgICAgcmV0dXJuIGVuZChjb2RlKVxuICAgIH1cblxuICAgIHJldHVybiBmYWN0b3J5RGVzdGluYXRpb24oXG4gICAgICBlZmZlY3RzLFxuICAgICAgZGVzdGluYXRpb25BZnRlcixcbiAgICAgIG5vayxcbiAgICAgICdyZXNvdXJjZURlc3RpbmF0aW9uJyxcbiAgICAgICdyZXNvdXJjZURlc3RpbmF0aW9uTGl0ZXJhbCcsXG4gICAgICAncmVzb3VyY2VEZXN0aW5hdGlvbkxpdGVyYWxNYXJrZXInLFxuICAgICAgJ3Jlc291cmNlRGVzdGluYXRpb25SYXcnLFxuICAgICAgJ3Jlc291cmNlRGVzdGluYXRpb25TdHJpbmcnLFxuICAgICAgM1xuICAgICkoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3RpbmF0aW9uQWZ0ZXIoY29kZSkge1xuICAgIHJldHVybiBtYXJrZG93bkxpbmVFbmRpbmdPclNwYWNlKGNvZGUpXG4gICAgICA/IGZhY3RvcnlXaGl0ZXNwYWNlKGVmZmVjdHMsIGJldHdlZW4pKGNvZGUpXG4gICAgICA6IGVuZChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gYmV0d2Vlbihjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IDM0IHx8IGNvZGUgPT09IDM5IHx8IGNvZGUgPT09IDQwKSB7XG4gICAgICByZXR1cm4gZmFjdG9yeVRpdGxlKFxuICAgICAgICBlZmZlY3RzLFxuICAgICAgICBmYWN0b3J5V2hpdGVzcGFjZShlZmZlY3RzLCBlbmQpLFxuICAgICAgICBub2ssXG4gICAgICAgICdyZXNvdXJjZVRpdGxlJyxcbiAgICAgICAgJ3Jlc291cmNlVGl0bGVNYXJrZXInLFxuICAgICAgICAncmVzb3VyY2VUaXRsZVN0cmluZydcbiAgICAgICkoY29kZSlcbiAgICB9XG5cbiAgICByZXR1cm4gZW5kKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBlbmQoY29kZSkge1xuICAgIGlmIChjb2RlID09PSA0MSkge1xuICAgICAgZWZmZWN0cy5lbnRlcigncmVzb3VyY2VNYXJrZXInKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ3Jlc291cmNlTWFya2VyJylcbiAgICAgIGVmZmVjdHMuZXhpdCgncmVzb3VyY2UnKVxuICAgICAgcmV0dXJuIG9rXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplRnVsbFJlZmVyZW5jZShlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgcmV0dXJuIGZhY3RvcnlMYWJlbC5jYWxsKFxuICAgICAgc2VsZixcbiAgICAgIGVmZmVjdHMsXG4gICAgICBhZnRlckxhYmVsLFxuICAgICAgbm9rLFxuICAgICAgJ3JlZmVyZW5jZScsXG4gICAgICAncmVmZXJlbmNlTWFya2VyJyxcbiAgICAgICdyZWZlcmVuY2VTdHJpbmcnXG4gICAgKShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gYWZ0ZXJMYWJlbChjb2RlKSB7XG4gICAgcmV0dXJuIHNlbGYucGFyc2VyLmRlZmluZWQuaW5kZXhPZihcbiAgICAgIG5vcm1hbGl6ZUlkZW50aWZpZXIoXG4gICAgICAgIHNlbGYuc2xpY2VTZXJpYWxpemUoc2VsZi5ldmVudHNbc2VsZi5ldmVudHMubGVuZ3RoIC0gMV1bMV0pLnNsaWNlKDEsIC0xKVxuICAgICAgKVxuICAgICkgPCAwXG4gICAgICA/IG5vayhjb2RlKVxuICAgICAgOiBvayhjb2RlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplQ29sbGFwc2VkUmVmZXJlbmNlKGVmZmVjdHMsIG9rLCBub2spIHtcbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIGVmZmVjdHMuZW50ZXIoJ3JlZmVyZW5jZScpXG4gICAgZWZmZWN0cy5lbnRlcigncmVmZXJlbmNlTWFya2VyJylcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBlZmZlY3RzLmV4aXQoJ3JlZmVyZW5jZU1hcmtlcicpXG4gICAgcmV0dXJuIG9wZW5cbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW4oY29kZSkge1xuICAgIGlmIChjb2RlID09PSA5Mykge1xuICAgICAgZWZmZWN0cy5lbnRlcigncmVmZXJlbmNlTWFya2VyJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgZWZmZWN0cy5leGl0KCdyZWZlcmVuY2VNYXJrZXInKVxuICAgICAgZWZmZWN0cy5leGl0KCdyZWZlcmVuY2UnKVxuICAgICAgcmV0dXJuIG9rXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGFiZWxFbmRcbiIsICIndXNlIHN0cmljdCdcblxudmFyIGxhYmVsRW5kID0gcmVxdWlyZSgnLi9sYWJlbC1lbmQuanMnKVxuXG52YXIgbGFiZWxTdGFydEltYWdlID0ge1xuICBuYW1lOiAnbGFiZWxTdGFydEltYWdlJyxcbiAgdG9rZW5pemU6IHRva2VuaXplTGFiZWxTdGFydEltYWdlLFxuICByZXNvbHZlQWxsOiBsYWJlbEVuZC5yZXNvbHZlQWxsXG59XG5cbmZ1bmN0aW9uIHRva2VuaXplTGFiZWxTdGFydEltYWdlKGVmZmVjdHMsIG9rLCBub2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKCdsYWJlbEltYWdlJylcbiAgICBlZmZlY3RzLmVudGVyKCdsYWJlbEltYWdlTWFya2VyJylcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBlZmZlY3RzLmV4aXQoJ2xhYmVsSW1hZ2VNYXJrZXInKVxuICAgIHJldHVybiBvcGVuXG4gIH1cblxuICBmdW5jdGlvbiBvcGVuKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gOTEpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2xhYmVsTWFya2VyJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgZWZmZWN0cy5leGl0KCdsYWJlbE1hcmtlcicpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2xhYmVsSW1hZ2UnKVxuICAgICAgcmV0dXJuIGFmdGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gYWZ0ZXIoY29kZSkge1xuICAgIC8qIGM4IGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIGNvZGUgPT09IDk0ICYmXG4gICAgICAvKiBjOCBpZ25vcmUgbmV4dCAqL1xuICAgICAgJ19oaWRkZW5Gb290bm90ZVN1cHBvcnQnIGluIHNlbGYucGFyc2VyLmNvbnN0cnVjdHNcbiAgICAgID8gLyogYzggaWdub3JlIG5leHQgKi9cbiAgICAgICAgbm9rKGNvZGUpXG4gICAgICA6IG9rKGNvZGUpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsYWJlbFN0YXJ0SW1hZ2VcbiIsICIndXNlIHN0cmljdCdcblxudmFyIGxhYmVsRW5kID0gcmVxdWlyZSgnLi9sYWJlbC1lbmQuanMnKVxuXG52YXIgbGFiZWxTdGFydExpbmsgPSB7XG4gIG5hbWU6ICdsYWJlbFN0YXJ0TGluaycsXG4gIHRva2VuaXplOiB0b2tlbml6ZUxhYmVsU3RhcnRMaW5rLFxuICByZXNvbHZlQWxsOiBsYWJlbEVuZC5yZXNvbHZlQWxsXG59XG5cbmZ1bmN0aW9uIHRva2VuaXplTGFiZWxTdGFydExpbmsoZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIGVmZmVjdHMuZW50ZXIoJ2xhYmVsTGluaycpXG4gICAgZWZmZWN0cy5lbnRlcignbGFiZWxNYXJrZXInKVxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIGVmZmVjdHMuZXhpdCgnbGFiZWxNYXJrZXInKVxuICAgIGVmZmVjdHMuZXhpdCgnbGFiZWxMaW5rJylcbiAgICByZXR1cm4gYWZ0ZXJcbiAgfVxuXG4gIGZ1bmN0aW9uIGFmdGVyKGNvZGUpIHtcbiAgICAvKiBjOCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiBjb2RlID09PSA5NCAmJlxuICAgICAgLyogYzggaWdub3JlIG5leHQgKi9cbiAgICAgICdfaGlkZGVuRm9vdG5vdGVTdXBwb3J0JyBpbiBzZWxmLnBhcnNlci5jb25zdHJ1Y3RzXG4gICAgICA/IC8qIGM4IGlnbm9yZSBuZXh0ICovXG4gICAgICAgIG5vayhjb2RlKVxuICAgICAgOiBvayhjb2RlKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGFiZWxTdGFydExpbmtcbiIsICIndXNlIHN0cmljdCdcblxudmFyIGZhY3RvcnlTcGFjZSA9IHJlcXVpcmUoJy4vZmFjdG9yeS1zcGFjZS5qcycpXG5cbnZhciBsaW5lRW5kaW5nID0ge1xuICBuYW1lOiAnbGluZUVuZGluZycsXG4gIHRva2VuaXplOiB0b2tlbml6ZUxpbmVFbmRpbmdcbn1cblxuZnVuY3Rpb24gdG9rZW5pemVMaW5lRW5kaW5nKGVmZmVjdHMsIG9rKSB7XG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKCdsaW5lRW5kaW5nJylcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBlZmZlY3RzLmV4aXQoJ2xpbmVFbmRpbmcnKVxuICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgb2ssICdsaW5lUHJlZml4JylcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpbmVFbmRpbmdcbiIsICIndXNlIHN0cmljdCdcblxudmFyIG1hcmtkb3duTGluZUVuZGluZyA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9tYXJrZG93bi1saW5lLWVuZGluZy5qcycpXG52YXIgbWFya2Rvd25TcGFjZSA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9tYXJrZG93bi1zcGFjZS5qcycpXG52YXIgZmFjdG9yeVNwYWNlID0gcmVxdWlyZSgnLi9mYWN0b3J5LXNwYWNlLmpzJylcblxudmFyIHRoZW1hdGljQnJlYWsgPSB7XG4gIG5hbWU6ICd0aGVtYXRpY0JyZWFrJyxcbiAgdG9rZW5pemU6IHRva2VuaXplVGhlbWF0aWNCcmVha1xufVxuXG5mdW5jdGlvbiB0b2tlbml6ZVRoZW1hdGljQnJlYWsoZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2l6ZSA9IDBcbiAgdmFyIG1hcmtlclxuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgZWZmZWN0cy5lbnRlcigndGhlbWF0aWNCcmVhaycpXG4gICAgbWFya2VyID0gY29kZVxuICAgIHJldHVybiBhdEJyZWFrKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBhdEJyZWFrKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbWFya2VyKSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCd0aGVtYXRpY0JyZWFrU2VxdWVuY2UnKVxuICAgICAgcmV0dXJuIHNlcXVlbmNlKGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkpIHtcbiAgICAgIHJldHVybiBmYWN0b3J5U3BhY2UoZWZmZWN0cywgYXRCcmVhaywgJ3doaXRlc3BhY2UnKShjb2RlKVxuICAgIH1cblxuICAgIGlmIChzaXplIDwgMyB8fCAoY29kZSAhPT0gbnVsbCAmJiAhbWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSkge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuZXhpdCgndGhlbWF0aWNCcmVhaycpXG4gICAgcmV0dXJuIG9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBzZXF1ZW5jZShjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG1hcmtlcikge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBzaXplKytcbiAgICAgIHJldHVybiBzZXF1ZW5jZVxuICAgIH1cblxuICAgIGVmZmVjdHMuZXhpdCgndGhlbWF0aWNCcmVha1NlcXVlbmNlJylcbiAgICByZXR1cm4gYXRCcmVhayhjb2RlKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdGhlbWF0aWNCcmVha1xuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgYXNjaWlEaWdpdCA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9hc2NpaS1kaWdpdC5qcycpXG52YXIgbWFya2Rvd25TcGFjZSA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9tYXJrZG93bi1zcGFjZS5qcycpXG52YXIgcHJlZml4U2l6ZSA9IHJlcXVpcmUoJy4uL3V0aWwvcHJlZml4LXNpemUuanMnKVxudmFyIHNpemVDaHVua3MgPSByZXF1aXJlKCcuLi91dGlsL3NpemUtY2h1bmtzLmpzJylcbnZhciBmYWN0b3J5U3BhY2UgPSByZXF1aXJlKCcuL2ZhY3Rvcnktc3BhY2UuanMnKVxudmFyIHBhcnRpYWxCbGFua0xpbmUgPSByZXF1aXJlKCcuL3BhcnRpYWwtYmxhbmstbGluZS5qcycpXG52YXIgdGhlbWF0aWNCcmVhayA9IHJlcXVpcmUoJy4vdGhlbWF0aWMtYnJlYWsuanMnKVxuXG52YXIgbGlzdCA9IHtcbiAgbmFtZTogJ2xpc3QnLFxuICB0b2tlbml6ZTogdG9rZW5pemVMaXN0U3RhcnQsXG4gIGNvbnRpbnVhdGlvbjoge1xuICAgIHRva2VuaXplOiB0b2tlbml6ZUxpc3RDb250aW51YXRpb25cbiAgfSxcbiAgZXhpdDogdG9rZW5pemVMaXN0RW5kXG59XG52YXIgbGlzdEl0ZW1QcmVmaXhXaGl0ZXNwYWNlQ29uc3RydWN0ID0ge1xuICB0b2tlbml6ZTogdG9rZW5pemVMaXN0SXRlbVByZWZpeFdoaXRlc3BhY2UsXG4gIHBhcnRpYWw6IHRydWVcbn1cbnZhciBpbmRlbnRDb25zdHJ1Y3QgPSB7XG4gIHRva2VuaXplOiB0b2tlbml6ZUluZGVudCxcbiAgcGFydGlhbDogdHJ1ZVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUxpc3RTdGFydChlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICB2YXIgaW5pdGlhbFNpemUgPSBwcmVmaXhTaXplKHNlbGYuZXZlbnRzLCAnbGluZVByZWZpeCcpXG4gIHZhciBzaXplID0gMFxuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgdmFyIGtpbmQgPVxuICAgICAgc2VsZi5jb250YWluZXJTdGF0ZS50eXBlIHx8XG4gICAgICAoY29kZSA9PT0gNDIgfHwgY29kZSA9PT0gNDMgfHwgY29kZSA9PT0gNDVcbiAgICAgICAgPyAnbGlzdFVub3JkZXJlZCdcbiAgICAgICAgOiAnbGlzdE9yZGVyZWQnKVxuXG4gICAgaWYgKFxuICAgICAga2luZCA9PT0gJ2xpc3RVbm9yZGVyZWQnXG4gICAgICAgID8gIXNlbGYuY29udGFpbmVyU3RhdGUubWFya2VyIHx8IGNvZGUgPT09IHNlbGYuY29udGFpbmVyU3RhdGUubWFya2VyXG4gICAgICAgIDogYXNjaWlEaWdpdChjb2RlKVxuICAgICkge1xuICAgICAgaWYgKCFzZWxmLmNvbnRhaW5lclN0YXRlLnR5cGUpIHtcbiAgICAgICAgc2VsZi5jb250YWluZXJTdGF0ZS50eXBlID0ga2luZFxuICAgICAgICBlZmZlY3RzLmVudGVyKGtpbmQsIHtcbiAgICAgICAgICBfY29udGFpbmVyOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChraW5kID09PSAnbGlzdFVub3JkZXJlZCcpIHtcbiAgICAgICAgZWZmZWN0cy5lbnRlcignbGlzdEl0ZW1QcmVmaXgnKVxuICAgICAgICByZXR1cm4gY29kZSA9PT0gNDIgfHwgY29kZSA9PT0gNDVcbiAgICAgICAgICA/IGVmZmVjdHMuY2hlY2sodGhlbWF0aWNCcmVhaywgbm9rLCBhdE1hcmtlcikoY29kZSlcbiAgICAgICAgICA6IGF0TWFya2VyKGNvZGUpXG4gICAgICB9XG5cbiAgICAgIGlmICghc2VsZi5pbnRlcnJ1cHQgfHwgY29kZSA9PT0gNDkpIHtcbiAgICAgICAgZWZmZWN0cy5lbnRlcignbGlzdEl0ZW1QcmVmaXgnKVxuICAgICAgICBlZmZlY3RzLmVudGVyKCdsaXN0SXRlbVZhbHVlJylcbiAgICAgICAgcmV0dXJuIGluc2lkZShjb2RlKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2lkZShjb2RlKSB7XG4gICAgaWYgKGFzY2lpRGlnaXQoY29kZSkgJiYgKytzaXplIDwgMTApIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGluc2lkZVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgICghc2VsZi5pbnRlcnJ1cHQgfHwgc2l6ZSA8IDIpICYmXG4gICAgICAoc2VsZi5jb250YWluZXJTdGF0ZS5tYXJrZXJcbiAgICAgICAgPyBjb2RlID09PSBzZWxmLmNvbnRhaW5lclN0YXRlLm1hcmtlclxuICAgICAgICA6IGNvZGUgPT09IDQxIHx8IGNvZGUgPT09IDQ2KVxuICAgICkge1xuICAgICAgZWZmZWN0cy5leGl0KCdsaXN0SXRlbVZhbHVlJylcbiAgICAgIHJldHVybiBhdE1hcmtlcihjb2RlKVxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGF0TWFya2VyKGNvZGUpIHtcbiAgICBlZmZlY3RzLmVudGVyKCdsaXN0SXRlbU1hcmtlcicpXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgZWZmZWN0cy5leGl0KCdsaXN0SXRlbU1hcmtlcicpXG4gICAgc2VsZi5jb250YWluZXJTdGF0ZS5tYXJrZXIgPSBzZWxmLmNvbnRhaW5lclN0YXRlLm1hcmtlciB8fCBjb2RlXG4gICAgcmV0dXJuIGVmZmVjdHMuY2hlY2soXG4gICAgICBwYXJ0aWFsQmxhbmtMaW5lLCAvLyBDYW5cdTIwMTl0IGJlIGVtcHR5IHdoZW4gaW50ZXJydXB0aW5nLlxuICAgICAgc2VsZi5pbnRlcnJ1cHQgPyBub2sgOiBvbkJsYW5rLFxuICAgICAgZWZmZWN0cy5hdHRlbXB0KFxuICAgICAgICBsaXN0SXRlbVByZWZpeFdoaXRlc3BhY2VDb25zdHJ1Y3QsXG4gICAgICAgIGVuZE9mUHJlZml4LFxuICAgICAgICBvdGhlclByZWZpeFxuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uQmxhbmsoY29kZSkge1xuICAgIHNlbGYuY29udGFpbmVyU3RhdGUuaW5pdGlhbEJsYW5rTGluZSA9IHRydWVcbiAgICBpbml0aWFsU2l6ZSsrXG4gICAgcmV0dXJuIGVuZE9mUHJlZml4KGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBvdGhlclByZWZpeChjb2RlKSB7XG4gICAgaWYgKG1hcmtkb3duU3BhY2UoY29kZSkpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ2xpc3RJdGVtUHJlZml4V2hpdGVzcGFjZScpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdCgnbGlzdEl0ZW1QcmVmaXhXaGl0ZXNwYWNlJylcbiAgICAgIHJldHVybiBlbmRPZlByZWZpeFxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuZE9mUHJlZml4KGNvZGUpIHtcbiAgICBzZWxmLmNvbnRhaW5lclN0YXRlLnNpemUgPVxuICAgICAgaW5pdGlhbFNpemUgKyBzaXplQ2h1bmtzKHNlbGYuc2xpY2VTdHJlYW0oZWZmZWN0cy5leGl0KCdsaXN0SXRlbVByZWZpeCcpKSlcbiAgICByZXR1cm4gb2soY29kZSlcbiAgfVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUxpc3RDb250aW51YXRpb24oZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgc2VsZi5jb250YWluZXJTdGF0ZS5fY2xvc2VGbG93ID0gdW5kZWZpbmVkXG4gIHJldHVybiBlZmZlY3RzLmNoZWNrKHBhcnRpYWxCbGFua0xpbmUsIG9uQmxhbmssIG5vdEJsYW5rKVxuXG4gIGZ1bmN0aW9uIG9uQmxhbmsoY29kZSkge1xuICAgIHNlbGYuY29udGFpbmVyU3RhdGUuZnVydGhlckJsYW5rTGluZXMgPVxuICAgICAgc2VsZi5jb250YWluZXJTdGF0ZS5mdXJ0aGVyQmxhbmtMaW5lcyB8fFxuICAgICAgc2VsZi5jb250YWluZXJTdGF0ZS5pbml0aWFsQmxhbmtMaW5lIC8vIFdlIGhhdmUgYSBibGFuayBsaW5lLlxuICAgIC8vIFN0aWxsLCB0cnkgdG8gY29uc3VtZSBhdCBtb3N0IHRoZSBpdGVtcyBzaXplLlxuXG4gICAgcmV0dXJuIGZhY3RvcnlTcGFjZShcbiAgICAgIGVmZmVjdHMsXG4gICAgICBvayxcbiAgICAgICdsaXN0SXRlbUluZGVudCcsXG4gICAgICBzZWxmLmNvbnRhaW5lclN0YXRlLnNpemUgKyAxXG4gICAgKShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gbm90QmxhbmsoY29kZSkge1xuICAgIGlmIChzZWxmLmNvbnRhaW5lclN0YXRlLmZ1cnRoZXJCbGFua0xpbmVzIHx8ICFtYXJrZG93blNwYWNlKGNvZGUpKSB7XG4gICAgICBzZWxmLmNvbnRhaW5lclN0YXRlLmZ1cnRoZXJCbGFua0xpbmVzID0gc2VsZi5jb250YWluZXJTdGF0ZS5pbml0aWFsQmxhbmtMaW5lID0gdW5kZWZpbmVkXG4gICAgICByZXR1cm4gbm90SW5DdXJyZW50SXRlbShjb2RlKVxuICAgIH1cblxuICAgIHNlbGYuY29udGFpbmVyU3RhdGUuZnVydGhlckJsYW5rTGluZXMgPSBzZWxmLmNvbnRhaW5lclN0YXRlLmluaXRpYWxCbGFua0xpbmUgPSB1bmRlZmluZWRcbiAgICByZXR1cm4gZWZmZWN0cy5hdHRlbXB0KGluZGVudENvbnN0cnVjdCwgb2ssIG5vdEluQ3VycmVudEl0ZW0pKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBub3RJbkN1cnJlbnRJdGVtKGNvZGUpIHtcbiAgICAvLyBXaGlsZSB3ZSBkbyBjb250aW51ZSwgd2Ugc2lnbmFsIHRoYXQgdGhlIGZsb3cgc2hvdWxkIGJlIGNsb3NlZC5cbiAgICBzZWxmLmNvbnRhaW5lclN0YXRlLl9jbG9zZUZsb3cgPSB0cnVlIC8vIEFzIHdlXHUyMDE5cmUgY2xvc2luZyBmbG93LCB3ZVx1MjAxOXJlIG5vIGxvbmdlciBpbnRlcnJ1cHRpbmcuXG5cbiAgICBzZWxmLmludGVycnVwdCA9IHVuZGVmaW5lZFxuICAgIHJldHVybiBmYWN0b3J5U3BhY2UoXG4gICAgICBlZmZlY3RzLFxuICAgICAgZWZmZWN0cy5hdHRlbXB0KGxpc3QsIG9rLCBub2spLFxuICAgICAgJ2xpbmVQcmVmaXgnLFxuICAgICAgc2VsZi5wYXJzZXIuY29uc3RydWN0cy5kaXNhYmxlLm51bGwuaW5kZXhPZignY29kZUluZGVudGVkJykgPiAtMVxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IDRcbiAgICApKGNvZGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gdG9rZW5pemVJbmRlbnQoZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgcmV0dXJuIGZhY3RvcnlTcGFjZShcbiAgICBlZmZlY3RzLFxuICAgIGFmdGVyUHJlZml4LFxuICAgICdsaXN0SXRlbUluZGVudCcsXG4gICAgc2VsZi5jb250YWluZXJTdGF0ZS5zaXplICsgMVxuICApXG5cbiAgZnVuY3Rpb24gYWZ0ZXJQcmVmaXgoY29kZSkge1xuICAgIHJldHVybiBwcmVmaXhTaXplKHNlbGYuZXZlbnRzLCAnbGlzdEl0ZW1JbmRlbnQnKSA9PT1cbiAgICAgIHNlbGYuY29udGFpbmVyU3RhdGUuc2l6ZVxuICAgICAgPyBvayhjb2RlKVxuICAgICAgOiBub2soY29kZSlcbiAgfVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUxpc3RFbmQoZWZmZWN0cykge1xuICBlZmZlY3RzLmV4aXQodGhpcy5jb250YWluZXJTdGF0ZS50eXBlKVxufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUxpc3RJdGVtUHJlZml4V2hpdGVzcGFjZShlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICByZXR1cm4gZmFjdG9yeVNwYWNlKFxuICAgIGVmZmVjdHMsXG4gICAgYWZ0ZXJQcmVmaXgsXG4gICAgJ2xpc3RJdGVtUHJlZml4V2hpdGVzcGFjZScsXG4gICAgc2VsZi5wYXJzZXIuY29uc3RydWN0cy5kaXNhYmxlLm51bGwuaW5kZXhPZignY29kZUluZGVudGVkJykgPiAtMVxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogNCArIDFcbiAgKVxuXG4gIGZ1bmN0aW9uIGFmdGVyUHJlZml4KGNvZGUpIHtcbiAgICByZXR1cm4gbWFya2Rvd25TcGFjZShjb2RlKSB8fFxuICAgICAgIXByZWZpeFNpemUoc2VsZi5ldmVudHMsICdsaXN0SXRlbVByZWZpeFdoaXRlc3BhY2UnKVxuICAgICAgPyBub2soY29kZSlcbiAgICAgIDogb2soY29kZSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RcbiIsICIndXNlIHN0cmljdCdcblxudmFyIG1hcmtkb3duTGluZUVuZGluZyA9IHJlcXVpcmUoJy4uL2NoYXJhY3Rlci9tYXJrZG93bi1saW5lLWVuZGluZy5qcycpXG52YXIgc2hhbGxvdyA9IHJlcXVpcmUoJy4uL3V0aWwvc2hhbGxvdy5qcycpXG52YXIgZmFjdG9yeVNwYWNlID0gcmVxdWlyZSgnLi9mYWN0b3J5LXNwYWNlLmpzJylcblxudmFyIHNldGV4dFVuZGVybGluZSA9IHtcbiAgbmFtZTogJ3NldGV4dFVuZGVybGluZScsXG4gIHRva2VuaXplOiB0b2tlbml6ZVNldGV4dFVuZGVybGluZSxcbiAgcmVzb2x2ZVRvOiByZXNvbHZlVG9TZXRleHRVbmRlcmxpbmVcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRvU2V0ZXh0VW5kZXJsaW5lKGV2ZW50cywgY29udGV4dCkge1xuICB2YXIgaW5kZXggPSBldmVudHMubGVuZ3RoXG4gIHZhciBjb250ZW50XG4gIHZhciB0ZXh0XG4gIHZhciBkZWZpbml0aW9uXG4gIHZhciBoZWFkaW5nIC8vIEZpbmQgdGhlIG9wZW5pbmcgb2YgdGhlIGNvbnRlbnQuXG4gIC8vIEl0XHUyMDE5bGwgYWx3YXlzIGV4aXN0OiB3ZSBkb25cdTIwMTl0IHRva2VuaXplIGlmIGl0IGlzblx1MjAxOXQgdGhlcmUuXG5cbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICBpZiAoZXZlbnRzW2luZGV4XVswXSA9PT0gJ2VudGVyJykge1xuICAgICAgaWYgKGV2ZW50c1tpbmRleF1bMV0udHlwZSA9PT0gJ2NvbnRlbnQnKSB7XG4gICAgICAgIGNvbnRlbnQgPSBpbmRleFxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRzW2luZGV4XVsxXS50eXBlID09PSAncGFyYWdyYXBoJykge1xuICAgICAgICB0ZXh0ID0gaW5kZXhcbiAgICAgIH1cbiAgICB9IC8vIEV4aXRcbiAgICBlbHNlIHtcbiAgICAgIGlmIChldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdjb250ZW50Jykge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIGNvbnRlbnQgZW5kIChpZiBuZWVkZWQgd2VcdTIwMTlsbCBhZGQgaXQgbGF0ZXIpXG4gICAgICAgIGV2ZW50cy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICB9XG5cbiAgICAgIGlmICghZGVmaW5pdGlvbiAmJiBldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdkZWZpbml0aW9uJykge1xuICAgICAgICBkZWZpbml0aW9uID0gaW5kZXhcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoZWFkaW5nID0ge1xuICAgIHR5cGU6ICdzZXRleHRIZWFkaW5nJyxcbiAgICBzdGFydDogc2hhbGxvdyhldmVudHNbdGV4dF1bMV0uc3RhcnQpLFxuICAgIGVuZDogc2hhbGxvdyhldmVudHNbZXZlbnRzLmxlbmd0aCAtIDFdWzFdLmVuZClcbiAgfSAvLyBDaGFuZ2UgdGhlIHBhcmFncmFwaCB0byBzZXRleHQgaGVhZGluZyB0ZXh0LlxuXG4gIGV2ZW50c1t0ZXh0XVsxXS50eXBlID0gJ3NldGV4dEhlYWRpbmdUZXh0JyAvLyBJZiB3ZSBoYXZlIGRlZmluaXRpb25zIGluIHRoZSBjb250ZW50LCB3ZVx1MjAxOWxsIGtlZXAgb24gaGF2aW5nIGNvbnRlbnQsXG4gIC8vIGJ1dCB3ZSBuZWVkIG1vdmUgaXQuXG5cbiAgaWYgKGRlZmluaXRpb24pIHtcbiAgICBldmVudHMuc3BsaWNlKHRleHQsIDAsIFsnZW50ZXInLCBoZWFkaW5nLCBjb250ZXh0XSlcbiAgICBldmVudHMuc3BsaWNlKGRlZmluaXRpb24gKyAxLCAwLCBbJ2V4aXQnLCBldmVudHNbY29udGVudF1bMV0sIGNvbnRleHRdKVxuICAgIGV2ZW50c1tjb250ZW50XVsxXS5lbmQgPSBzaGFsbG93KGV2ZW50c1tkZWZpbml0aW9uXVsxXS5lbmQpXG4gIH0gZWxzZSB7XG4gICAgZXZlbnRzW2NvbnRlbnRdWzFdID0gaGVhZGluZ1xuICB9IC8vIEFkZCB0aGUgaGVhZGluZyBleGl0IGF0IHRoZSBlbmQuXG5cbiAgZXZlbnRzLnB1c2goWydleGl0JywgaGVhZGluZywgY29udGV4dF0pXG4gIHJldHVybiBldmVudHNcbn1cblxuZnVuY3Rpb24gdG9rZW5pemVTZXRleHRVbmRlcmxpbmUoZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIGluZGV4ID0gc2VsZi5ldmVudHMubGVuZ3RoXG4gIHZhciBtYXJrZXJcbiAgdmFyIHBhcmFncmFwaCAvLyBGaW5kIGFuIG9wZW5pbmcuXG5cbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAvLyBTa2lwIGVudGVyL2V4aXQgb2YgbGluZSBlbmRpbmcsIGxpbmUgcHJlZml4LCBhbmQgY29udGVudC5cbiAgICAvLyBXZSBjYW4gbm93IGVpdGhlciBoYXZlIGEgZGVmaW5pdGlvbiBvciBhIHBhcmFncmFwaC5cbiAgICBpZiAoXG4gICAgICBzZWxmLmV2ZW50c1tpbmRleF1bMV0udHlwZSAhPT0gJ2xpbmVFbmRpbmcnICYmXG4gICAgICBzZWxmLmV2ZW50c1tpbmRleF1bMV0udHlwZSAhPT0gJ2xpbmVQcmVmaXgnICYmXG4gICAgICBzZWxmLmV2ZW50c1tpbmRleF1bMV0udHlwZSAhPT0gJ2NvbnRlbnQnXG4gICAgKSB7XG4gICAgICBwYXJhZ3JhcGggPSBzZWxmLmV2ZW50c1tpbmRleF1bMV0udHlwZSA9PT0gJ3BhcmFncmFwaCdcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIGlmICghc2VsZi5sYXp5ICYmIChzZWxmLmludGVycnVwdCB8fCBwYXJhZ3JhcGgpKSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCdzZXRleHRIZWFkaW5nTGluZScpXG4gICAgICBlZmZlY3RzLmVudGVyKCdzZXRleHRIZWFkaW5nTGluZVNlcXVlbmNlJylcbiAgICAgIG1hcmtlciA9IGNvZGVcbiAgICAgIHJldHVybiBjbG9zaW5nU2VxdWVuY2UoY29kZSlcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjbG9zaW5nU2VxdWVuY2UoY29kZSkge1xuICAgIGlmIChjb2RlID09PSBtYXJrZXIpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNsb3NpbmdTZXF1ZW5jZVxuICAgIH1cblxuICAgIGVmZmVjdHMuZXhpdCgnc2V0ZXh0SGVhZGluZ0xpbmVTZXF1ZW5jZScpXG4gICAgcmV0dXJuIGZhY3RvcnlTcGFjZShlZmZlY3RzLCBjbG9zaW5nU2VxdWVuY2VFbmQsICdsaW5lU3VmZml4JykoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb3NpbmdTZXF1ZW5jZUVuZChjb2RlKSB7XG4gICAgaWYgKGNvZGUgPT09IG51bGwgfHwgbWFya2Rvd25MaW5lRW5kaW5nKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmV4aXQoJ3NldGV4dEhlYWRpbmdMaW5lJylcbiAgICAgIHJldHVybiBvayhjb2RlKVxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldGV4dFVuZGVybGluZVxuIiwgIid1c2Ugc3RyaWN0J1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7dmFsdWU6IHRydWV9KVxuXG52YXIgdGV4dCQxID0gcmVxdWlyZSgnLi9pbml0aWFsaXplL3RleHQuanMnKVxudmFyIGF0dGVudGlvbiA9IHJlcXVpcmUoJy4vdG9rZW5pemUvYXR0ZW50aW9uLmpzJylcbnZhciBhdXRvbGluayA9IHJlcXVpcmUoJy4vdG9rZW5pemUvYXV0b2xpbmsuanMnKVxudmFyIGJsb2NrUXVvdGUgPSByZXF1aXJlKCcuL3Rva2VuaXplL2Jsb2NrLXF1b3RlLmpzJylcbnZhciBjaGFyYWN0ZXJFc2NhcGUgPSByZXF1aXJlKCcuL3Rva2VuaXplL2NoYXJhY3Rlci1lc2NhcGUuanMnKVxudmFyIGNoYXJhY3RlclJlZmVyZW5jZSA9IHJlcXVpcmUoJy4vdG9rZW5pemUvY2hhcmFjdGVyLXJlZmVyZW5jZS5qcycpXG52YXIgY29kZUZlbmNlZCA9IHJlcXVpcmUoJy4vdG9rZW5pemUvY29kZS1mZW5jZWQuanMnKVxudmFyIGNvZGVJbmRlbnRlZCA9IHJlcXVpcmUoJy4vdG9rZW5pemUvY29kZS1pbmRlbnRlZC5qcycpXG52YXIgY29kZVRleHQgPSByZXF1aXJlKCcuL3Rva2VuaXplL2NvZGUtdGV4dC5qcycpXG52YXIgZGVmaW5pdGlvbiA9IHJlcXVpcmUoJy4vdG9rZW5pemUvZGVmaW5pdGlvbi5qcycpXG52YXIgaGFyZEJyZWFrRXNjYXBlID0gcmVxdWlyZSgnLi90b2tlbml6ZS9oYXJkLWJyZWFrLWVzY2FwZS5qcycpXG52YXIgaGVhZGluZ0F0eCA9IHJlcXVpcmUoJy4vdG9rZW5pemUvaGVhZGluZy1hdHguanMnKVxudmFyIGh0bWxGbG93ID0gcmVxdWlyZSgnLi90b2tlbml6ZS9odG1sLWZsb3cuanMnKVxudmFyIGh0bWxUZXh0ID0gcmVxdWlyZSgnLi90b2tlbml6ZS9odG1sLXRleHQuanMnKVxudmFyIGxhYmVsRW5kID0gcmVxdWlyZSgnLi90b2tlbml6ZS9sYWJlbC1lbmQuanMnKVxudmFyIGxhYmVsU3RhcnRJbWFnZSA9IHJlcXVpcmUoJy4vdG9rZW5pemUvbGFiZWwtc3RhcnQtaW1hZ2UuanMnKVxudmFyIGxhYmVsU3RhcnRMaW5rID0gcmVxdWlyZSgnLi90b2tlbml6ZS9sYWJlbC1zdGFydC1saW5rLmpzJylcbnZhciBsaW5lRW5kaW5nID0gcmVxdWlyZSgnLi90b2tlbml6ZS9saW5lLWVuZGluZy5qcycpXG52YXIgbGlzdCA9IHJlcXVpcmUoJy4vdG9rZW5pemUvbGlzdC5qcycpXG52YXIgc2V0ZXh0VW5kZXJsaW5lID0gcmVxdWlyZSgnLi90b2tlbml6ZS9zZXRleHQtdW5kZXJsaW5lLmpzJylcbnZhciB0aGVtYXRpY0JyZWFrID0gcmVxdWlyZSgnLi90b2tlbml6ZS90aGVtYXRpYy1icmVhay5qcycpXG5cbnZhciBkb2N1bWVudCA9IHtcbiAgNDI6IGxpc3QsXG4gIC8vIEFzdGVyaXNrXG4gIDQzOiBsaXN0LFxuICAvLyBQbHVzIHNpZ25cbiAgNDU6IGxpc3QsXG4gIC8vIERhc2hcbiAgNDg6IGxpc3QsXG4gIC8vIDBcbiAgNDk6IGxpc3QsXG4gIC8vIDFcbiAgNTA6IGxpc3QsXG4gIC8vIDJcbiAgNTE6IGxpc3QsXG4gIC8vIDNcbiAgNTI6IGxpc3QsXG4gIC8vIDRcbiAgNTM6IGxpc3QsXG4gIC8vIDVcbiAgNTQ6IGxpc3QsXG4gIC8vIDZcbiAgNTU6IGxpc3QsXG4gIC8vIDdcbiAgNTY6IGxpc3QsXG4gIC8vIDhcbiAgNTc6IGxpc3QsXG4gIC8vIDlcbiAgNjI6IGJsb2NrUXVvdGUgLy8gR3JlYXRlciB0aGFuXG59XG52YXIgY29udGVudEluaXRpYWwgPSB7XG4gIDkxOiBkZWZpbml0aW9uIC8vIExlZnQgc3F1YXJlIGJyYWNrZXRcbn1cbnZhciBmbG93SW5pdGlhbCA9IHtcbiAgJy0yJzogY29kZUluZGVudGVkLFxuICAvLyBIb3Jpem9udGFsIHRhYlxuICAnLTEnOiBjb2RlSW5kZW50ZWQsXG4gIC8vIFZpcnR1YWwgc3BhY2VcbiAgMzI6IGNvZGVJbmRlbnRlZCAvLyBTcGFjZVxufVxudmFyIGZsb3cgPSB7XG4gIDM1OiBoZWFkaW5nQXR4LFxuICAvLyBOdW1iZXIgc2lnblxuICA0MjogdGhlbWF0aWNCcmVhayxcbiAgLy8gQXN0ZXJpc2tcbiAgNDU6IFtzZXRleHRVbmRlcmxpbmUsIHRoZW1hdGljQnJlYWtdLFxuICAvLyBEYXNoXG4gIDYwOiBodG1sRmxvdyxcbiAgLy8gTGVzcyB0aGFuXG4gIDYxOiBzZXRleHRVbmRlcmxpbmUsXG4gIC8vIEVxdWFscyB0b1xuICA5NTogdGhlbWF0aWNCcmVhayxcbiAgLy8gVW5kZXJzY29yZVxuICA5NjogY29kZUZlbmNlZCxcbiAgLy8gR3JhdmUgYWNjZW50XG4gIDEyNjogY29kZUZlbmNlZCAvLyBUaWxkZVxufVxudmFyIHN0cmluZyA9IHtcbiAgMzg6IGNoYXJhY3RlclJlZmVyZW5jZSxcbiAgLy8gQW1wZXJzYW5kXG4gIDkyOiBjaGFyYWN0ZXJFc2NhcGUgLy8gQmFja3NsYXNoXG59XG52YXIgdGV4dCA9IHtcbiAgJy01JzogbGluZUVuZGluZyxcbiAgLy8gQ2FycmlhZ2UgcmV0dXJuXG4gICctNCc6IGxpbmVFbmRpbmcsXG4gIC8vIExpbmUgZmVlZFxuICAnLTMnOiBsaW5lRW5kaW5nLFxuICAvLyBDYXJyaWFnZSByZXR1cm4gKyBsaW5lIGZlZWRcbiAgMzM6IGxhYmVsU3RhcnRJbWFnZSxcbiAgLy8gRXhjbGFtYXRpb24gbWFya1xuICAzODogY2hhcmFjdGVyUmVmZXJlbmNlLFxuICAvLyBBbXBlcnNhbmRcbiAgNDI6IGF0dGVudGlvbixcbiAgLy8gQXN0ZXJpc2tcbiAgNjA6IFthdXRvbGluaywgaHRtbFRleHRdLFxuICAvLyBMZXNzIHRoYW5cbiAgOTE6IGxhYmVsU3RhcnRMaW5rLFxuICAvLyBMZWZ0IHNxdWFyZSBicmFja2V0XG4gIDkyOiBbaGFyZEJyZWFrRXNjYXBlLCBjaGFyYWN0ZXJFc2NhcGVdLFxuICAvLyBCYWNrc2xhc2hcbiAgOTM6IGxhYmVsRW5kLFxuICAvLyBSaWdodCBzcXVhcmUgYnJhY2tldFxuICA5NTogYXR0ZW50aW9uLFxuICAvLyBVbmRlcnNjb3JlXG4gIDk2OiBjb2RlVGV4dCAvLyBHcmF2ZSBhY2NlbnRcbn1cbnZhciBpbnNpZGVTcGFuID0ge1xuICBudWxsOiBbYXR0ZW50aW9uLCB0ZXh0JDEucmVzb2x2ZXJdXG59XG52YXIgZGlzYWJsZSA9IHtcbiAgbnVsbDogW11cbn1cblxuZXhwb3J0cy5jb250ZW50SW5pdGlhbCA9IGNvbnRlbnRJbml0aWFsXG5leHBvcnRzLmRpc2FibGUgPSBkaXNhYmxlXG5leHBvcnRzLmRvY3VtZW50ID0gZG9jdW1lbnRcbmV4cG9ydHMuZmxvdyA9IGZsb3dcbmV4cG9ydHMuZmxvd0luaXRpYWwgPSBmbG93SW5pdGlhbFxuZXhwb3J0cy5pbnNpZGVTcGFuID0gaW5zaWRlU3BhblxuZXhwb3J0cy5zdHJpbmcgPSBzdHJpbmdcbmV4cG9ydHMudGV4dCA9IHRleHRcbiIsICIndXNlIHN0cmljdCdcblxudmFyIGNvbnRlbnQgPSByZXF1aXJlKCcuL2luaXRpYWxpemUvY29udGVudC5qcycpXG52YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL2luaXRpYWxpemUvZG9jdW1lbnQuanMnKVxudmFyIGZsb3cgPSByZXF1aXJlKCcuL2luaXRpYWxpemUvZmxvdy5qcycpXG52YXIgdGV4dCA9IHJlcXVpcmUoJy4vaW5pdGlhbGl6ZS90ZXh0LmpzJylcbnZhciBjb21iaW5lRXh0ZW5zaW9ucyA9IHJlcXVpcmUoJy4vdXRpbC9jb21iaW5lLWV4dGVuc2lvbnMuanMnKVxudmFyIGNyZWF0ZVRva2VuaXplciA9IHJlcXVpcmUoJy4vdXRpbC9jcmVhdGUtdG9rZW5pemVyLmpzJylcbnZhciBtaW5pZmxhdCA9IHJlcXVpcmUoJy4vdXRpbC9taW5pZmxhdC5qcycpXG52YXIgY29uc3RydWN0cyA9IHJlcXVpcmUoJy4vY29uc3RydWN0cy5qcycpXG5cbmZ1bmN0aW9uIHBhcnNlKG9wdGlvbnMpIHtcbiAgdmFyIHNldHRpbmdzID0gb3B0aW9ucyB8fCB7fVxuICB2YXIgcGFyc2VyID0ge1xuICAgIGRlZmluZWQ6IFtdLFxuICAgIGNvbnN0cnVjdHM6IGNvbWJpbmVFeHRlbnNpb25zKFxuICAgICAgW2NvbnN0cnVjdHNdLmNvbmNhdChtaW5pZmxhdChzZXR0aW5ncy5leHRlbnNpb25zKSlcbiAgICApLFxuICAgIGNvbnRlbnQ6IGNyZWF0ZShjb250ZW50KSxcbiAgICBkb2N1bWVudDogY3JlYXRlKGRvY3VtZW50KSxcbiAgICBmbG93OiBjcmVhdGUoZmxvdyksXG4gICAgc3RyaW5nOiBjcmVhdGUodGV4dC5zdHJpbmcpLFxuICAgIHRleHQ6IGNyZWF0ZSh0ZXh0LnRleHQpXG4gIH1cbiAgcmV0dXJuIHBhcnNlclxuXG4gIGZ1bmN0aW9uIGNyZWF0ZShpbml0aWFsaXplcikge1xuICAgIHJldHVybiBjcmVhdG9yXG5cbiAgICBmdW5jdGlvbiBjcmVhdG9yKGZyb20pIHtcbiAgICAgIHJldHVybiBjcmVhdGVUb2tlbml6ZXIocGFyc2VyLCBpbml0aWFsaXplciwgZnJvbSlcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgc2VhcmNoID0gL1tcXDBcXHRcXG5cXHJdL2dcblxuZnVuY3Rpb24gcHJlcHJvY2VzcygpIHtcbiAgdmFyIHN0YXJ0ID0gdHJ1ZVxuICB2YXIgY29sdW1uID0gMVxuICB2YXIgYnVmZmVyID0gJydcbiAgdmFyIGF0Q2FycmlhZ2VSZXR1cm5cbiAgcmV0dXJuIHByZXByb2Nlc3NvclxuXG4gIGZ1bmN0aW9uIHByZXByb2Nlc3Nvcih2YWx1ZSwgZW5jb2RpbmcsIGVuZCkge1xuICAgIHZhciBjaHVua3MgPSBbXVxuICAgIHZhciBtYXRjaFxuICAgIHZhciBuZXh0XG4gICAgdmFyIHN0YXJ0UG9zaXRpb25cbiAgICB2YXIgZW5kUG9zaXRpb25cbiAgICB2YXIgY29kZVxuICAgIHZhbHVlID0gYnVmZmVyICsgdmFsdWUudG9TdHJpbmcoZW5jb2RpbmcpXG4gICAgc3RhcnRQb3NpdGlvbiA9IDBcbiAgICBidWZmZXIgPSAnJ1xuXG4gICAgaWYgKHN0YXJ0KSB7XG4gICAgICBpZiAodmFsdWUuY2hhckNvZGVBdCgwKSA9PT0gNjUyNzkpIHtcbiAgICAgICAgc3RhcnRQb3NpdGlvbisrXG4gICAgICB9XG5cbiAgICAgIHN0YXJ0ID0gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgd2hpbGUgKHN0YXJ0UG9zaXRpb24gPCB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgIHNlYXJjaC5sYXN0SW5kZXggPSBzdGFydFBvc2l0aW9uXG4gICAgICBtYXRjaCA9IHNlYXJjaC5leGVjKHZhbHVlKVxuICAgICAgZW5kUG9zaXRpb24gPSBtYXRjaCA/IG1hdGNoLmluZGV4IDogdmFsdWUubGVuZ3RoXG4gICAgICBjb2RlID0gdmFsdWUuY2hhckNvZGVBdChlbmRQb3NpdGlvbilcblxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICBidWZmZXIgPSB2YWx1ZS5zbGljZShzdGFydFBvc2l0aW9uKVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBpZiAoY29kZSA9PT0gMTAgJiYgc3RhcnRQb3NpdGlvbiA9PT0gZW5kUG9zaXRpb24gJiYgYXRDYXJyaWFnZVJldHVybikge1xuICAgICAgICBjaHVua3MucHVzaCgtMylcbiAgICAgICAgYXRDYXJyaWFnZVJldHVybiA9IHVuZGVmaW5lZFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGF0Q2FycmlhZ2VSZXR1cm4pIHtcbiAgICAgICAgICBjaHVua3MucHVzaCgtNSlcbiAgICAgICAgICBhdENhcnJpYWdlUmV0dXJuID0gdW5kZWZpbmVkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhcnRQb3NpdGlvbiA8IGVuZFBvc2l0aW9uKSB7XG4gICAgICAgICAgY2h1bmtzLnB1c2godmFsdWUuc2xpY2Uoc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24pKVxuICAgICAgICAgIGNvbHVtbiArPSBlbmRQb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb25cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICAgICAgY2h1bmtzLnB1c2goNjU1MzMpXG4gICAgICAgICAgY29sdW1uKytcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSA5KSB7XG4gICAgICAgICAgbmV4dCA9IE1hdGguY2VpbChjb2x1bW4gLyA0KSAqIDRcbiAgICAgICAgICBjaHVua3MucHVzaCgtMilcblxuICAgICAgICAgIHdoaWxlIChjb2x1bW4rKyA8IG5leHQpIGNodW5rcy5wdXNoKC0xKVxuICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDEwKSB7XG4gICAgICAgICAgY2h1bmtzLnB1c2goLTQpXG4gICAgICAgICAgY29sdW1uID0gMVxuICAgICAgICB9IC8vIE11c3QgYmUgY2FycmlhZ2UgcmV0dXJuLlxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBhdENhcnJpYWdlUmV0dXJuID0gdHJ1ZVxuICAgICAgICAgIGNvbHVtbiA9IDFcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzdGFydFBvc2l0aW9uID0gZW5kUG9zaXRpb24gKyAxXG4gICAgfVxuXG4gICAgaWYgKGVuZCkge1xuICAgICAgaWYgKGF0Q2FycmlhZ2VSZXR1cm4pIGNodW5rcy5wdXNoKC01KVxuICAgICAgaWYgKGJ1ZmZlcikgY2h1bmtzLnB1c2goYnVmZmVyKVxuICAgICAgY2h1bmtzLnB1c2gobnVsbClcbiAgICB9XG5cbiAgICByZXR1cm4gY2h1bmtzXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwcmVwcm9jZXNzXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBzdWJ0b2tlbml6ZSA9IHJlcXVpcmUoJy4vdXRpbC9zdWJ0b2tlbml6ZS5qcycpXG5cbmZ1bmN0aW9uIHBvc3Rwcm9jZXNzKGV2ZW50cykge1xuICB3aGlsZSAoIXN1YnRva2VuaXplKGV2ZW50cykpIHtcbiAgICAvLyBFbXB0eVxuICB9XG5cbiAgcmV0dXJuIGV2ZW50c1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBvc3Rwcm9jZXNzXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gZnJvbU1hcmtkb3duXG5cbi8vIFRoZXNlIHRocmVlIGFyZSBjb21waWxlZCBhd2F5IGluIHRoZSBgZGlzdC9gXG5cbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJ21kYXN0LXV0aWwtdG8tc3RyaW5nJylcbnZhciBhc3NpZ24gPSByZXF1aXJlKCdtaWNyb21hcmsvZGlzdC9jb25zdGFudC9hc3NpZ24nKVxudmFyIG93biA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L2NvbnN0YW50L2hhcy1vd24tcHJvcGVydHknKVxudmFyIG5vcm1hbGl6ZUlkZW50aWZpZXIgPSByZXF1aXJlKCdtaWNyb21hcmsvZGlzdC91dGlsL25vcm1hbGl6ZS1pZGVudGlmaWVyJylcbnZhciBzYWZlRnJvbUludCA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L3V0aWwvc2FmZS1mcm9tLWludCcpXG52YXIgcGFyc2VyID0gcmVxdWlyZSgnbWljcm9tYXJrL2Rpc3QvcGFyc2UnKVxudmFyIHByZXByb2Nlc3NvciA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L3ByZXByb2Nlc3MnKVxudmFyIHBvc3Rwcm9jZXNzID0gcmVxdWlyZSgnbWljcm9tYXJrL2Rpc3QvcG9zdHByb2Nlc3MnKVxudmFyIGRlY29kZSA9IHJlcXVpcmUoJ3BhcnNlLWVudGl0aWVzL2RlY29kZS1lbnRpdHknKVxudmFyIHN0cmluZ2lmeVBvc2l0aW9uID0gcmVxdWlyZSgndW5pc3QtdXRpbC1zdHJpbmdpZnktcG9zaXRpb24nKVxuXG5mdW5jdGlvbiBmcm9tTWFya2Rvd24odmFsdWUsIGVuY29kaW5nLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucyA9IGVuY29kaW5nXG4gICAgZW5jb2RpbmcgPSB1bmRlZmluZWRcbiAgfVxuXG4gIHJldHVybiBjb21waWxlcihvcHRpb25zKShcbiAgICBwb3N0cHJvY2VzcyhcbiAgICAgIHBhcnNlcihvcHRpb25zKS5kb2N1bWVudCgpLndyaXRlKHByZXByb2Nlc3NvcigpKHZhbHVlLCBlbmNvZGluZywgdHJ1ZSkpXG4gICAgKVxuICApXG59XG5cbi8vIE5vdGUgdGhpcyBjb21waWxlciBvbmx5IHVuZGVyc3RhbmQgY29tcGxldGUgYnVmZmVyaW5nLCBub3Qgc3RyZWFtaW5nLlxuZnVuY3Rpb24gY29tcGlsZXIob3B0aW9ucykge1xuICB2YXIgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9XG4gIHZhciBjb25maWcgPSBjb25maWd1cmUoXG4gICAge1xuICAgICAgdHJhbnNmb3JtczogW10sXG4gICAgICBjYW5Db250YWluRW9sczogW1xuICAgICAgICAnZW1waGFzaXMnLFxuICAgICAgICAnZnJhZ21lbnQnLFxuICAgICAgICAnaGVhZGluZycsXG4gICAgICAgICdwYXJhZ3JhcGgnLFxuICAgICAgICAnc3Ryb25nJ1xuICAgICAgXSxcblxuICAgICAgZW50ZXI6IHtcbiAgICAgICAgYXV0b2xpbms6IG9wZW5lcihsaW5rKSxcbiAgICAgICAgYXV0b2xpbmtQcm90b2NvbDogb25lbnRlcmRhdGEsXG4gICAgICAgIGF1dG9saW5rRW1haWw6IG9uZW50ZXJkYXRhLFxuICAgICAgICBhdHhIZWFkaW5nOiBvcGVuZXIoaGVhZGluZyksXG4gICAgICAgIGJsb2NrUXVvdGU6IG9wZW5lcihibG9ja1F1b3RlKSxcbiAgICAgICAgY2hhcmFjdGVyRXNjYXBlOiBvbmVudGVyZGF0YSxcbiAgICAgICAgY2hhcmFjdGVyUmVmZXJlbmNlOiBvbmVudGVyZGF0YSxcbiAgICAgICAgY29kZUZlbmNlZDogb3BlbmVyKGNvZGVGbG93KSxcbiAgICAgICAgY29kZUZlbmNlZEZlbmNlSW5mbzogYnVmZmVyLFxuICAgICAgICBjb2RlRmVuY2VkRmVuY2VNZXRhOiBidWZmZXIsXG4gICAgICAgIGNvZGVJbmRlbnRlZDogb3BlbmVyKGNvZGVGbG93LCBidWZmZXIpLFxuICAgICAgICBjb2RlVGV4dDogb3BlbmVyKGNvZGVUZXh0LCBidWZmZXIpLFxuICAgICAgICBjb2RlVGV4dERhdGE6IG9uZW50ZXJkYXRhLFxuICAgICAgICBkYXRhOiBvbmVudGVyZGF0YSxcbiAgICAgICAgY29kZUZsb3dWYWx1ZTogb25lbnRlcmRhdGEsXG4gICAgICAgIGRlZmluaXRpb246IG9wZW5lcihkZWZpbml0aW9uKSxcbiAgICAgICAgZGVmaW5pdGlvbkRlc3RpbmF0aW9uU3RyaW5nOiBidWZmZXIsXG4gICAgICAgIGRlZmluaXRpb25MYWJlbFN0cmluZzogYnVmZmVyLFxuICAgICAgICBkZWZpbml0aW9uVGl0bGVTdHJpbmc6IGJ1ZmZlcixcbiAgICAgICAgZW1waGFzaXM6IG9wZW5lcihlbXBoYXNpcyksXG4gICAgICAgIGhhcmRCcmVha0VzY2FwZTogb3BlbmVyKGhhcmRCcmVhayksXG4gICAgICAgIGhhcmRCcmVha1RyYWlsaW5nOiBvcGVuZXIoaGFyZEJyZWFrKSxcbiAgICAgICAgaHRtbEZsb3c6IG9wZW5lcihodG1sLCBidWZmZXIpLFxuICAgICAgICBodG1sRmxvd0RhdGE6IG9uZW50ZXJkYXRhLFxuICAgICAgICBodG1sVGV4dDogb3BlbmVyKGh0bWwsIGJ1ZmZlciksXG4gICAgICAgIGh0bWxUZXh0RGF0YTogb25lbnRlcmRhdGEsXG4gICAgICAgIGltYWdlOiBvcGVuZXIoaW1hZ2UpLFxuICAgICAgICBsYWJlbDogYnVmZmVyLFxuICAgICAgICBsaW5rOiBvcGVuZXIobGluayksXG4gICAgICAgIGxpc3RJdGVtOiBvcGVuZXIobGlzdEl0ZW0pLFxuICAgICAgICBsaXN0SXRlbVZhbHVlOiBvbmVudGVybGlzdGl0ZW12YWx1ZSxcbiAgICAgICAgbGlzdE9yZGVyZWQ6IG9wZW5lcihsaXN0LCBvbmVudGVybGlzdG9yZGVyZWQpLFxuICAgICAgICBsaXN0VW5vcmRlcmVkOiBvcGVuZXIobGlzdCksXG4gICAgICAgIHBhcmFncmFwaDogb3BlbmVyKHBhcmFncmFwaCksXG4gICAgICAgIHJlZmVyZW5jZTogb25lbnRlcnJlZmVyZW5jZSxcbiAgICAgICAgcmVmZXJlbmNlU3RyaW5nOiBidWZmZXIsXG4gICAgICAgIHJlc291cmNlRGVzdGluYXRpb25TdHJpbmc6IGJ1ZmZlcixcbiAgICAgICAgcmVzb3VyY2VUaXRsZVN0cmluZzogYnVmZmVyLFxuICAgICAgICBzZXRleHRIZWFkaW5nOiBvcGVuZXIoaGVhZGluZyksXG4gICAgICAgIHN0cm9uZzogb3BlbmVyKHN0cm9uZyksXG4gICAgICAgIHRoZW1hdGljQnJlYWs6IG9wZW5lcih0aGVtYXRpY0JyZWFrKVxuICAgICAgfSxcblxuICAgICAgZXhpdDoge1xuICAgICAgICBhdHhIZWFkaW5nOiBjbG9zZXIoKSxcbiAgICAgICAgYXR4SGVhZGluZ1NlcXVlbmNlOiBvbmV4aXRhdHhoZWFkaW5nc2VxdWVuY2UsXG4gICAgICAgIGF1dG9saW5rOiBjbG9zZXIoKSxcbiAgICAgICAgYXV0b2xpbmtFbWFpbDogb25leGl0YXV0b2xpbmtlbWFpbCxcbiAgICAgICAgYXV0b2xpbmtQcm90b2NvbDogb25leGl0YXV0b2xpbmtwcm90b2NvbCxcbiAgICAgICAgYmxvY2tRdW90ZTogY2xvc2VyKCksXG4gICAgICAgIGNoYXJhY3RlckVzY2FwZVZhbHVlOiBvbmV4aXRkYXRhLFxuICAgICAgICBjaGFyYWN0ZXJSZWZlcmVuY2VNYXJrZXJIZXhhZGVjaW1hbDogb25leGl0Y2hhcmFjdGVycmVmZXJlbmNlbWFya2VyLFxuICAgICAgICBjaGFyYWN0ZXJSZWZlcmVuY2VNYXJrZXJOdW1lcmljOiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2VtYXJrZXIsXG4gICAgICAgIGNoYXJhY3RlclJlZmVyZW5jZVZhbHVlOiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2V2YWx1ZSxcbiAgICAgICAgY29kZUZlbmNlZDogY2xvc2VyKG9uZXhpdGNvZGVmZW5jZWQpLFxuICAgICAgICBjb2RlRmVuY2VkRmVuY2U6IG9uZXhpdGNvZGVmZW5jZWRmZW5jZSxcbiAgICAgICAgY29kZUZlbmNlZEZlbmNlSW5mbzogb25leGl0Y29kZWZlbmNlZGZlbmNlaW5mbyxcbiAgICAgICAgY29kZUZlbmNlZEZlbmNlTWV0YTogb25leGl0Y29kZWZlbmNlZGZlbmNlbWV0YSxcbiAgICAgICAgY29kZUZsb3dWYWx1ZTogb25leGl0ZGF0YSxcbiAgICAgICAgY29kZUluZGVudGVkOiBjbG9zZXIob25leGl0Y29kZWluZGVudGVkKSxcbiAgICAgICAgY29kZVRleHQ6IGNsb3NlcihvbmV4aXRjb2RldGV4dCksXG4gICAgICAgIGNvZGVUZXh0RGF0YTogb25leGl0ZGF0YSxcbiAgICAgICAgZGF0YTogb25leGl0ZGF0YSxcbiAgICAgICAgZGVmaW5pdGlvbjogY2xvc2VyKCksXG4gICAgICAgIGRlZmluaXRpb25EZXN0aW5hdGlvblN0cmluZzogb25leGl0ZGVmaW5pdGlvbmRlc3RpbmF0aW9uc3RyaW5nLFxuICAgICAgICBkZWZpbml0aW9uTGFiZWxTdHJpbmc6IG9uZXhpdGRlZmluaXRpb25sYWJlbHN0cmluZyxcbiAgICAgICAgZGVmaW5pdGlvblRpdGxlU3RyaW5nOiBvbmV4aXRkZWZpbml0aW9udGl0bGVzdHJpbmcsXG4gICAgICAgIGVtcGhhc2lzOiBjbG9zZXIoKSxcbiAgICAgICAgaGFyZEJyZWFrRXNjYXBlOiBjbG9zZXIob25leGl0aGFyZGJyZWFrKSxcbiAgICAgICAgaGFyZEJyZWFrVHJhaWxpbmc6IGNsb3NlcihvbmV4aXRoYXJkYnJlYWspLFxuICAgICAgICBodG1sRmxvdzogY2xvc2VyKG9uZXhpdGh0bWxmbG93KSxcbiAgICAgICAgaHRtbEZsb3dEYXRhOiBvbmV4aXRkYXRhLFxuICAgICAgICBodG1sVGV4dDogY2xvc2VyKG9uZXhpdGh0bWx0ZXh0KSxcbiAgICAgICAgaHRtbFRleHREYXRhOiBvbmV4aXRkYXRhLFxuICAgICAgICBpbWFnZTogY2xvc2VyKG9uZXhpdGltYWdlKSxcbiAgICAgICAgbGFiZWw6IG9uZXhpdGxhYmVsLFxuICAgICAgICBsYWJlbFRleHQ6IG9uZXhpdGxhYmVsdGV4dCxcbiAgICAgICAgbGluZUVuZGluZzogb25leGl0bGluZWVuZGluZyxcbiAgICAgICAgbGluazogY2xvc2VyKG9uZXhpdGxpbmspLFxuICAgICAgICBsaXN0SXRlbTogY2xvc2VyKCksXG4gICAgICAgIGxpc3RPcmRlcmVkOiBjbG9zZXIoKSxcbiAgICAgICAgbGlzdFVub3JkZXJlZDogY2xvc2VyKCksXG4gICAgICAgIHBhcmFncmFwaDogY2xvc2VyKCksXG4gICAgICAgIHJlZmVyZW5jZVN0cmluZzogb25leGl0cmVmZXJlbmNlc3RyaW5nLFxuICAgICAgICByZXNvdXJjZURlc3RpbmF0aW9uU3RyaW5nOiBvbmV4aXRyZXNvdXJjZWRlc3RpbmF0aW9uc3RyaW5nLFxuICAgICAgICByZXNvdXJjZVRpdGxlU3RyaW5nOiBvbmV4aXRyZXNvdXJjZXRpdGxlc3RyaW5nLFxuICAgICAgICByZXNvdXJjZTogb25leGl0cmVzb3VyY2UsXG4gICAgICAgIHNldGV4dEhlYWRpbmc6IGNsb3NlcihvbmV4aXRzZXRleHRoZWFkaW5nKSxcbiAgICAgICAgc2V0ZXh0SGVhZGluZ0xpbmVTZXF1ZW5jZTogb25leGl0c2V0ZXh0aGVhZGluZ2xpbmVzZXF1ZW5jZSxcbiAgICAgICAgc2V0ZXh0SGVhZGluZ1RleHQ6IG9uZXhpdHNldGV4dGhlYWRpbmd0ZXh0LFxuICAgICAgICBzdHJvbmc6IGNsb3NlcigpLFxuICAgICAgICB0aGVtYXRpY0JyZWFrOiBjbG9zZXIoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXR0aW5ncy5tZGFzdEV4dGVuc2lvbnMgfHwgW11cbiAgKVxuXG4gIHZhciBkYXRhID0ge31cblxuICByZXR1cm4gY29tcGlsZVxuXG4gIGZ1bmN0aW9uIGNvbXBpbGUoZXZlbnRzKSB7XG4gICAgdmFyIHRyZWUgPSB7dHlwZTogJ3Jvb3QnLCBjaGlsZHJlbjogW119XG4gICAgdmFyIHN0YWNrID0gW3RyZWVdXG4gICAgdmFyIHRva2VuU3RhY2sgPSBbXVxuICAgIHZhciBsaXN0U3RhY2sgPSBbXVxuICAgIHZhciBpbmRleCA9IC0xXG4gICAgdmFyIGhhbmRsZXJcbiAgICB2YXIgbGlzdFN0YXJ0XG5cbiAgICB2YXIgY29udGV4dCA9IHtcbiAgICAgIHN0YWNrOiBzdGFjayxcbiAgICAgIHRva2VuU3RhY2s6IHRva2VuU3RhY2ssXG4gICAgICBjb25maWc6IGNvbmZpZyxcbiAgICAgIGVudGVyOiBlbnRlcixcbiAgICAgIGV4aXQ6IGV4aXQsXG4gICAgICBidWZmZXI6IGJ1ZmZlcixcbiAgICAgIHJlc3VtZTogcmVzdW1lLFxuICAgICAgc2V0RGF0YTogc2V0RGF0YSxcbiAgICAgIGdldERhdGE6IGdldERhdGFcbiAgICB9XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGV2ZW50cy5sZW5ndGgpIHtcbiAgICAgIC8vIFdlIHByZXByb2Nlc3MgbGlzdHMgdG8gYWRkIGBsaXN0SXRlbWAgdG9rZW5zLCBhbmQgdG8gaW5mZXIgd2hldGhlclxuICAgICAgLy8gaXRlbXMgdGhlIGxpc3QgaXRzZWxmIGFyZSBzcHJlYWQgb3V0LlxuICAgICAgaWYgKFxuICAgICAgICBldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdsaXN0T3JkZXJlZCcgfHxcbiAgICAgICAgZXZlbnRzW2luZGV4XVsxXS50eXBlID09PSAnbGlzdFVub3JkZXJlZCdcbiAgICAgICkge1xuICAgICAgICBpZiAoZXZlbnRzW2luZGV4XVswXSA9PT0gJ2VudGVyJykge1xuICAgICAgICAgIGxpc3RTdGFjay5wdXNoKGluZGV4KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxpc3RTdGFydCA9IGxpc3RTdGFjay5wb3AoaW5kZXgpXG4gICAgICAgICAgaW5kZXggPSBwcmVwYXJlTGlzdChldmVudHMsIGxpc3RTdGFydCwgaW5kZXgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbmRleCA9IC0xXG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGV2ZW50cy5sZW5ndGgpIHtcbiAgICAgIGhhbmRsZXIgPSBjb25maWdbZXZlbnRzW2luZGV4XVswXV1cblxuICAgICAgaWYgKG93bi5jYWxsKGhhbmRsZXIsIGV2ZW50c1tpbmRleF1bMV0udHlwZSkpIHtcbiAgICAgICAgaGFuZGxlcltldmVudHNbaW5kZXhdWzFdLnR5cGVdLmNhbGwoXG4gICAgICAgICAgYXNzaWduKHtzbGljZVNlcmlhbGl6ZTogZXZlbnRzW2luZGV4XVsyXS5zbGljZVNlcmlhbGl6ZX0sIGNvbnRleHQpLFxuICAgICAgICAgIGV2ZW50c1tpbmRleF1bMV1cbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0b2tlblN0YWNrLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ2Fubm90IGNsb3NlIGRvY3VtZW50LCBhIHRva2VuIChgJyArXG4gICAgICAgICAgdG9rZW5TdGFja1t0b2tlblN0YWNrLmxlbmd0aCAtIDFdLnR5cGUgK1xuICAgICAgICAgICdgLCAnICtcbiAgICAgICAgICBzdHJpbmdpZnlQb3NpdGlvbih7XG4gICAgICAgICAgICBzdGFydDogdG9rZW5TdGFja1t0b2tlblN0YWNrLmxlbmd0aCAtIDFdLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiB0b2tlblN0YWNrW3Rva2VuU3RhY2subGVuZ3RoIC0gMV0uZW5kXG4gICAgICAgICAgfSkgK1xuICAgICAgICAgICcpIGlzIHN0aWxsIG9wZW4nXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gRmlndXJlIG91dCBgcm9vdGAgcG9zaXRpb24uXG4gICAgdHJlZS5wb3NpdGlvbiA9IHtcbiAgICAgIHN0YXJ0OiBwb2ludChcbiAgICAgICAgZXZlbnRzLmxlbmd0aCA/IGV2ZW50c1swXVsxXS5zdGFydCA6IHtsaW5lOiAxLCBjb2x1bW46IDEsIG9mZnNldDogMH1cbiAgICAgICksXG5cbiAgICAgIGVuZDogcG9pbnQoXG4gICAgICAgIGV2ZW50cy5sZW5ndGhcbiAgICAgICAgICA/IGV2ZW50c1tldmVudHMubGVuZ3RoIC0gMl1bMV0uZW5kXG4gICAgICAgICAgOiB7bGluZTogMSwgY29sdW1uOiAxLCBvZmZzZXQ6IDB9XG4gICAgICApXG4gICAgfVxuXG4gICAgaW5kZXggPSAtMVxuICAgIHdoaWxlICgrK2luZGV4IDwgY29uZmlnLnRyYW5zZm9ybXMubGVuZ3RoKSB7XG4gICAgICB0cmVlID0gY29uZmlnLnRyYW5zZm9ybXNbaW5kZXhdKHRyZWUpIHx8IHRyZWVcbiAgICB9XG5cbiAgICByZXR1cm4gdHJlZVxuICB9XG5cbiAgZnVuY3Rpb24gcHJlcGFyZUxpc3QoZXZlbnRzLCBzdGFydCwgbGVuZ3RoKSB7XG4gICAgdmFyIGluZGV4ID0gc3RhcnQgLSAxXG4gICAgdmFyIGNvbnRhaW5lckJhbGFuY2UgPSAtMVxuICAgIHZhciBsaXN0U3ByZWFkID0gZmFsc2VcbiAgICB2YXIgbGlzdEl0ZW1cbiAgICB2YXIgdGFpbEluZGV4XG4gICAgdmFyIGxpbmVJbmRleFxuICAgIHZhciB0YWlsRXZlbnRcbiAgICB2YXIgZXZlbnRcbiAgICB2YXIgZmlyc3RCbGFua0xpbmVJbmRleFxuICAgIHZhciBhdE1hcmtlclxuXG4gICAgd2hpbGUgKCsraW5kZXggPD0gbGVuZ3RoKSB7XG4gICAgICBldmVudCA9IGV2ZW50c1tpbmRleF1cblxuICAgICAgaWYgKFxuICAgICAgICBldmVudFsxXS50eXBlID09PSAnbGlzdFVub3JkZXJlZCcgfHxcbiAgICAgICAgZXZlbnRbMV0udHlwZSA9PT0gJ2xpc3RPcmRlcmVkJyB8fFxuICAgICAgICBldmVudFsxXS50eXBlID09PSAnYmxvY2tRdW90ZSdcbiAgICAgICkge1xuICAgICAgICBpZiAoZXZlbnRbMF0gPT09ICdlbnRlcicpIHtcbiAgICAgICAgICBjb250YWluZXJCYWxhbmNlKytcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250YWluZXJCYWxhbmNlLS1cbiAgICAgICAgfVxuXG4gICAgICAgIGF0TWFya2VyID0gdW5kZWZpbmVkXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50WzFdLnR5cGUgPT09ICdsaW5lRW5kaW5nQmxhbmsnKSB7XG4gICAgICAgIGlmIChldmVudFswXSA9PT0gJ2VudGVyJykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGxpc3RJdGVtICYmXG4gICAgICAgICAgICAhYXRNYXJrZXIgJiZcbiAgICAgICAgICAgICFjb250YWluZXJCYWxhbmNlICYmXG4gICAgICAgICAgICAhZmlyc3RCbGFua0xpbmVJbmRleFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZmlyc3RCbGFua0xpbmVJbmRleCA9IGluZGV4XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXRNYXJrZXIgPSB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgZXZlbnRbMV0udHlwZSA9PT0gJ2xpbmVQcmVmaXgnIHx8XG4gICAgICAgIGV2ZW50WzFdLnR5cGUgPT09ICdsaXN0SXRlbVZhbHVlJyB8fFxuICAgICAgICBldmVudFsxXS50eXBlID09PSAnbGlzdEl0ZW1NYXJrZXInIHx8XG4gICAgICAgIGV2ZW50WzFdLnR5cGUgPT09ICdsaXN0SXRlbVByZWZpeCcgfHxcbiAgICAgICAgZXZlbnRbMV0udHlwZSA9PT0gJ2xpc3RJdGVtUHJlZml4V2hpdGVzcGFjZSdcbiAgICAgICkge1xuICAgICAgICAvLyBFbXB0eS5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF0TWFya2VyID0gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgKCFjb250YWluZXJCYWxhbmNlICYmXG4gICAgICAgICAgZXZlbnRbMF0gPT09ICdlbnRlcicgJiZcbiAgICAgICAgICBldmVudFsxXS50eXBlID09PSAnbGlzdEl0ZW1QcmVmaXgnKSB8fFxuICAgICAgICAoY29udGFpbmVyQmFsYW5jZSA9PT0gLTEgJiZcbiAgICAgICAgICBldmVudFswXSA9PT0gJ2V4aXQnICYmXG4gICAgICAgICAgKGV2ZW50WzFdLnR5cGUgPT09ICdsaXN0VW5vcmRlcmVkJyB8fFxuICAgICAgICAgICAgZXZlbnRbMV0udHlwZSA9PT0gJ2xpc3RPcmRlcmVkJykpXG4gICAgICApIHtcbiAgICAgICAgaWYgKGxpc3RJdGVtKSB7XG4gICAgICAgICAgdGFpbEluZGV4ID0gaW5kZXhcbiAgICAgICAgICBsaW5lSW5kZXggPSB1bmRlZmluZWRcblxuICAgICAgICAgIHdoaWxlICh0YWlsSW5kZXgtLSkge1xuICAgICAgICAgICAgdGFpbEV2ZW50ID0gZXZlbnRzW3RhaWxJbmRleF1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0YWlsRXZlbnRbMV0udHlwZSA9PT0gJ2xpbmVFbmRpbmcnIHx8XG4gICAgICAgICAgICAgIHRhaWxFdmVudFsxXS50eXBlID09PSAnbGluZUVuZGluZ0JsYW5rJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmICh0YWlsRXZlbnRbMF0gPT09ICdleGl0JykgY29udGludWVcblxuICAgICAgICAgICAgICBpZiAobGluZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgZXZlbnRzW2xpbmVJbmRleF1bMV0udHlwZSA9ICdsaW5lRW5kaW5nQmxhbmsnXG4gICAgICAgICAgICAgICAgbGlzdFNwcmVhZCA9IHRydWVcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRhaWxFdmVudFsxXS50eXBlID0gJ2xpbmVFbmRpbmcnXG4gICAgICAgICAgICAgIGxpbmVJbmRleCA9IHRhaWxJbmRleFxuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgdGFpbEV2ZW50WzFdLnR5cGUgPT09ICdsaW5lUHJlZml4JyB8fFxuICAgICAgICAgICAgICB0YWlsRXZlbnRbMV0udHlwZSA9PT0gJ2Jsb2NrUXVvdGVQcmVmaXgnIHx8XG4gICAgICAgICAgICAgIHRhaWxFdmVudFsxXS50eXBlID09PSAnYmxvY2tRdW90ZVByZWZpeFdoaXRlc3BhY2UnIHx8XG4gICAgICAgICAgICAgIHRhaWxFdmVudFsxXS50eXBlID09PSAnYmxvY2tRdW90ZU1hcmtlcicgfHxcbiAgICAgICAgICAgICAgdGFpbEV2ZW50WzFdLnR5cGUgPT09ICdsaXN0SXRlbUluZGVudCdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBFbXB0eVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmaXJzdEJsYW5rTGluZUluZGV4ICYmXG4gICAgICAgICAgICAoIWxpbmVJbmRleCB8fCBmaXJzdEJsYW5rTGluZUluZGV4IDwgbGluZUluZGV4KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgbGlzdEl0ZW0uX3NwcmVhZCA9IHRydWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGaXggcG9zaXRpb24uXG4gICAgICAgICAgbGlzdEl0ZW0uZW5kID0gcG9pbnQoXG4gICAgICAgICAgICBsaW5lSW5kZXggPyBldmVudHNbbGluZUluZGV4XVsxXS5zdGFydCA6IGV2ZW50WzFdLmVuZFxuICAgICAgICAgIClcblxuICAgICAgICAgIGV2ZW50cy5zcGxpY2UobGluZUluZGV4IHx8IGluZGV4LCAwLCBbJ2V4aXQnLCBsaXN0SXRlbSwgZXZlbnRbMl1dKVxuICAgICAgICAgIGluZGV4KytcbiAgICAgICAgICBsZW5ndGgrK1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGxpc3QgaXRlbS5cbiAgICAgICAgaWYgKGV2ZW50WzFdLnR5cGUgPT09ICdsaXN0SXRlbVByZWZpeCcpIHtcbiAgICAgICAgICBsaXN0SXRlbSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdsaXN0SXRlbScsXG4gICAgICAgICAgICBfc3ByZWFkOiBmYWxzZSxcbiAgICAgICAgICAgIHN0YXJ0OiBwb2ludChldmVudFsxXS5zdGFydClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBldmVudHMuc3BsaWNlKGluZGV4LCAwLCBbJ2VudGVyJywgbGlzdEl0ZW0sIGV2ZW50WzJdXSlcbiAgICAgICAgICBpbmRleCsrXG4gICAgICAgICAgbGVuZ3RoKytcbiAgICAgICAgICBmaXJzdEJsYW5rTGluZUluZGV4ID0gdW5kZWZpbmVkXG4gICAgICAgICAgYXRNYXJrZXIgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBldmVudHNbc3RhcnRdWzFdLl9zcHJlYWQgPSBsaXN0U3ByZWFkXG4gICAgcmV0dXJuIGxlbmd0aFxuICB9XG5cbiAgZnVuY3Rpb24gc2V0RGF0YShrZXksIHZhbHVlKSB7XG4gICAgZGF0YVtrZXldID0gdmFsdWVcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldERhdGEoa2V5KSB7XG4gICAgcmV0dXJuIGRhdGFba2V5XVxuICB9XG5cbiAgZnVuY3Rpb24gcG9pbnQoZCkge1xuICAgIHJldHVybiB7bGluZTogZC5saW5lLCBjb2x1bW46IGQuY29sdW1uLCBvZmZzZXQ6IGQub2Zmc2V0fVxuICB9XG5cbiAgZnVuY3Rpb24gb3BlbmVyKGNyZWF0ZSwgYW5kKSB7XG4gICAgcmV0dXJuIG9wZW5cblxuICAgIGZ1bmN0aW9uIG9wZW4odG9rZW4pIHtcbiAgICAgIGVudGVyLmNhbGwodGhpcywgY3JlYXRlKHRva2VuKSwgdG9rZW4pXG4gICAgICBpZiAoYW5kKSBhbmQuY2FsbCh0aGlzLCB0b2tlbilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBidWZmZXIoKSB7XG4gICAgdGhpcy5zdGFjay5wdXNoKHt0eXBlOiAnZnJhZ21lbnQnLCBjaGlsZHJlbjogW119KVxuICB9XG5cbiAgZnVuY3Rpb24gZW50ZXIobm9kZSwgdG9rZW4pIHtcbiAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0uY2hpbGRyZW4ucHVzaChub2RlKVxuICAgIHRoaXMuc3RhY2sucHVzaChub2RlKVxuICAgIHRoaXMudG9rZW5TdGFjay5wdXNoKHRva2VuKVxuICAgIG5vZGUucG9zaXRpb24gPSB7c3RhcnQ6IHBvaW50KHRva2VuLnN0YXJ0KX1cbiAgICByZXR1cm4gbm9kZVxuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2VyKGFuZCkge1xuICAgIHJldHVybiBjbG9zZVxuXG4gICAgZnVuY3Rpb24gY2xvc2UodG9rZW4pIHtcbiAgICAgIGlmIChhbmQpIGFuZC5jYWxsKHRoaXMsIHRva2VuKVxuICAgICAgZXhpdC5jYWxsKHRoaXMsIHRva2VuKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGV4aXQodG9rZW4pIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMuc3RhY2sucG9wKClcbiAgICB2YXIgb3BlbiA9IHRoaXMudG9rZW5TdGFjay5wb3AoKVxuXG4gICAgaWYgKCFvcGVuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgY2xvc2UgYCcgK1xuICAgICAgICAgIHRva2VuLnR5cGUgK1xuICAgICAgICAgICdgICgnICtcbiAgICAgICAgICBzdHJpbmdpZnlQb3NpdGlvbih7c3RhcnQ6IHRva2VuLnN0YXJ0LCBlbmQ6IHRva2VuLmVuZH0pICtcbiAgICAgICAgICAnKTogaXRcdTIwMTlzIG5vdCBvcGVuJ1xuICAgICAgKVxuICAgIH0gZWxzZSBpZiAob3Blbi50eXBlICE9PSB0b2tlbi50eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgY2xvc2UgYCcgK1xuICAgICAgICAgIHRva2VuLnR5cGUgK1xuICAgICAgICAgICdgICgnICtcbiAgICAgICAgICBzdHJpbmdpZnlQb3NpdGlvbih7c3RhcnQ6IHRva2VuLnN0YXJ0LCBlbmQ6IHRva2VuLmVuZH0pICtcbiAgICAgICAgICAnKTogYSBkaWZmZXJlbnQgdG9rZW4gKGAnICtcbiAgICAgICAgICBvcGVuLnR5cGUgK1xuICAgICAgICAgICdgLCAnICtcbiAgICAgICAgICBzdHJpbmdpZnlQb3NpdGlvbih7c3RhcnQ6IG9wZW4uc3RhcnQsIGVuZDogb3Blbi5lbmR9KSArXG4gICAgICAgICAgJykgaXMgb3BlbidcbiAgICAgIClcbiAgICB9XG5cbiAgICBub2RlLnBvc2l0aW9uLmVuZCA9IHBvaW50KHRva2VuLmVuZClcbiAgICByZXR1cm4gbm9kZVxuICB9XG5cbiAgZnVuY3Rpb24gcmVzdW1lKCkge1xuICAgIHJldHVybiB0b1N0cmluZyh0aGlzLnN0YWNrLnBvcCgpKVxuICB9XG5cbiAgLy9cbiAgLy8gSGFuZGxlcnMuXG4gIC8vXG5cbiAgZnVuY3Rpb24gb25lbnRlcmxpc3RvcmRlcmVkKCkge1xuICAgIHNldERhdGEoJ2V4cGVjdGluZ0ZpcnN0TGlzdEl0ZW1WYWx1ZScsIHRydWUpXG4gIH1cblxuICBmdW5jdGlvbiBvbmVudGVybGlzdGl0ZW12YWx1ZSh0b2tlbikge1xuICAgIGlmIChnZXREYXRhKCdleHBlY3RpbmdGaXJzdExpc3RJdGVtVmFsdWUnKSkge1xuICAgICAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDJdLnN0YXJ0ID0gcGFyc2VJbnQoXG4gICAgICAgIHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pLFxuICAgICAgICAxMFxuICAgICAgKVxuXG4gICAgICBzZXREYXRhKCdleHBlY3RpbmdGaXJzdExpc3RJdGVtVmFsdWUnKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdGNvZGVmZW5jZWRmZW5jZWluZm8oKSB7XG4gICAgdmFyIGRhdGEgPSB0aGlzLnJlc3VtZSgpXG4gICAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdLmxhbmcgPSBkYXRhXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRjb2RlZmVuY2VkZmVuY2VtZXRhKCkge1xuICAgIHZhciBkYXRhID0gdGhpcy5yZXN1bWUoKVxuICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXS5tZXRhID0gZGF0YVxuICB9XG5cbiAgZnVuY3Rpb24gb25leGl0Y29kZWZlbmNlZGZlbmNlKCkge1xuICAgIC8vIEV4aXQgaWYgdGhpcyBpcyB0aGUgY2xvc2luZyBmZW5jZS5cbiAgICBpZiAoZ2V0RGF0YSgnZmxvd0NvZGVJbnNpZGUnKSkgcmV0dXJuXG4gICAgdGhpcy5idWZmZXIoKVxuICAgIHNldERhdGEoJ2Zsb3dDb2RlSW5zaWRlJywgdHJ1ZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdGNvZGVmZW5jZWQoKSB7XG4gICAgdmFyIGRhdGEgPSB0aGlzLnJlc3VtZSgpXG4gICAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdLnZhbHVlID0gZGF0YS5yZXBsYWNlKFxuICAgICAgL14oXFxyP1xcbnxcXHIpfChcXHI/XFxufFxccikkL2csXG4gICAgICAnJ1xuICAgIClcblxuICAgIHNldERhdGEoJ2Zsb3dDb2RlSW5zaWRlJylcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdGNvZGVpbmRlbnRlZCgpIHtcbiAgICB2YXIgZGF0YSA9IHRoaXMucmVzdW1lKClcbiAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0udmFsdWUgPSBkYXRhXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRkZWZpbml0aW9ubGFiZWxzdHJpbmcodG9rZW4pIHtcbiAgICAvLyBEaXNjYXJkIGxhYmVsLCB1c2UgdGhlIHNvdXJjZSBjb250ZW50IGluc3RlYWQuXG4gICAgdmFyIGxhYmVsID0gdGhpcy5yZXN1bWUoKVxuICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXS5sYWJlbCA9IGxhYmVsXG4gICAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdLmlkZW50aWZpZXIgPSBub3JtYWxpemVJZGVudGlmaWVyKFxuICAgICAgdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbilcbiAgICApLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdGRlZmluaXRpb250aXRsZXN0cmluZygpIHtcbiAgICB2YXIgZGF0YSA9IHRoaXMucmVzdW1lKClcbiAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0udGl0bGUgPSBkYXRhXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRkZWZpbml0aW9uZGVzdGluYXRpb25zdHJpbmcoKSB7XG4gICAgdmFyIGRhdGEgPSB0aGlzLnJlc3VtZSgpXG4gICAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdLnVybCA9IGRhdGFcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdGF0eGhlYWRpbmdzZXF1ZW5jZSh0b2tlbikge1xuICAgIGlmICghdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdLmRlcHRoKSB7XG4gICAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0uZGVwdGggPSB0aGlzLnNsaWNlU2VyaWFsaXplKFxuICAgICAgICB0b2tlblxuICAgICAgKS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRzZXRleHRoZWFkaW5ndGV4dCgpIHtcbiAgICBzZXREYXRhKCdzZXRleHRIZWFkaW5nU2x1cnBMaW5lRW5kaW5nJywgdHJ1ZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdHNldGV4dGhlYWRpbmdsaW5lc2VxdWVuY2UodG9rZW4pIHtcbiAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0uZGVwdGggPVxuICAgICAgdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbikuY2hhckNvZGVBdCgwKSA9PT0gNjEgPyAxIDogMlxuICB9XG5cbiAgZnVuY3Rpb24gb25leGl0c2V0ZXh0aGVhZGluZygpIHtcbiAgICBzZXREYXRhKCdzZXRleHRIZWFkaW5nU2x1cnBMaW5lRW5kaW5nJylcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZW50ZXJkYXRhKHRva2VuKSB7XG4gICAgdmFyIHNpYmxpbmdzID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdLmNoaWxkcmVuXG4gICAgdmFyIHRhaWwgPSBzaWJsaW5nc1tzaWJsaW5ncy5sZW5ndGggLSAxXVxuXG4gICAgaWYgKCF0YWlsIHx8IHRhaWwudHlwZSAhPT0gJ3RleHQnKSB7XG4gICAgICAvLyBBZGQgYSBuZXcgdGV4dCBub2RlLlxuICAgICAgdGFpbCA9IHRleHQoKVxuICAgICAgdGFpbC5wb3NpdGlvbiA9IHtzdGFydDogcG9pbnQodG9rZW4uc3RhcnQpfVxuICAgICAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdLmNoaWxkcmVuLnB1c2godGFpbClcbiAgICB9XG5cbiAgICB0aGlzLnN0YWNrLnB1c2godGFpbClcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdGRhdGEodG9rZW4pIHtcbiAgICB2YXIgdGFpbCA9IHRoaXMuc3RhY2sucG9wKClcbiAgICB0YWlsLnZhbHVlICs9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pXG4gICAgdGFpbC5wb3NpdGlvbi5lbmQgPSBwb2ludCh0b2tlbi5lbmQpXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRsaW5lZW5kaW5nKHRva2VuKSB7XG4gICAgdmFyIGNvbnRleHQgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV1cblxuICAgIC8vIElmIHdlXHUyMDE5cmUgYXQgYSBoYXJkIGJyZWFrLCBpbmNsdWRlIHRoZSBsaW5lIGVuZGluZyBpbiB0aGVyZS5cbiAgICBpZiAoZ2V0RGF0YSgnYXRIYXJkQnJlYWsnKSkge1xuICAgICAgY29udGV4dC5jaGlsZHJlbltjb250ZXh0LmNoaWxkcmVuLmxlbmd0aCAtIDFdLnBvc2l0aW9uLmVuZCA9IHBvaW50KFxuICAgICAgICB0b2tlbi5lbmRcbiAgICAgIClcblxuICAgICAgc2V0RGF0YSgnYXRIYXJkQnJlYWsnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgIWdldERhdGEoJ3NldGV4dEhlYWRpbmdTbHVycExpbmVFbmRpbmcnKSAmJlxuICAgICAgY29uZmlnLmNhbkNvbnRhaW5Fb2xzLmluZGV4T2YoY29udGV4dC50eXBlKSA+IC0xXG4gICAgKSB7XG4gICAgICBvbmVudGVyZGF0YS5jYWxsKHRoaXMsIHRva2VuKVxuICAgICAgb25leGl0ZGF0YS5jYWxsKHRoaXMsIHRva2VuKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdGhhcmRicmVhaygpIHtcbiAgICBzZXREYXRhKCdhdEhhcmRCcmVhaycsIHRydWUpXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRodG1sZmxvdygpIHtcbiAgICB2YXIgZGF0YSA9IHRoaXMucmVzdW1lKClcbiAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0udmFsdWUgPSBkYXRhXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRodG1sdGV4dCgpIHtcbiAgICB2YXIgZGF0YSA9IHRoaXMucmVzdW1lKClcbiAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0udmFsdWUgPSBkYXRhXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRjb2RldGV4dCgpIHtcbiAgICB2YXIgZGF0YSA9IHRoaXMucmVzdW1lKClcbiAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0udmFsdWUgPSBkYXRhXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRsaW5rKCkge1xuICAgIHZhciBjb250ZXh0ID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdXG5cbiAgICAvLyBUbyBkbzogY2xlYW4uXG4gICAgaWYgKGdldERhdGEoJ2luUmVmZXJlbmNlJykpIHtcbiAgICAgIGNvbnRleHQudHlwZSArPSAnUmVmZXJlbmNlJ1xuICAgICAgY29udGV4dC5yZWZlcmVuY2VUeXBlID0gZ2V0RGF0YSgncmVmZXJlbmNlVHlwZScpIHx8ICdzaG9ydGN1dCdcbiAgICAgIGRlbGV0ZSBjb250ZXh0LnVybFxuICAgICAgZGVsZXRlIGNvbnRleHQudGl0bGVcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGNvbnRleHQuaWRlbnRpZmllclxuICAgICAgZGVsZXRlIGNvbnRleHQubGFiZWxcbiAgICAgIGRlbGV0ZSBjb250ZXh0LnJlZmVyZW5jZVR5cGVcbiAgICB9XG5cbiAgICBzZXREYXRhKCdyZWZlcmVuY2VUeXBlJylcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdGltYWdlKCkge1xuICAgIHZhciBjb250ZXh0ID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdXG5cbiAgICAvLyBUbyBkbzogY2xlYW4uXG4gICAgaWYgKGdldERhdGEoJ2luUmVmZXJlbmNlJykpIHtcbiAgICAgIGNvbnRleHQudHlwZSArPSAnUmVmZXJlbmNlJ1xuICAgICAgY29udGV4dC5yZWZlcmVuY2VUeXBlID0gZ2V0RGF0YSgncmVmZXJlbmNlVHlwZScpIHx8ICdzaG9ydGN1dCdcbiAgICAgIGRlbGV0ZSBjb250ZXh0LnVybFxuICAgICAgZGVsZXRlIGNvbnRleHQudGl0bGVcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGNvbnRleHQuaWRlbnRpZmllclxuICAgICAgZGVsZXRlIGNvbnRleHQubGFiZWxcbiAgICAgIGRlbGV0ZSBjb250ZXh0LnJlZmVyZW5jZVR5cGVcbiAgICB9XG5cbiAgICBzZXREYXRhKCdyZWZlcmVuY2VUeXBlJylcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdGxhYmVsdGV4dCh0b2tlbikge1xuICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAyXS5pZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcihcbiAgICAgIHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pXG4gICAgKS50b0xvd2VyQ2FzZSgpXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRsYWJlbCgpIHtcbiAgICB2YXIgZnJhZ21lbnQgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV1cbiAgICB2YXIgdmFsdWUgPSB0aGlzLnJlc3VtZSgpXG5cbiAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0ubGFiZWwgPSB2YWx1ZVxuXG4gICAgLy8gQXNzdW1lIGEgcmVmZXJlbmNlLlxuICAgIHNldERhdGEoJ2luUmVmZXJlbmNlJywgdHJ1ZSlcblxuICAgIGlmICh0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0udHlwZSA9PT0gJ2xpbmsnKSB7XG4gICAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0uY2hpbGRyZW4gPSBmcmFnbWVudC5jaGlsZHJlblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0uYWx0ID0gdmFsdWVcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRyZXNvdXJjZWRlc3RpbmF0aW9uc3RyaW5nKCkge1xuICAgIHZhciBkYXRhID0gdGhpcy5yZXN1bWUoKVxuICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXS51cmwgPSBkYXRhXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRyZXNvdXJjZXRpdGxlc3RyaW5nKCkge1xuICAgIHZhciBkYXRhID0gdGhpcy5yZXN1bWUoKVxuICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXS50aXRsZSA9IGRhdGFcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdHJlc291cmNlKCkge1xuICAgIHNldERhdGEoJ2luUmVmZXJlbmNlJylcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZW50ZXJyZWZlcmVuY2UoKSB7XG4gICAgc2V0RGF0YSgncmVmZXJlbmNlVHlwZScsICdjb2xsYXBzZWQnKVxuICB9XG5cbiAgZnVuY3Rpb24gb25leGl0cmVmZXJlbmNlc3RyaW5nKHRva2VuKSB7XG4gICAgdmFyIGxhYmVsID0gdGhpcy5yZXN1bWUoKVxuICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXS5sYWJlbCA9IGxhYmVsXG4gICAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdLmlkZW50aWZpZXIgPSBub3JtYWxpemVJZGVudGlmaWVyKFxuICAgICAgdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbilcbiAgICApLnRvTG93ZXJDYXNlKClcbiAgICBzZXREYXRhKCdyZWZlcmVuY2VUeXBlJywgJ2Z1bGwnKVxuICB9XG5cbiAgZnVuY3Rpb24gb25leGl0Y2hhcmFjdGVycmVmZXJlbmNlbWFya2VyKHRva2VuKSB7XG4gICAgc2V0RGF0YSgnY2hhcmFjdGVyUmVmZXJlbmNlVHlwZScsIHRva2VuLnR5cGUpXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2V2YWx1ZSh0b2tlbikge1xuICAgIHZhciBkYXRhID0gdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbilcbiAgICB2YXIgdHlwZSA9IGdldERhdGEoJ2NoYXJhY3RlclJlZmVyZW5jZVR5cGUnKVxuICAgIHZhciB2YWx1ZVxuICAgIHZhciB0YWlsXG5cbiAgICBpZiAodHlwZSkge1xuICAgICAgdmFsdWUgPSBzYWZlRnJvbUludChcbiAgICAgICAgZGF0YSxcbiAgICAgICAgdHlwZSA9PT0gJ2NoYXJhY3RlclJlZmVyZW5jZU1hcmtlck51bWVyaWMnID8gMTAgOiAxNlxuICAgICAgKVxuXG4gICAgICBzZXREYXRhKCdjaGFyYWN0ZXJSZWZlcmVuY2VUeXBlJylcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSBkZWNvZGUoZGF0YSlcbiAgICB9XG5cbiAgICB0YWlsID0gdGhpcy5zdGFjay5wb3AoKVxuICAgIHRhaWwudmFsdWUgKz0gdmFsdWVcbiAgICB0YWlsLnBvc2l0aW9uLmVuZCA9IHBvaW50KHRva2VuLmVuZClcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZXhpdGF1dG9saW5rcHJvdG9jb2wodG9rZW4pIHtcbiAgICBvbmV4aXRkYXRhLmNhbGwodGhpcywgdG9rZW4pXG4gICAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdLnVybCA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pXG4gIH1cblxuICBmdW5jdGlvbiBvbmV4aXRhdXRvbGlua2VtYWlsKHRva2VuKSB7XG4gICAgb25leGl0ZGF0YS5jYWxsKHRoaXMsIHRva2VuKVxuICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXS51cmwgPVxuICAgICAgJ21haWx0bzonICsgdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbilcbiAgfVxuXG4gIC8vXG4gIC8vIENyZWF0ZXJzLlxuICAvL1xuXG4gIGZ1bmN0aW9uIGJsb2NrUXVvdGUoKSB7XG4gICAgcmV0dXJuIHt0eXBlOiAnYmxvY2txdW90ZScsIGNoaWxkcmVuOiBbXX1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvZGVGbG93KCkge1xuICAgIHJldHVybiB7dHlwZTogJ2NvZGUnLCBsYW5nOiBudWxsLCBtZXRhOiBudWxsLCB2YWx1ZTogJyd9XG4gIH1cblxuICBmdW5jdGlvbiBjb2RlVGV4dCgpIHtcbiAgICByZXR1cm4ge3R5cGU6ICdpbmxpbmVDb2RlJywgdmFsdWU6ICcnfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVmaW5pdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2RlZmluaXRpb24nLFxuICAgICAgaWRlbnRpZmllcjogJycsXG4gICAgICBsYWJlbDogbnVsbCxcbiAgICAgIHRpdGxlOiBudWxsLFxuICAgICAgdXJsOiAnJ1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVtcGhhc2lzKCkge1xuICAgIHJldHVybiB7dHlwZTogJ2VtcGhhc2lzJywgY2hpbGRyZW46IFtdfVxuICB9XG5cbiAgZnVuY3Rpb24gaGVhZGluZygpIHtcbiAgICByZXR1cm4ge3R5cGU6ICdoZWFkaW5nJywgZGVwdGg6IHVuZGVmaW5lZCwgY2hpbGRyZW46IFtdfVxuICB9XG5cbiAgZnVuY3Rpb24gaGFyZEJyZWFrKCkge1xuICAgIHJldHVybiB7dHlwZTogJ2JyZWFrJ31cbiAgfVxuXG4gIGZ1bmN0aW9uIGh0bWwoKSB7XG4gICAgcmV0dXJuIHt0eXBlOiAnaHRtbCcsIHZhbHVlOiAnJ31cbiAgfVxuXG4gIGZ1bmN0aW9uIGltYWdlKCkge1xuICAgIHJldHVybiB7dHlwZTogJ2ltYWdlJywgdGl0bGU6IG51bGwsIHVybDogJycsIGFsdDogbnVsbH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxpbmsoKSB7XG4gICAgcmV0dXJuIHt0eXBlOiAnbGluaycsIHRpdGxlOiBudWxsLCB1cmw6ICcnLCBjaGlsZHJlbjogW119XG4gIH1cblxuICBmdW5jdGlvbiBsaXN0KHRva2VuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdsaXN0JyxcbiAgICAgIG9yZGVyZWQ6IHRva2VuLnR5cGUgPT09ICdsaXN0T3JkZXJlZCcsXG4gICAgICBzdGFydDogbnVsbCxcbiAgICAgIHNwcmVhZDogdG9rZW4uX3NwcmVhZCxcbiAgICAgIGNoaWxkcmVuOiBbXVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxpc3RJdGVtKHRva2VuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdsaXN0SXRlbScsXG4gICAgICBzcHJlYWQ6IHRva2VuLl9zcHJlYWQsXG4gICAgICBjaGVja2VkOiBudWxsLFxuICAgICAgY2hpbGRyZW46IFtdXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGFyYWdyYXBoKCkge1xuICAgIHJldHVybiB7dHlwZTogJ3BhcmFncmFwaCcsIGNoaWxkcmVuOiBbXX1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0cm9uZygpIHtcbiAgICByZXR1cm4ge3R5cGU6ICdzdHJvbmcnLCBjaGlsZHJlbjogW119XG4gIH1cblxuICBmdW5jdGlvbiB0ZXh0KCkge1xuICAgIHJldHVybiB7dHlwZTogJ3RleHQnLCB2YWx1ZTogJyd9XG4gIH1cblxuICBmdW5jdGlvbiB0aGVtYXRpY0JyZWFrKCkge1xuICAgIHJldHVybiB7dHlwZTogJ3RoZW1hdGljQnJlYWsnfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZShjb25maWcsIGV4dGVuc2lvbnMpIHtcbiAgdmFyIGluZGV4ID0gLTFcblxuICB3aGlsZSAoKytpbmRleCA8IGV4dGVuc2lvbnMubGVuZ3RoKSB7XG4gICAgZXh0ZW5zaW9uKGNvbmZpZywgZXh0ZW5zaW9uc1tpbmRleF0pXG4gIH1cblxuICByZXR1cm4gY29uZmlnXG59XG5cbmZ1bmN0aW9uIGV4dGVuc2lvbihjb25maWcsIGV4dGVuc2lvbikge1xuICB2YXIga2V5XG4gIHZhciBsZWZ0XG5cbiAgZm9yIChrZXkgaW4gZXh0ZW5zaW9uKSB7XG4gICAgbGVmdCA9IG93bi5jYWxsKGNvbmZpZywga2V5KSA/IGNvbmZpZ1trZXldIDogKGNvbmZpZ1trZXldID0ge30pXG5cbiAgICBpZiAoa2V5ID09PSAnY2FuQ29udGFpbkVvbHMnIHx8IGtleSA9PT0gJ3RyYW5zZm9ybXMnKSB7XG4gICAgICBjb25maWdba2V5XSA9IFtdLmNvbmNhdChsZWZ0LCBleHRlbnNpb25ba2V5XSlcbiAgICB9IGVsc2Uge1xuICAgICAgT2JqZWN0LmFzc2lnbihsZWZ0LCBleHRlbnNpb25ba2V5XSlcbiAgICB9XG4gIH1cbn1cbiIsICIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Rpc3QnKVxuIiwgIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlXG5cbnZhciBmcm9tTWFya2Rvd24gPSByZXF1aXJlKCdtZGFzdC11dGlsLWZyb20tbWFya2Rvd24nKVxuXG5mdW5jdGlvbiBwYXJzZShvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIHRoaXMuUGFyc2VyID0gcGFyc2VcblxuICBmdW5jdGlvbiBwYXJzZShkb2MpIHtcbiAgICByZXR1cm4gZnJvbU1hcmtkb3duKFxuICAgICAgZG9jLFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgc2VsZi5kYXRhKCdzZXR0aW5ncycpLCBvcHRpb25zLCB7XG4gICAgICAgIC8vIE5vdGU6IHRoZXNlIG9wdGlvbnMgYXJlIG5vdCBpbiB0aGUgcmVhZG1lLlxuICAgICAgICAvLyBUaGUgZ29hbCBpcyBmb3IgdGhlbSB0byBiZSBzZXQgYnkgcGx1Z2lucyBvbiBgZGF0YWAgaW5zdGVhZCBvZiBiZWluZ1xuICAgICAgICAvLyBwYXNzZWQgYnkgdXNlcnMuXG4gICAgICAgIGV4dGVuc2lvbnM6IHNlbGYuZGF0YSgnbWljcm9tYXJrRXh0ZW5zaW9ucycpIHx8IFtdLFxuICAgICAgICBtZGFzdEV4dGVuc2lvbnM6IHNlbGYuZGF0YSgnZnJvbU1hcmtkb3duRXh0ZW5zaW9ucycpIHx8IFtdXG4gICAgICB9KVxuICAgIClcbiAgfVxufVxuIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgInZhciBhc2NpaUFscGhhID0gcmVxdWlyZSgnbWljcm9tYXJrL2Rpc3QvY2hhcmFjdGVyL2FzY2lpLWFscGhhJylcbnZhciBhc2NpaUFscGhhbnVtZXJpYyA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L2NoYXJhY3Rlci9hc2NpaS1hbHBoYW51bWVyaWMnKVxudmFyIGFzY2lpQ29udHJvbCA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L2NoYXJhY3Rlci9hc2NpaS1jb250cm9sJylcbnZhciBtYXJrZG93bkxpbmVFbmRpbmcgPSByZXF1aXJlKCdtaWNyb21hcmsvZGlzdC9jaGFyYWN0ZXIvbWFya2Rvd24tbGluZS1lbmRpbmcnKVxudmFyIHVuaWNvZGVQdW5jdHVhdGlvbiA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L2NoYXJhY3Rlci91bmljb2RlLXB1bmN0dWF0aW9uJylcbnZhciB1bmljb2RlV2hpdGVzcGFjZSA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L2NoYXJhY3Rlci91bmljb2RlLXdoaXRlc3BhY2UnKVxuXG52YXIgd3d3ID0ge3Rva2VuaXplOiB0b2tlbml6ZVd3dywgcGFydGlhbDogdHJ1ZX1cbnZhciBkb21haW4gPSB7dG9rZW5pemU6IHRva2VuaXplRG9tYWluLCBwYXJ0aWFsOiB0cnVlfVxudmFyIHBhdGggPSB7dG9rZW5pemU6IHRva2VuaXplUGF0aCwgcGFydGlhbDogdHJ1ZX1cbnZhciBwdW5jdHVhdGlvbiA9IHt0b2tlbml6ZTogdG9rZW5pemVQdW5jdHVhdGlvbiwgcGFydGlhbDogdHJ1ZX1cbnZhciBuYW1lZENoYXJhY3RlclJlZmVyZW5jZSA9IHtcbiAgdG9rZW5pemU6IHRva2VuaXplTmFtZWRDaGFyYWN0ZXJSZWZlcmVuY2UsXG4gIHBhcnRpYWw6IHRydWVcbn1cblxudmFyIHd3d0F1dG9saW5rID0ge3Rva2VuaXplOiB0b2tlbml6ZVd3d0F1dG9saW5rLCBwcmV2aW91czogcHJldmlvdXNXd3d9XG52YXIgaHR0cEF1dG9saW5rID0ge3Rva2VuaXplOiB0b2tlbml6ZUh0dHBBdXRvbGluaywgcHJldmlvdXM6IHByZXZpb3VzSHR0cH1cbnZhciBlbWFpbEF1dG9saW5rID0ge3Rva2VuaXplOiB0b2tlbml6ZUVtYWlsQXV0b2xpbmssIHByZXZpb3VzOiBwcmV2aW91c0VtYWlsfVxuXG52YXIgdGV4dCA9IHt9XG5cbi8vIEV4cG9ydCBob29rZWQgY29uc3RydWN0cy5cbmV4cG9ydHMudGV4dCA9IHRleHRcblxuLy8gYDBgXG52YXIgY29kZSA9IDQ4XG5cbi8vIFdoaWxlIHRoZSBjb2RlIGlzIHNtYWxsZXIgdGhhbiBge2AuXG53aGlsZSAoY29kZSA8IDEyMykge1xuICB0ZXh0W2NvZGVdID0gZW1haWxBdXRvbGlua1xuICBjb2RlKytcbiAgLy8gSnVtcCBmcm9tIGA6YCAtPiBgQWBcbiAgaWYgKGNvZGUgPT09IDU4KSBjb2RlID0gNjVcbiAgLy8gSnVtcCBmcm9tIGBbYCAtPiBgYWBcbiAgZWxzZSBpZiAoY29kZSA9PT0gOTEpIGNvZGUgPSA5N1xufVxuXG4vLyBgK2BcbnRleHRbNDNdID0gZW1haWxBdXRvbGlua1xuLy8gYC1gXG50ZXh0WzQ1XSA9IGVtYWlsQXV0b2xpbmtcbi8vIGAuYFxudGV4dFs0Nl0gPSBlbWFpbEF1dG9saW5rXG4vLyBgX2BcbnRleHRbOTVdID0gZW1haWxBdXRvbGlua1xuLy8gYGhgLlxudGV4dFs3Ml0gPSBbZW1haWxBdXRvbGluaywgaHR0cEF1dG9saW5rXVxudGV4dFsxMDRdID0gW2VtYWlsQXV0b2xpbmssIGh0dHBBdXRvbGlua11cbi8vIGB3YC5cbnRleHRbODddID0gW2VtYWlsQXV0b2xpbmssIHd3d0F1dG9saW5rXVxudGV4dFsxMTldID0gW2VtYWlsQXV0b2xpbmssIHd3d0F1dG9saW5rXVxuXG5mdW5jdGlvbiB0b2tlbml6ZUVtYWlsQXV0b2xpbmsoZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIGhhc0RvdFxuXG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAtIGhvb2tzLiAqL1xuICAgIGlmIChcbiAgICAgICFnZm1BdGV4dChjb2RlKSB8fFxuICAgICAgIXByZXZpb3VzRW1haWwoc2VsZi5wcmV2aW91cykgfHxcbiAgICAgIHByZXZpb3VzKHNlbGYuZXZlbnRzKVxuICAgICkge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuZW50ZXIoJ2xpdGVyYWxBdXRvbGluaycpXG4gICAgZWZmZWN0cy5lbnRlcignbGl0ZXJhbEF1dG9saW5rRW1haWwnKVxuICAgIHJldHVybiBhdGV4dChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gYXRleHQoY29kZSkge1xuICAgIGlmIChnZm1BdGV4dChjb2RlKSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gYXRleHRcbiAgICB9XG5cbiAgICAvLyBgQGBcbiAgICBpZiAoY29kZSA9PT0gNjQpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGxhYmVsXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gbGFiZWwoY29kZSkge1xuICAgIC8vIGAuYFxuICAgIGlmIChjb2RlID09PSA0Nikge1xuICAgICAgcmV0dXJuIGVmZmVjdHMuY2hlY2socHVuY3R1YXRpb24sIGRvbmUsIGRvdENvbnRpbnVhdGlvbikoY29kZSlcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAvLyBgLWBcbiAgICAgIGNvZGUgPT09IDQ1IHx8XG4gICAgICAvLyBgX2BcbiAgICAgIGNvZGUgPT09IDk1XG4gICAgKSB7XG4gICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhwdW5jdHVhdGlvbiwgbm9rLCBkYXNoT3JVbmRlcnNjb3JlQ29udGludWF0aW9uKShjb2RlKVxuICAgIH1cblxuICAgIGlmIChhc2NpaUFscGhhbnVtZXJpYyhjb2RlKSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gbGFiZWxcbiAgICB9XG5cbiAgICByZXR1cm4gZG9uZShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZG90Q29udGludWF0aW9uKGNvZGUpIHtcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBoYXNEb3QgPSB0cnVlXG4gICAgcmV0dXJuIGxhYmVsXG4gIH1cblxuICBmdW5jdGlvbiBkYXNoT3JVbmRlcnNjb3JlQ29udGludWF0aW9uKGNvZGUpIHtcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICByZXR1cm4gYWZ0ZXJEYXNoT3JVbmRlcnNjb3JlXG4gIH1cblxuICBmdW5jdGlvbiBhZnRlckRhc2hPclVuZGVyc2NvcmUoY29kZSkge1xuICAgIC8vIGAuYFxuICAgIGlmIChjb2RlID09PSA0Nikge1xuICAgICAgcmV0dXJuIGVmZmVjdHMuY2hlY2socHVuY3R1YXRpb24sIG5vaywgZG90Q29udGludWF0aW9uKShjb2RlKVxuICAgIH1cblxuICAgIHJldHVybiBsYWJlbChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZG9uZShjb2RlKSB7XG4gICAgaWYgKGhhc0RvdCkge1xuICAgICAgZWZmZWN0cy5leGl0KCdsaXRlcmFsQXV0b2xpbmtFbWFpbCcpXG4gICAgICBlZmZlY3RzLmV4aXQoJ2xpdGVyYWxBdXRvbGluaycpXG4gICAgICByZXR1cm4gb2soY29kZSlcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gdG9rZW5pemVXd3dBdXRvbGluayhlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIHJldHVybiBzdGFydFxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGNvZGUpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAtIGhvb2tzLiAqL1xuICAgIGlmIChcbiAgICAgIChjb2RlICE9PSA4NyAmJiBjb2RlIC0gMzIgIT09IDg3KSB8fFxuICAgICAgIXByZXZpb3VzV3d3KHNlbGYucHJldmlvdXMpIHx8XG4gICAgICBwcmV2aW91cyhzZWxmLmV2ZW50cylcbiAgICApIHtcbiAgICAgIHJldHVybiBub2soY29kZSlcbiAgICB9XG5cbiAgICBlZmZlY3RzLmVudGVyKCdsaXRlcmFsQXV0b2xpbmsnKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2xpdGVyYWxBdXRvbGlua1d3dycpXG4gICAgLy8gRm9yIGB3d3cuYCB3ZSBjaGVjayBpbnN0ZWFkIG9mIGF0dGVtcHQsIGJlY2F1c2Ugd2hlbiBpdCBtYXRjaGVzLCBHSFxuICAgIC8vIHRyZWF0cyBpdCBhcyBwYXJ0IG9mIGEgZG9tYWluICh5ZXMsIGl0IHNheXMgYSB2YWxpZCBkb21haW4gbXVzdCBjb21lXG4gICAgLy8gYWZ0ZXIgYHd3dy5gLCBidXQgdGhhdFx1MjAxOXMgbm90IGhvdyBpdFx1MjAxOXMgaW1wbGVtZW50ZWQgYnkgdGhlbSkuXG4gICAgcmV0dXJuIGVmZmVjdHMuY2hlY2soXG4gICAgICB3d3csXG4gICAgICBlZmZlY3RzLmF0dGVtcHQoZG9tYWluLCBlZmZlY3RzLmF0dGVtcHQocGF0aCwgZG9uZSksIG5vayksXG4gICAgICBub2tcbiAgICApKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBkb25lKGNvZGUpIHtcbiAgICBlZmZlY3RzLmV4aXQoJ2xpdGVyYWxBdXRvbGlua1d3dycpXG4gICAgZWZmZWN0cy5leGl0KCdsaXRlcmFsQXV0b2xpbmsnKVxuICAgIHJldHVybiBvayhjb2RlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplSHR0cEF1dG9saW5rKGVmZmVjdHMsIG9rLCBub2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0gaG9va3MuICovXG4gICAgaWYgKFxuICAgICAgKGNvZGUgIT09IDcyICYmIGNvZGUgLSAzMiAhPT0gNzIpIHx8XG4gICAgICAhcHJldmlvdXNIdHRwKHNlbGYucHJldmlvdXMpIHx8XG4gICAgICBwcmV2aW91cyhzZWxmLmV2ZW50cylcbiAgICApIHtcbiAgICAgIHJldHVybiBub2soY29kZSlcbiAgICB9XG5cbiAgICBlZmZlY3RzLmVudGVyKCdsaXRlcmFsQXV0b2xpbmsnKVxuICAgIGVmZmVjdHMuZW50ZXIoJ2xpdGVyYWxBdXRvbGlua0h0dHAnKVxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiB0MVxuICB9XG5cbiAgZnVuY3Rpb24gdDEoY29kZSkge1xuICAgIC8vIGB0YFxuICAgIGlmIChjb2RlID09PSA4NCB8fCBjb2RlIC0gMzIgPT09IDg0KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiB0MlxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHQyKGNvZGUpIHtcbiAgICAvLyBgdGBcbiAgICBpZiAoY29kZSA9PT0gODQgfHwgY29kZSAtIDMyID09PSA4NCkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gcFxuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHAoY29kZSkge1xuICAgIC8vIGBwYFxuICAgIGlmIChjb2RlID09PSA4MCB8fCBjb2RlIC0gMzIgPT09IDgwKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBzXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gcyhjb2RlKSB7XG4gICAgLy8gYHNgXG4gICAgaWYgKGNvZGUgPT09IDgzIHx8IGNvZGUgLSAzMiA9PT0gODMpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGNvbG9uXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbG9uKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjb2xvbihjb2RlKSB7XG4gICAgLy8gYDpgXG4gICAgaWYgKGNvZGUgPT09IDU4KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBzbGFzaDFcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBzbGFzaDEoY29kZSkge1xuICAgIC8vIGAvYFxuICAgIGlmIChjb2RlID09PSA0Nykge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gc2xhc2gyXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gc2xhc2gyKGNvZGUpIHtcbiAgICAvLyBgL2BcbiAgICBpZiAoY29kZSA9PT0gNDcpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGFmdGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gYWZ0ZXIoY29kZSkge1xuICAgIHJldHVybiBhc2NpaUNvbnRyb2woY29kZSkgfHxcbiAgICAgIHVuaWNvZGVXaGl0ZXNwYWNlKGNvZGUpIHx8XG4gICAgICB1bmljb2RlUHVuY3R1YXRpb24oY29kZSlcbiAgICAgID8gbm9rKGNvZGUpXG4gICAgICA6IGVmZmVjdHMuYXR0ZW1wdChkb21haW4sIGVmZmVjdHMuYXR0ZW1wdChwYXRoLCBkb25lKSwgbm9rKShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZG9uZShjb2RlKSB7XG4gICAgZWZmZWN0cy5leGl0KCdsaXRlcmFsQXV0b2xpbmtIdHRwJylcbiAgICBlZmZlY3RzLmV4aXQoJ2xpdGVyYWxBdXRvbGluaycpXG4gICAgcmV0dXJuIG9rKGNvZGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gdG9rZW5pemVXd3coZWZmZWN0cywgb2ssIG5vaykge1xuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgLy8gQXNzdW1lIGEgYHdgLlxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiB3MlxuICB9XG5cbiAgZnVuY3Rpb24gdzIoY29kZSkge1xuICAgIC8vIGB3YFxuICAgIGlmIChjb2RlID09PSA4NyB8fCBjb2RlIC0gMzIgPT09IDg3KSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiB3M1xuICAgIH1cblxuICAgIHJldHVybiBub2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHczKGNvZGUpIHtcbiAgICAvLyBgd2BcbiAgICBpZiAoY29kZSA9PT0gODcgfHwgY29kZSAtIDMyID09PSA4Nykge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gZG90XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gZG90KGNvZGUpIHtcbiAgICAvLyBgLmBcbiAgICBpZiAoY29kZSA9PT0gNDYpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGFmdGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gYWZ0ZXIoY29kZSkge1xuICAgIHJldHVybiBjb2RlID09PSBudWxsIHx8IG1hcmtkb3duTGluZUVuZGluZyhjb2RlKSA/IG5vayhjb2RlKSA6IG9rKGNvZGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gdG9rZW5pemVEb21haW4oZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgaGFzVW5kZXJzY29yZUluTGFzdFNlZ21lbnRcbiAgdmFyIGhhc1VuZGVyc2NvcmVJbkxhc3RMYXN0U2VnbWVudFxuXG4gIHJldHVybiBkb21haW5cblxuICBmdW5jdGlvbiBkb21haW4oY29kZSkge1xuICAgIC8vIGAmYFxuICAgIGlmIChjb2RlID09PSAzOCkge1xuICAgICAgcmV0dXJuIGVmZmVjdHMuY2hlY2soXG4gICAgICAgIG5hbWVkQ2hhcmFjdGVyUmVmZXJlbmNlLFxuICAgICAgICBkb25lLFxuICAgICAgICBwdW5jdHVhdGlvbkNvbnRpbnVhdGlvblxuICAgICAgKShjb2RlKVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA0NiAvKiBgLmAgKi8gfHwgY29kZSA9PT0gOTUgLyogYF9gICovKSB7XG4gICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhwdW5jdHVhdGlvbiwgZG9uZSwgcHVuY3R1YXRpb25Db250aW51YXRpb24pKGNvZGUpXG4gICAgfVxuXG4gICAgLy8gR0ggZG9jdW1lbnRzIHRoYXQgb25seSBhbHBoYW51bWVyaWNzIChvdGhlciB0aGFuIGAtYCwgYC5gLCBhbmQgYF9gKSBjYW5cbiAgICAvLyBvY2N1ciwgd2hpY2ggc291bmRzIGxpa2UgQVNDSUkgb25seSwgYnV0IHRoZXkgYWxzbyBzdXBwb3J0IGB3d3cuXHU5RURFXHU3NzBCLmNvbWAsXG4gICAgLy8gc28gdGhhdFx1MjAxOXMgVW5pY29kZS5cbiAgICAvLyBJbnN0ZWFkIG9mIHNvbWUgbmV3IHByb2R1Y3Rpb24gZm9yIFVuaWNvZGUgYWxwaGFudW1lcmljcywgbWFya2Rvd25cbiAgICAvLyBhbHJlYWR5IGhhcyB0aGF0IGZvciBVbmljb2RlIHB1bmN0dWF0aW9uIGFuZCB3aGl0ZXNwYWNlLCBzbyB1c2UgdGhvc2UuXG4gICAgaWYgKFxuICAgICAgYXNjaWlDb250cm9sKGNvZGUpIHx8XG4gICAgICB1bmljb2RlV2hpdGVzcGFjZShjb2RlKSB8fFxuICAgICAgKGNvZGUgIT09IDQ1IC8qIGAtYCAqLyAmJiB1bmljb2RlUHVuY3R1YXRpb24oY29kZSkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZG9uZShjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBkb21haW5cbiAgfVxuXG4gIGZ1bmN0aW9uIHB1bmN0dWF0aW9uQ29udGludWF0aW9uKGNvZGUpIHtcbiAgICAvLyBgLmBcbiAgICBpZiAoY29kZSA9PT0gNDYpIHtcbiAgICAgIGhhc1VuZGVyc2NvcmVJbkxhc3RMYXN0U2VnbWVudCA9IGhhc1VuZGVyc2NvcmVJbkxhc3RTZWdtZW50XG4gICAgICBoYXNVbmRlcnNjb3JlSW5MYXN0U2VnbWVudCA9IHVuZGVmaW5lZFxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gZG9tYWluXG4gICAgfVxuXG4gICAgLy8gYF9gXG4gICAgaWYgKGNvZGUgPT09IDk1KSBoYXNVbmRlcnNjb3JlSW5MYXN0U2VnbWVudCA9IHRydWVcblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBkb21haW5cbiAgfVxuXG4gIGZ1bmN0aW9uIGRvbmUoY29kZSkge1xuICAgIGlmICghaGFzVW5kZXJzY29yZUluTGFzdExhc3RTZWdtZW50ICYmICFoYXNVbmRlcnNjb3JlSW5MYXN0U2VnbWVudCkge1xuICAgICAgcmV0dXJuIG9rKGNvZGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplUGF0aChlZmZlY3RzLCBvaykge1xuICB2YXIgYmFsYW5jZSA9IDBcblxuICByZXR1cm4gaW5QYXRoXG5cbiAgZnVuY3Rpb24gaW5QYXRoKGNvZGUpIHtcbiAgICAvLyBgJmBcbiAgICBpZiAoY29kZSA9PT0gMzgpIHtcbiAgICAgIHJldHVybiBlZmZlY3RzLmNoZWNrKFxuICAgICAgICBuYW1lZENoYXJhY3RlclJlZmVyZW5jZSxcbiAgICAgICAgb2ssXG4gICAgICAgIGNvbnRpbnVlZFB1bmN0dWF0aW9uXG4gICAgICApKGNvZGUpXG4gICAgfVxuXG4gICAgLy8gYChgXG4gICAgaWYgKGNvZGUgPT09IDQwKSB7XG4gICAgICBiYWxhbmNlKytcbiAgICB9XG5cbiAgICAvLyBgKWBcbiAgICBpZiAoY29kZSA9PT0gNDEpIHtcbiAgICAgIHJldHVybiBlZmZlY3RzLmNoZWNrKFxuICAgICAgICBwdW5jdHVhdGlvbixcbiAgICAgICAgcGFyZW5BdFBhdGhFbmQsXG4gICAgICAgIGNvbnRpbnVlZFB1bmN0dWF0aW9uXG4gICAgICApKGNvZGUpXG4gICAgfVxuXG4gICAgaWYgKHBhdGhFbmQoY29kZSkpIHtcbiAgICAgIHJldHVybiBvayhjb2RlKVxuICAgIH1cblxuICAgIGlmICh0cmFpbGluZ1B1bmN0dWF0aW9uKGNvZGUpKSB7XG4gICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayhwdW5jdHVhdGlvbiwgb2ssIGNvbnRpbnVlZFB1bmN0dWF0aW9uKShjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBpblBhdGhcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnRpbnVlZFB1bmN0dWF0aW9uKGNvZGUpIHtcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICByZXR1cm4gaW5QYXRoXG4gIH1cblxuICBmdW5jdGlvbiBwYXJlbkF0UGF0aEVuZChjb2RlKSB7XG4gICAgYmFsYW5jZS0tXG4gICAgcmV0dXJuIGJhbGFuY2UgPCAwID8gb2soY29kZSkgOiBjb250aW51ZWRQdW5jdHVhdGlvbihjb2RlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplTmFtZWRDaGFyYWN0ZXJSZWZlcmVuY2UoZWZmZWN0cywgb2ssIG5vaykge1xuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgLy8gQXNzdW1lIGFuIGFtcGVyc2FuZC5cbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICByZXR1cm4gaW5zaWRlXG4gIH1cblxuICBmdW5jdGlvbiBpbnNpZGUoY29kZSkge1xuICAgIGlmIChhc2NpaUFscGhhKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBpbnNpZGVcbiAgICB9XG5cbiAgICAvLyBgO2BcbiAgICBpZiAoY29kZSA9PT0gNTkpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGFmdGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gYWZ0ZXIoY29kZSkge1xuICAgIC8vIElmIHRoZSBuYW1lZCBjaGFyYWN0ZXIgcmVmZXJlbmNlIGlzIGZvbGxvd2VkIGJ5IHRoZSBlbmQgb2YgdGhlIHBhdGgsIGl0XHUyMDE5c1xuICAgIC8vIG5vdCBjb250aW51ZWQgcHVuY3R1YXRpb24uXG4gICAgcmV0dXJuIHBhdGhFbmQoY29kZSkgPyBvayhjb2RlKSA6IG5vayhjb2RlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHRva2VuaXplUHVuY3R1YXRpb24oZWZmZWN0cywgb2ssIG5vaykge1xuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgLy8gQWx3YXlzIGEgdmFsaWQgdHJhaWxpbmcgcHVuY3R1YXRpb24gbWFya2VyLlxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIHJldHVybiBhZnRlclxuICB9XG5cbiAgZnVuY3Rpb24gYWZ0ZXIoY29kZSkge1xuICAgIC8vIENoZWNrIHRoZSBuZXh0LlxuICAgIGlmICh0cmFpbGluZ1B1bmN0dWF0aW9uKGNvZGUpKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBhZnRlclxuICAgIH1cblxuICAgIC8vIElmIHRoZSBwdW5jdHVhdGlvbiBtYXJrZXIgaXMgZm9sbG93ZWQgYnkgdGhlIGVuZCBvZiB0aGUgcGF0aCwgaXRcdTIwMTlzIG5vdFxuICAgIC8vIGNvbnRpbnVlZCBwdW5jdHVhdGlvbi5cbiAgICByZXR1cm4gcGF0aEVuZChjb2RlKSA/IG9rKGNvZGUpIDogbm9rKGNvZGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gdHJhaWxpbmdQdW5jdHVhdGlvbihjb2RlKSB7XG4gIHJldHVybiAoXG4gICAgLy8gYCFgXG4gICAgY29kZSA9PT0gMzMgfHxcbiAgICAvLyBgXCJgXG4gICAgY29kZSA9PT0gMzQgfHxcbiAgICAvLyBgJ2BcbiAgICBjb2RlID09PSAzOSB8fFxuICAgIC8vIGApYFxuICAgIGNvZGUgPT09IDQxIHx8XG4gICAgLy8gYCpgXG4gICAgY29kZSA9PT0gNDIgfHxcbiAgICAvLyBgLGBcbiAgICBjb2RlID09PSA0NCB8fFxuICAgIC8vIGAuYFxuICAgIGNvZGUgPT09IDQ2IHx8XG4gICAgLy8gYDpgXG4gICAgY29kZSA9PT0gNTggfHxcbiAgICAvLyBgO2BcbiAgICBjb2RlID09PSA1OSB8fFxuICAgIC8vIGA8YFxuICAgIGNvZGUgPT09IDYwIHx8XG4gICAgLy8gYD9gXG4gICAgY29kZSA9PT0gNjMgfHxcbiAgICAvLyBgX2AuXG4gICAgY29kZSA9PT0gOTUgfHxcbiAgICAvLyBgfmBcbiAgICBjb2RlID09PSAxMjZcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXRoRW5kKGNvZGUpIHtcbiAgcmV0dXJuIChcbiAgICAvLyBFT0YuXG4gICAgY29kZSA9PT0gbnVsbCB8fFxuICAgIC8vIENSLCBMRiwgQ1JMRiwgSFQsIFZTLlxuICAgIGNvZGUgPCAwIHx8XG4gICAgLy8gU3BhY2UuXG4gICAgY29kZSA9PT0gMzIgfHxcbiAgICAvLyBgPGBcbiAgICBjb2RlID09PSA2MFxuICApXG59XG5cbmZ1bmN0aW9uIGdmbUF0ZXh0KGNvZGUpIHtcbiAgcmV0dXJuIChcbiAgICBjb2RlID09PSA0MyAvKiBgK2AgKi8gfHxcbiAgICBjb2RlID09PSA0NSAvKiBgLWAgKi8gfHxcbiAgICBjb2RlID09PSA0NiAvKiBgLmAgKi8gfHxcbiAgICBjb2RlID09PSA5NSAvKiBgX2AgKi8gfHxcbiAgICBhc2NpaUFscGhhbnVtZXJpYyhjb2RlKVxuICApXG59XG5cbmZ1bmN0aW9uIHByZXZpb3VzV3d3KGNvZGUpIHtcbiAgcmV0dXJuIChcbiAgICBjb2RlID09PSBudWxsIHx8XG4gICAgY29kZSA8IDAgfHxcbiAgICBjb2RlID09PSAzMiAvKiBgIGAgKi8gfHxcbiAgICBjb2RlID09PSA0MCAvKiBgKGAgKi8gfHxcbiAgICBjb2RlID09PSA0MiAvKiBgKmAgKi8gfHxcbiAgICBjb2RlID09PSA5NSAvKiBgX2AgKi8gfHxcbiAgICBjb2RlID09PSAxMjYgLyogYH5gICovXG4gIClcbn1cblxuZnVuY3Rpb24gcHJldmlvdXNIdHRwKGNvZGUpIHtcbiAgcmV0dXJuIGNvZGUgPT09IG51bGwgfHwgIWFzY2lpQWxwaGEoY29kZSlcbn1cblxuZnVuY3Rpb24gcHJldmlvdXNFbWFpbChjb2RlKSB7XG4gIHJldHVybiBjb2RlICE9PSA0NyAvKiBgL2AgKi8gJiYgcHJldmlvdXNIdHRwKGNvZGUpXG59XG5cbmZ1bmN0aW9uIHByZXZpb3VzKGV2ZW50cykge1xuICB2YXIgaW5kZXggPSBldmVudHMubGVuZ3RoXG5cbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICBpZiAoXG4gICAgICAoZXZlbnRzW2luZGV4XVsxXS50eXBlID09PSAnbGFiZWxMaW5rJyB8fFxuICAgICAgICBldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdsYWJlbEltYWdlJykgJiZcbiAgICAgICFldmVudHNbaW5kZXhdWzFdLl9iYWxhbmNlZFxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbn1cbiIsICJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vc3ludGF4JylcbiIsICJtb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVxuXG52YXIgY2xhc3NpZnlDaGFyYWN0ZXIgPSByZXF1aXJlKCdtaWNyb21hcmsvZGlzdC91dGlsL2NsYXNzaWZ5LWNoYXJhY3RlcicpXG52YXIgY2h1bmtlZFNwbGljZSA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L3V0aWwvY2h1bmtlZC1zcGxpY2UnKVxudmFyIHJlc29sdmVBbGwgPSByZXF1aXJlKCdtaWNyb21hcmsvZGlzdC91dGlsL3Jlc29sdmUtYWxsJylcbnZhciBzaGFsbG93ID0gcmVxdWlyZSgnbWljcm9tYXJrL2Rpc3QvdXRpbC9zaGFsbG93JylcblxuZnVuY3Rpb24gY3JlYXRlKG9wdGlvbnMpIHtcbiAgdmFyIHNldHRpbmdzID0gb3B0aW9ucyB8fCB7fVxuICB2YXIgc2luZ2xlID0gc2V0dGluZ3Muc2luZ2xlVGlsZGVcbiAgdmFyIHRva2VuaXplciA9IHtcbiAgICB0b2tlbml6ZTogdG9rZW5pemVTdHJpa2V0aHJvdWdoLFxuICAgIHJlc29sdmVBbGw6IHJlc29sdmVBbGxTdHJpa2V0aHJvdWdoXG4gIH1cblxuICBpZiAoc2luZ2xlID09PSBudWxsIHx8IHNpbmdsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc2luZ2xlID0gdHJ1ZVxuICB9XG5cbiAgcmV0dXJuIHt0ZXh0OiB7MTI2OiB0b2tlbml6ZXJ9LCBpbnNpZGVTcGFuOiB7bnVsbDogdG9rZW5pemVyfX1cblxuICAvLyBUYWtlIGV2ZW50cyBhbmQgcmVzb2x2ZSBzdHJpa2V0aHJvdWdoLlxuICBmdW5jdGlvbiByZXNvbHZlQWxsU3RyaWtldGhyb3VnaChldmVudHMsIGNvbnRleHQpIHtcbiAgICB2YXIgaW5kZXggPSAtMVxuICAgIHZhciBzdHJpa2V0aHJvdWdoXG4gICAgdmFyIHRleHRcbiAgICB2YXIgb3BlblxuICAgIHZhciBuZXh0RXZlbnRzXG5cbiAgICAvLyBXYWxrIHRocm91Z2ggYWxsIGV2ZW50cy5cbiAgICB3aGlsZSAoKytpbmRleCA8IGV2ZW50cy5sZW5ndGgpIHtcbiAgICAgIC8vIEZpbmQgYSB0b2tlbiB0aGF0IGNhbiBjbG9zZS5cbiAgICAgIGlmIChcbiAgICAgICAgZXZlbnRzW2luZGV4XVswXSA9PT0gJ2VudGVyJyAmJlxuICAgICAgICBldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdzdHJpa2V0aHJvdWdoU2VxdWVuY2VUZW1wb3JhcnknICYmXG4gICAgICAgIGV2ZW50c1tpbmRleF1bMV0uX2Nsb3NlXG4gICAgICApIHtcbiAgICAgICAgb3BlbiA9IGluZGV4XG5cbiAgICAgICAgLy8gTm93IHdhbGsgYmFjayB0byBmaW5kIGFuIG9wZW5lci5cbiAgICAgICAgd2hpbGUgKG9wZW4tLSkge1xuICAgICAgICAgIC8vIEZpbmQgYSB0b2tlbiB0aGF0IGNhbiBvcGVuIHRoZSBjbG9zZXIuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXZlbnRzW29wZW5dWzBdID09PSAnZXhpdCcgJiZcbiAgICAgICAgICAgIGV2ZW50c1tvcGVuXVsxXS50eXBlID09PSAnc3RyaWtldGhyb3VnaFNlcXVlbmNlVGVtcG9yYXJ5JyAmJlxuICAgICAgICAgICAgZXZlbnRzW29wZW5dWzFdLl9vcGVuICYmXG4gICAgICAgICAgICAvLyBJZiB0aGUgc2l6ZXMgYXJlIHRoZSBzYW1lOlxuICAgICAgICAgICAgZXZlbnRzW2luZGV4XVsxXS5lbmQub2Zmc2V0IC0gZXZlbnRzW2luZGV4XVsxXS5zdGFydC5vZmZzZXQgPT09XG4gICAgICAgICAgICAgIGV2ZW50c1tvcGVuXVsxXS5lbmQub2Zmc2V0IC0gZXZlbnRzW29wZW5dWzFdLnN0YXJ0Lm9mZnNldFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZXZlbnRzW2luZGV4XVsxXS50eXBlID0gJ3N0cmlrZXRocm91Z2hTZXF1ZW5jZSdcbiAgICAgICAgICAgIGV2ZW50c1tvcGVuXVsxXS50eXBlID0gJ3N0cmlrZXRocm91Z2hTZXF1ZW5jZSdcblxuICAgICAgICAgICAgc3RyaWtldGhyb3VnaCA9IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3N0cmlrZXRocm91Z2gnLFxuICAgICAgICAgICAgICBzdGFydDogc2hhbGxvdyhldmVudHNbb3Blbl1bMV0uc3RhcnQpLFxuICAgICAgICAgICAgICBlbmQ6IHNoYWxsb3coZXZlbnRzW2luZGV4XVsxXS5lbmQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRleHQgPSB7XG4gICAgICAgICAgICAgIHR5cGU6ICdzdHJpa2V0aHJvdWdoVGV4dCcsXG4gICAgICAgICAgICAgIHN0YXJ0OiBzaGFsbG93KGV2ZW50c1tvcGVuXVsxXS5lbmQpLFxuICAgICAgICAgICAgICBlbmQ6IHNoYWxsb3coZXZlbnRzW2luZGV4XVsxXS5zdGFydClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT3BlbmluZy5cbiAgICAgICAgICAgIG5leHRFdmVudHMgPSBbXG4gICAgICAgICAgICAgIFsnZW50ZXInLCBzdHJpa2V0aHJvdWdoLCBjb250ZXh0XSxcbiAgICAgICAgICAgICAgWydlbnRlcicsIGV2ZW50c1tvcGVuXVsxXSwgY29udGV4dF0sXG4gICAgICAgICAgICAgIFsnZXhpdCcsIGV2ZW50c1tvcGVuXVsxXSwgY29udGV4dF0sXG4gICAgICAgICAgICAgIFsnZW50ZXInLCB0ZXh0LCBjb250ZXh0XVxuICAgICAgICAgICAgXVxuXG4gICAgICAgICAgICAvLyBCZXR3ZWVuLlxuICAgICAgICAgICAgY2h1bmtlZFNwbGljZShcbiAgICAgICAgICAgICAgbmV4dEV2ZW50cyxcbiAgICAgICAgICAgICAgbmV4dEV2ZW50cy5sZW5ndGgsXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgIHJlc29sdmVBbGwoXG4gICAgICAgICAgICAgICAgY29udGV4dC5wYXJzZXIuY29uc3RydWN0cy5pbnNpZGVTcGFuLm51bGwsXG4gICAgICAgICAgICAgICAgZXZlbnRzLnNsaWNlKG9wZW4gKyAxLCBpbmRleCksXG4gICAgICAgICAgICAgICAgY29udGV4dFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG5cbiAgICAgICAgICAgIC8vIENsb3NpbmcuXG4gICAgICAgICAgICBjaHVua2VkU3BsaWNlKG5leHRFdmVudHMsIG5leHRFdmVudHMubGVuZ3RoLCAwLCBbXG4gICAgICAgICAgICAgIFsnZXhpdCcsIHRleHQsIGNvbnRleHRdLFxuICAgICAgICAgICAgICBbJ2VudGVyJywgZXZlbnRzW2luZGV4XVsxXSwgY29udGV4dF0sXG4gICAgICAgICAgICAgIFsnZXhpdCcsIGV2ZW50c1tpbmRleF1bMV0sIGNvbnRleHRdLFxuICAgICAgICAgICAgICBbJ2V4aXQnLCBzdHJpa2V0aHJvdWdoLCBjb250ZXh0XVxuICAgICAgICAgICAgXSlcblxuICAgICAgICAgICAgY2h1bmtlZFNwbGljZShldmVudHMsIG9wZW4gLSAxLCBpbmRleCAtIG9wZW4gKyAzLCBuZXh0RXZlbnRzKVxuXG4gICAgICAgICAgICBpbmRleCA9IG9wZW4gKyBuZXh0RXZlbnRzLmxlbmd0aCAtIDJcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbW92ZVJlbWFpbmluZ1NlcXVlbmNlcyhldmVudHMpXG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVSZW1haW5pbmdTZXF1ZW5jZXMoZXZlbnRzKSB7XG4gICAgdmFyIGluZGV4ID0gLTFcbiAgICB2YXIgbGVuZ3RoID0gZXZlbnRzLmxlbmd0aFxuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09ICdzdHJpa2V0aHJvdWdoU2VxdWVuY2VUZW1wb3JhcnknKSB7XG4gICAgICAgIGV2ZW50c1tpbmRleF1bMV0udHlwZSA9ICdkYXRhJ1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBldmVudHNcbiAgfVxuXG4gIGZ1bmN0aW9uIHRva2VuaXplU3RyaWtldGhyb3VnaChlZmZlY3RzLCBvaywgbm9rKSB7XG4gICAgdmFyIHByZXZpb3VzID0gdGhpcy5wcmV2aW91c1xuICAgIHZhciBldmVudHMgPSB0aGlzLmV2ZW50c1xuICAgIHZhciBzaXplID0gMFxuXG4gICAgcmV0dXJuIHN0YXJ0XG5cbiAgICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNvZGUgIT09IDEyNiB8fFxuICAgICAgICAocHJldmlvdXMgPT09IDEyNiAmJlxuICAgICAgICAgIGV2ZW50c1tldmVudHMubGVuZ3RoIC0gMV1bMV0udHlwZSAhPT0gJ2NoYXJhY3RlckVzY2FwZScpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgICAgfVxuXG4gICAgICBlZmZlY3RzLmVudGVyKCdzdHJpa2V0aHJvdWdoU2VxdWVuY2VUZW1wb3JhcnknKVxuICAgICAgcmV0dXJuIG1vcmUoY29kZSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb3JlKGNvZGUpIHtcbiAgICAgIHZhciBiZWZvcmUgPSBjbGFzc2lmeUNoYXJhY3RlcihwcmV2aW91cylcbiAgICAgIHZhciB0b2tlblxuICAgICAgdmFyIGFmdGVyXG5cbiAgICAgIGlmIChjb2RlID09PSAxMjYpIHtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgdGhpcmQgbWFya2VyLCBleGl0LlxuICAgICAgICBpZiAoc2l6ZSA+IDEpIHJldHVybiBub2soY29kZSlcbiAgICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICAgIHNpemUrK1xuICAgICAgICByZXR1cm4gbW9yZVxuICAgICAgfVxuXG4gICAgICBpZiAoc2l6ZSA8IDIgJiYgIXNpbmdsZSkgcmV0dXJuIG5vayhjb2RlKVxuICAgICAgdG9rZW4gPSBlZmZlY3RzLmV4aXQoJ3N0cmlrZXRocm91Z2hTZXF1ZW5jZVRlbXBvcmFyeScpXG4gICAgICBhZnRlciA9IGNsYXNzaWZ5Q2hhcmFjdGVyKGNvZGUpXG4gICAgICB0b2tlbi5fb3BlbiA9ICFhZnRlciB8fCAoYWZ0ZXIgPT09IDIgJiYgYmVmb3JlKVxuICAgICAgdG9rZW4uX2Nsb3NlID0gIWJlZm9yZSB8fCAoYmVmb3JlID09PSAyICYmIGFmdGVyKVxuICAgICAgcmV0dXJuIG9rKGNvZGUpXG4gICAgfVxuICB9XG59XG4iLCAiZXhwb3J0cy5mbG93ID0ge1xuICBudWxsOiB7dG9rZW5pemU6IHRva2VuaXplVGFibGUsIHJlc29sdmU6IHJlc29sdmVUYWJsZSwgaW50ZXJydXB0aWJsZTogdHJ1ZX1cbn1cblxudmFyIGNyZWF0ZVNwYWNlID0gcmVxdWlyZSgnbWljcm9tYXJrL2Rpc3QvdG9rZW5pemUvZmFjdG9yeS1zcGFjZScpXG5cbnZhciBzZXRleHRVbmRlcmxpbmVNaW5pID0ge3Rva2VuaXplOiB0b2tlbml6ZVNldGV4dFVuZGVybGluZU1pbmksIHBhcnRpYWw6IHRydWV9XG52YXIgbmV4dFByZWZpeGVkT3JCbGFuayA9IHt0b2tlbml6ZTogdG9rZW5pemVOZXh0UHJlZml4ZWRPckJsYW5rLCBwYXJ0aWFsOiB0cnVlfVxuXG5mdW5jdGlvbiByZXNvbHZlVGFibGUoZXZlbnRzLCBjb250ZXh0KSB7XG4gIHZhciBsZW5ndGggPSBldmVudHMubGVuZ3RoXG4gIHZhciBpbmRleCA9IC0xXG4gIHZhciB0b2tlblxuICB2YXIgaW5IZWFkXG4gIHZhciBpbkRlbGltaXRlclJvd1xuICB2YXIgaW5Sb3dcbiAgdmFyIGNlbGxcbiAgdmFyIGNvbnRlbnRcbiAgdmFyIHRleHRcbiAgdmFyIGNvbnRlbnRTdGFydFxuICB2YXIgY29udGVudEVuZFxuICB2YXIgY2VsbFN0YXJ0XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB0b2tlbiA9IGV2ZW50c1tpbmRleF1bMV1cblxuICAgIGlmIChpblJvdykge1xuICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICd0ZW1wb3JhcnlUYWJsZUNlbGxDb250ZW50Jykge1xuICAgICAgICBjb250ZW50U3RhcnQgPSBjb250ZW50U3RhcnQgfHwgaW5kZXhcbiAgICAgICAgY29udGVudEVuZCA9IGluZGV4XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgLy8gQ29tYmluZSBzZXBhcmF0ZSBjb250ZW50IHBhcnRzIGludG8gb25lLlxuICAgICAgICAodG9rZW4udHlwZSA9PT0gJ3RhYmxlQ2VsbERpdmlkZXInIHx8IHRva2VuLnR5cGUgPT09ICd0YWJsZVJvdycpICYmXG4gICAgICAgIGNvbnRlbnRFbmRcbiAgICAgICkge1xuICAgICAgICBjb250ZW50ID0ge1xuICAgICAgICAgIHR5cGU6ICd0YWJsZUNvbnRlbnQnLFxuICAgICAgICAgIHN0YXJ0OiBldmVudHNbY29udGVudFN0YXJ0XVsxXS5zdGFydCxcbiAgICAgICAgICBlbmQ6IGV2ZW50c1tjb250ZW50RW5kXVsxXS5lbmRcbiAgICAgICAgfVxuICAgICAgICB0ZXh0ID0ge1xuICAgICAgICAgIHR5cGU6ICdjaHVua1RleHQnLFxuICAgICAgICAgIHN0YXJ0OiBjb250ZW50LnN0YXJ0LFxuICAgICAgICAgIGVuZDogY29udGVudC5lbmQsXG4gICAgICAgICAgY29udGVudFR5cGU6ICd0ZXh0J1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnRzLnNwbGljZShcbiAgICAgICAgICBjb250ZW50U3RhcnQsXG4gICAgICAgICAgY29udGVudEVuZCAtIGNvbnRlbnRTdGFydCArIDEsXG4gICAgICAgICAgWydlbnRlcicsIGNvbnRlbnQsIGNvbnRleHRdLFxuICAgICAgICAgIFsnZW50ZXInLCB0ZXh0LCBjb250ZXh0XSxcbiAgICAgICAgICBbJ2V4aXQnLCB0ZXh0LCBjb250ZXh0XSxcbiAgICAgICAgICBbJ2V4aXQnLCBjb250ZW50LCBjb250ZXh0XVxuICAgICAgICApXG4gICAgICAgIGluZGV4IC09IGNvbnRlbnRFbmQgLSBjb250ZW50U3RhcnQgLSAzXG4gICAgICAgIGxlbmd0aCA9IGV2ZW50cy5sZW5ndGhcbiAgICAgICAgY29udGVudFN0YXJ0ID0gdW5kZWZpbmVkXG4gICAgICAgIGNvbnRlbnRFbmQgPSB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBldmVudHNbaW5kZXhdWzBdID09PSAnZXhpdCcgJiZcbiAgICAgIGNlbGxTdGFydCAmJlxuICAgICAgY2VsbFN0YXJ0ICsgMSA8IGluZGV4ICYmXG4gICAgICAodG9rZW4udHlwZSA9PT0gJ3RhYmxlQ2VsbERpdmlkZXInIHx8XG4gICAgICAgICh0b2tlbi50eXBlID09PSAndGFibGVSb3cnICYmXG4gICAgICAgICAgKGNlbGxTdGFydCArIDMgPCBpbmRleCB8fFxuICAgICAgICAgICAgZXZlbnRzW2NlbGxTdGFydF1bMV0udHlwZSAhPT0gJ3doaXRlc3BhY2UnKSkpXG4gICAgKSB7XG4gICAgICBjZWxsID0ge1xuICAgICAgICB0eXBlOiBpbkRlbGltaXRlclJvd1xuICAgICAgICAgID8gJ3RhYmxlRGVsaW1pdGVyJ1xuICAgICAgICAgIDogaW5IZWFkXG4gICAgICAgICAgPyAndGFibGVIZWFkZXInXG4gICAgICAgICAgOiAndGFibGVEYXRhJyxcbiAgICAgICAgc3RhcnQ6IGV2ZW50c1tjZWxsU3RhcnRdWzFdLnN0YXJ0LFxuICAgICAgICBlbmQ6IGV2ZW50c1tpbmRleF1bMV0uZW5kXG4gICAgICB9XG4gICAgICBldmVudHMuc3BsaWNlKGluZGV4ICsgKHRva2VuLnR5cGUgPT09ICd0YWJsZUNlbGxEaXZpZGVyJyA/IDEgOiAwKSwgMCwgW1xuICAgICAgICAnZXhpdCcsXG4gICAgICAgIGNlbGwsXG4gICAgICAgIGNvbnRleHRcbiAgICAgIF0pXG4gICAgICBldmVudHMuc3BsaWNlKGNlbGxTdGFydCwgMCwgWydlbnRlcicsIGNlbGwsIGNvbnRleHRdKVxuICAgICAgaW5kZXggKz0gMlxuICAgICAgbGVuZ3RoID0gZXZlbnRzLmxlbmd0aFxuICAgICAgY2VsbFN0YXJ0ID0gaW5kZXggKyAxXG4gICAgfVxuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICd0YWJsZVJvdycpIHtcbiAgICAgIGluUm93ID0gZXZlbnRzW2luZGV4XVswXSA9PT0gJ2VudGVyJ1xuXG4gICAgICBpZiAoaW5Sb3cpIHtcbiAgICAgICAgY2VsbFN0YXJ0ID0gaW5kZXggKyAxXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICd0YWJsZURlbGltaXRlclJvdycpIHtcbiAgICAgIGluRGVsaW1pdGVyUm93ID0gZXZlbnRzW2luZGV4XVswXSA9PT0gJ2VudGVyJ1xuXG4gICAgICBpZiAoaW5EZWxpbWl0ZXJSb3cpIHtcbiAgICAgICAgY2VsbFN0YXJ0ID0gaW5kZXggKyAxXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICd0YWJsZUhlYWQnKSB7XG4gICAgICBpbkhlYWQgPSBldmVudHNbaW5kZXhdWzBdID09PSAnZW50ZXInXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV2ZW50c1xufVxuXG5mdW5jdGlvbiB0b2tlbml6ZVRhYmxlKGVmZmVjdHMsIG9rLCBub2spIHtcbiAgdmFyIGFsaWduID0gW11cbiAgdmFyIHRhYmxlSGVhZGVyQ291bnQgPSAwXG4gIHZhciBzZWVuRGVsaW1pdGVyXG4gIHZhciBoYXNEYXNoXG5cbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAtIHVzZWQgdG8gYmUgcGFzc2VkIGluIGJldGEgbWljcm9tYXJrIHZlcnNpb25zLiAqL1xuICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IC01IHx8IGNvZGUgPT09IC00IHx8IGNvZGUgPT09IC0zKSB7XG4gICAgICByZXR1cm4gbm9rKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcigndGFibGUnKS5fYWxpZ24gPSBhbGlnblxuICAgIGVmZmVjdHMuZW50ZXIoJ3RhYmxlSGVhZCcpXG4gICAgZWZmZWN0cy5lbnRlcigndGFibGVSb3cnKVxuXG4gICAgLy8gSWYgd2Ugc3RhcnQgd2l0aCBhIHBpcGUsIHdlIG9wZW4gYSBjZWxsIG1hcmtlci5cbiAgICBpZiAoY29kZSA9PT0gMTI0KSB7XG4gICAgICByZXR1cm4gY2VsbERpdmlkZXJIZWFkKGNvZGUpXG4gICAgfVxuXG4gICAgdGFibGVIZWFkZXJDb3VudCsrXG4gICAgZWZmZWN0cy5lbnRlcigndGVtcG9yYXJ5VGFibGVDZWxsQ29udGVudCcpXG4gICAgLy8gQ2FuXHUyMDE5dCBiZSBzcGFjZSBvciBlb2xzIGF0IHRoZSBzdGFydCBvZiBhIGNvbnN0cnVjdCwgc28gd2VcdTIwMTlyZSBpbiBhIGNlbGwuXG4gICAgcmV0dXJuIGluQ2VsbENvbnRlbnRIZWFkKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjZWxsRGl2aWRlckhlYWQoY29kZSkge1xuICAgIC8vIEFsd2F5cyBhIHBpcGUuXG4gICAgZWZmZWN0cy5lbnRlcigndGFibGVDZWxsRGl2aWRlcicpXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgZWZmZWN0cy5leGl0KCd0YWJsZUNlbGxEaXZpZGVyJylcbiAgICBzZWVuRGVsaW1pdGVyID0gdHJ1ZVxuICAgIHJldHVybiBjZWxsQnJlYWtIZWFkXG4gIH1cblxuICBmdW5jdGlvbiBjZWxsQnJlYWtIZWFkKGNvZGUpIHtcbiAgICAvLyBFT0YsIENSLCBMRiwgQ1JMRi5cbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSAtNSB8fCBjb2RlID09PSAtNCB8fCBjb2RlID09PSAtMykge1xuICAgICAgcmV0dXJuIGF0Um93RW5kSGVhZChjb2RlKVxuICAgIH1cblxuICAgIC8vIEhULCBWUywgU1AuXG4gICAgaWYgKGNvZGUgPT09IC0yIHx8IGNvZGUgPT09IC0xIHx8IGNvZGUgPT09IDMyKSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCd3aGl0ZXNwYWNlJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGluV2hpdGVzcGFjZUhlYWRcbiAgICB9XG5cbiAgICBpZiAoc2VlbkRlbGltaXRlcikge1xuICAgICAgc2VlbkRlbGltaXRlciA9IHVuZGVmaW5lZFxuICAgICAgdGFibGVIZWFkZXJDb3VudCsrXG4gICAgfVxuXG4gICAgLy8gYHxgXG4gICAgaWYgKGNvZGUgPT09IDEyNCkge1xuICAgICAgcmV0dXJuIGNlbGxEaXZpZGVySGVhZChjb2RlKVxuICAgIH1cblxuICAgIC8vIEFueXRoaW5nIGVsc2UgaXMgY2VsbCBjb250ZW50LlxuICAgIGVmZmVjdHMuZW50ZXIoJ3RlbXBvcmFyeVRhYmxlQ2VsbENvbnRlbnQnKVxuICAgIHJldHVybiBpbkNlbGxDb250ZW50SGVhZChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gaW5XaGl0ZXNwYWNlSGVhZChjb2RlKSB7XG4gICAgLy8gSFQsIFZTLCBTUC5cbiAgICBpZiAoY29kZSA9PT0gLTIgfHwgY29kZSA9PT0gLTEgfHwgY29kZSA9PT0gMzIpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGluV2hpdGVzcGFjZUhlYWRcbiAgICB9XG5cbiAgICBlZmZlY3RzLmV4aXQoJ3doaXRlc3BhY2UnKVxuICAgIHJldHVybiBjZWxsQnJlYWtIZWFkKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBpbkNlbGxDb250ZW50SGVhZChjb2RlKSB7XG4gICAgLy8gRU9GLCB3aGl0ZXNwYWNlLCBwaXBlXG4gICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA8IDAgfHwgY29kZSA9PT0gMzIgfHwgY29kZSA9PT0gMTI0KSB7XG4gICAgICBlZmZlY3RzLmV4aXQoJ3RlbXBvcmFyeVRhYmxlQ2VsbENvbnRlbnQnKVxuICAgICAgcmV0dXJuIGNlbGxCcmVha0hlYWQoY29kZSlcbiAgICB9XG5cbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAvLyBgXFxgXG4gICAgcmV0dXJuIGNvZGUgPT09IDkyID8gaW5DZWxsQ29udGVudEVzY2FwZUhlYWQgOiBpbkNlbGxDb250ZW50SGVhZFxuICB9XG5cbiAgZnVuY3Rpb24gaW5DZWxsQ29udGVudEVzY2FwZUhlYWQoY29kZSkge1xuICAgIC8vIGBcXGAgb3IgYHxgXG4gICAgaWYgKGNvZGUgPT09IDkyIHx8IGNvZGUgPT09IDEyNCkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gaW5DZWxsQ29udGVudEhlYWRcbiAgICB9XG5cbiAgICAvLyBBbnl0aGluZyBlbHNlLlxuICAgIHJldHVybiBpbkNlbGxDb250ZW50SGVhZChjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gYXRSb3dFbmRIZWFkKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuZXhpdCgndGFibGVSb3cnKVxuICAgIGVmZmVjdHMuZXhpdCgndGFibGVIZWFkJylcblxuICAgIC8vIEFsd2F5cyBhIGxpbmUgZW5kaW5nLlxuICAgIGVmZmVjdHMuZW50ZXIoJ2xpbmVFbmRpbmcnKVxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIGVmZmVjdHMuZXhpdCgnbGluZUVuZGluZycpXG5cbiAgICAvLyBJZiBhIHNldGV4dCBoZWFkaW5nLCBleGl0LlxuICAgIHJldHVybiBlZmZlY3RzLmNoZWNrKFxuICAgICAgc2V0ZXh0VW5kZXJsaW5lTWluaSxcbiAgICAgIG5vayxcbiAgICAgIC8vIFN1cHBvcnQgYW4gaW5kZW50IGJlZm9yZSB0aGUgZGVsaW1pdGVyIHJvdy5cbiAgICAgIGNyZWF0ZVNwYWNlKGVmZmVjdHMsIHJvd1N0YXJ0RGVsaW1pdGVyLCAnbGluZVByZWZpeCcsIDQpXG4gICAgKVxuICB9XG5cbiAgZnVuY3Rpb24gcm93U3RhcnREZWxpbWl0ZXIoY29kZSkge1xuICAgIC8vIElmIHRoZXJlXHUyMDE5cyBhbm90aGVyIHNwYWNlLCBvciB3ZVx1MjAxOXJlIGF0IHRoZSBFT0wvRU9GLCBleGl0LlxuICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPCAwIHx8IGNvZGUgPT09IDMyKSB7XG4gICAgICByZXR1cm4gbm9rKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcigndGFibGVEZWxpbWl0ZXJSb3cnKVxuICAgIHJldHVybiBhdERlbGltaXRlclJvd0JyZWFrKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBhdERlbGltaXRlclJvd0JyZWFrKGNvZGUpIHtcbiAgICAvLyBFT0YsIENSLCBMRiwgQ1JMRi5cbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSAtNSB8fCBjb2RlID09PSAtNCB8fCBjb2RlID09PSAtMykge1xuICAgICAgcmV0dXJuIHJvd0VuZERlbGltaXRlcihjb2RlKVxuICAgIH1cblxuICAgIC8vIEhULCBWUywgU1AuXG4gICAgaWYgKGNvZGUgPT09IC0yIHx8IGNvZGUgPT09IC0xIHx8IGNvZGUgPT09IDMyKSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCd3aGl0ZXNwYWNlJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGluV2hpdGVzcGFjZURlbGltaXRlclxuICAgIH1cblxuICAgIC8vIGAtYFxuICAgIGlmIChjb2RlID09PSA0NSkge1xuICAgICAgZWZmZWN0cy5lbnRlcigndGFibGVEZWxpbWl0ZXJGaWxsZXInKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBoYXNEYXNoID0gdHJ1ZVxuICAgICAgYWxpZ24ucHVzaChudWxsKVxuICAgICAgcmV0dXJuIGluRmlsbGVyRGVsaW1pdGVyXG4gICAgfVxuXG4gICAgLy8gYDpgXG4gICAgaWYgKGNvZGUgPT09IDU4KSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCd0YWJsZURlbGltaXRlckFsaWdubWVudCcpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdCgndGFibGVEZWxpbWl0ZXJBbGlnbm1lbnQnKVxuICAgICAgYWxpZ24ucHVzaCgnbGVmdCcpXG4gICAgICByZXR1cm4gYWZ0ZXJMZWZ0QWxpZ25tZW50XG4gICAgfVxuXG4gICAgLy8gSWYgd2Ugc3RhcnQgd2l0aCBhIHBpcGUsIHdlIG9wZW4gYSBjZWxsIG1hcmtlci5cbiAgICBpZiAoY29kZSA9PT0gMTI0KSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCd0YWJsZUNlbGxEaXZpZGVyJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgZWZmZWN0cy5leGl0KCd0YWJsZUNlbGxEaXZpZGVyJylcbiAgICAgIHJldHVybiBhdERlbGltaXRlclJvd0JyZWFrXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gaW5XaGl0ZXNwYWNlRGVsaW1pdGVyKGNvZGUpIHtcbiAgICAvLyBIVCwgVlMsIFNQLlxuICAgIGlmIChjb2RlID09PSAtMiB8fCBjb2RlID09PSAtMSB8fCBjb2RlID09PSAzMikge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gaW5XaGl0ZXNwYWNlRGVsaW1pdGVyXG4gICAgfVxuXG4gICAgZWZmZWN0cy5leGl0KCd3aGl0ZXNwYWNlJylcbiAgICByZXR1cm4gYXREZWxpbWl0ZXJSb3dCcmVhayhjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gaW5GaWxsZXJEZWxpbWl0ZXIoY29kZSkge1xuICAgIC8vIGAtYFxuICAgIGlmIChjb2RlID09PSA0NSkge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gaW5GaWxsZXJEZWxpbWl0ZXJcbiAgICB9XG5cbiAgICBlZmZlY3RzLmV4aXQoJ3RhYmxlRGVsaW1pdGVyRmlsbGVyJylcblxuICAgIC8vIGA6YFxuICAgIGlmIChjb2RlID09PSA1OCkge1xuICAgICAgZWZmZWN0cy5lbnRlcigndGFibGVEZWxpbWl0ZXJBbGlnbm1lbnQnKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ3RhYmxlRGVsaW1pdGVyQWxpZ25tZW50JylcblxuICAgICAgYWxpZ25bYWxpZ24ubGVuZ3RoIC0gMV0gPVxuICAgICAgICBhbGlnblthbGlnbi5sZW5ndGggLSAxXSA9PT0gJ2xlZnQnID8gJ2NlbnRlcicgOiAncmlnaHQnXG5cbiAgICAgIHJldHVybiBhZnRlclJpZ2h0QWxpZ25tZW50XG4gICAgfVxuXG4gICAgcmV0dXJuIGF0RGVsaW1pdGVyUm93QnJlYWsoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGFmdGVyTGVmdEFsaWdubWVudChjb2RlKSB7XG4gICAgLy8gYC1gXG4gICAgaWYgKGNvZGUgPT09IDQ1KSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCd0YWJsZURlbGltaXRlckZpbGxlcicpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGhhc0Rhc2ggPSB0cnVlXG4gICAgICByZXR1cm4gaW5GaWxsZXJEZWxpbWl0ZXJcbiAgICB9XG5cbiAgICAvLyBBbnl0aGluZyBlbHNlIGlzIG5vdCBvay5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBhZnRlclJpZ2h0QWxpZ25tZW50KGNvZGUpIHtcbiAgICAvLyBFT0YsIENSLCBMRiwgQ1JMRi5cbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSAtNSB8fCBjb2RlID09PSAtNCB8fCBjb2RlID09PSAtMykge1xuICAgICAgcmV0dXJuIHJvd0VuZERlbGltaXRlcihjb2RlKVxuICAgIH1cblxuICAgIC8vIEhULCBWUywgU1AuXG4gICAgaWYgKGNvZGUgPT09IC0yIHx8IGNvZGUgPT09IC0xIHx8IGNvZGUgPT09IDMyKSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCd3aGl0ZXNwYWNlJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGluV2hpdGVzcGFjZURlbGltaXRlclxuICAgIH1cblxuICAgIC8vIGB8YFxuICAgIGlmIChjb2RlID09PSAxMjQpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ3RhYmxlQ2VsbERpdmlkZXInKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBlZmZlY3RzLmV4aXQoJ3RhYmxlQ2VsbERpdmlkZXInKVxuICAgICAgcmV0dXJuIGF0RGVsaW1pdGVyUm93QnJlYWtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiByb3dFbmREZWxpbWl0ZXIoY29kZSkge1xuICAgIGVmZmVjdHMuZXhpdCgndGFibGVEZWxpbWl0ZXJSb3cnKVxuXG4gICAgLy8gRXhpdCBpZiB0aGVyZSB3YXMgbm8gZGFzaCBhdCBhbGwsIG9yIGlmIHRoZSBoZWFkZXIgY2VsbCBjb3VudCBpcyBub3QgdGhlXG4gICAgLy8gZGVsaW1pdGVyIGNlbGwgY291bnQuXG4gICAgaWYgKCFoYXNEYXNoIHx8IHRhYmxlSGVhZGVyQ291bnQgIT09IGFsaWduLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG5vayhjb2RlKVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGFibGVDbG9zZShjb2RlKVxuICAgIH1cblxuICAgIHJldHVybiBlZmZlY3RzLmNoZWNrKG5leHRQcmVmaXhlZE9yQmxhbmssIHRhYmxlQ2xvc2UsIHRhYmxlQ29udGludWUpKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiB0YWJsZUNsb3NlKGNvZGUpIHtcbiAgICBlZmZlY3RzLmV4aXQoJ3RhYmxlJylcbiAgICByZXR1cm4gb2soY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRhYmxlQ29udGludWUoY29kZSkge1xuICAgIC8vIEFsd2F5cyBhIGxpbmUgZW5kaW5nLlxuICAgIGVmZmVjdHMuZW50ZXIoJ2xpbmVFbmRpbmcnKVxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIGVmZmVjdHMuZXhpdCgnbGluZUVuZGluZycpXG4gICAgLy8gV2UgY2hlY2tlZCB0aGF0IGl0XHUyMDE5cyBub3QgYSBwcmVmaXhlZCBvciBibGFuayBsaW5lLCBzbyB3ZVx1MjAxOXJlIGNlcnRhaW4gYVxuICAgIC8vIGJvZHkgaXMgY29taW5nLCB0aG91Z2ggaXQgbWF5IGJlIGluZGVudGVkLlxuICAgIHJldHVybiBjcmVhdGVTcGFjZShlZmZlY3RzLCBib2R5U3RhcnQsICdsaW5lUHJlZml4JywgNClcbiAgfVxuXG4gIGZ1bmN0aW9uIGJvZHlTdGFydChjb2RlKSB7XG4gICAgZWZmZWN0cy5lbnRlcigndGFibGVCb2R5JylcbiAgICByZXR1cm4gcm93U3RhcnRCb2R5KGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiByb3dTdGFydEJvZHkoY29kZSkge1xuICAgIGVmZmVjdHMuZW50ZXIoJ3RhYmxlUm93JylcblxuICAgIC8vIElmIHdlIHN0YXJ0IHdpdGggYSBwaXBlLCB3ZSBvcGVuIGEgY2VsbCBtYXJrZXIuXG4gICAgaWYgKGNvZGUgPT09IDEyNCkge1xuICAgICAgcmV0dXJuIGNlbGxEaXZpZGVyQm9keShjb2RlKVxuICAgIH1cblxuICAgIGVmZmVjdHMuZW50ZXIoJ3RlbXBvcmFyeVRhYmxlQ2VsbENvbnRlbnQnKVxuICAgIC8vIENhblx1MjAxOXQgYmUgc3BhY2Ugb3IgZW9scyBhdCB0aGUgc3RhcnQgb2YgYSBjb25zdHJ1Y3QsIHNvIHdlXHUyMDE5cmUgaW4gYSBjZWxsLlxuICAgIHJldHVybiBpbkNlbGxDb250ZW50Qm9keShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gY2VsbERpdmlkZXJCb2R5KGNvZGUpIHtcbiAgICAvLyBBbHdheXMgYSBwaXBlLlxuICAgIGVmZmVjdHMuZW50ZXIoJ3RhYmxlQ2VsbERpdmlkZXInKVxuICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgIGVmZmVjdHMuZXhpdCgndGFibGVDZWxsRGl2aWRlcicpXG4gICAgcmV0dXJuIGNlbGxCcmVha0JvZHlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNlbGxCcmVha0JvZHkoY29kZSkge1xuICAgIC8vIEVPRiwgQ1IsIExGLCBDUkxGLlxuICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IC01IHx8IGNvZGUgPT09IC00IHx8IGNvZGUgPT09IC0zKSB7XG4gICAgICByZXR1cm4gYXRSb3dFbmRCb2R5KGNvZGUpXG4gICAgfVxuXG4gICAgLy8gSFQsIFZTLCBTUC5cbiAgICBpZiAoY29kZSA9PT0gLTIgfHwgY29kZSA9PT0gLTEgfHwgY29kZSA9PT0gMzIpIHtcbiAgICAgIGVmZmVjdHMuZW50ZXIoJ3doaXRlc3BhY2UnKVxuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gaW5XaGl0ZXNwYWNlQm9keVxuICAgIH1cblxuICAgIC8vIGB8YFxuICAgIGlmIChjb2RlID09PSAxMjQpIHtcbiAgICAgIHJldHVybiBjZWxsRGl2aWRlckJvZHkoY29kZSlcbiAgICB9XG5cbiAgICAvLyBBbnl0aGluZyBlbHNlIGlzIGNlbGwgY29udGVudC5cbiAgICBlZmZlY3RzLmVudGVyKCd0ZW1wb3JhcnlUYWJsZUNlbGxDb250ZW50JylcbiAgICByZXR1cm4gaW5DZWxsQ29udGVudEJvZHkoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGluV2hpdGVzcGFjZUJvZHkoY29kZSkge1xuICAgIC8vIEhULCBWUywgU1AuXG4gICAgaWYgKGNvZGUgPT09IC0yIHx8IGNvZGUgPT09IC0xIHx8IGNvZGUgPT09IDMyKSB7XG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIHJldHVybiBpbldoaXRlc3BhY2VCb2R5XG4gICAgfVxuXG4gICAgZWZmZWN0cy5leGl0KCd3aGl0ZXNwYWNlJylcbiAgICByZXR1cm4gY2VsbEJyZWFrQm9keShjb2RlKVxuICB9XG5cbiAgZnVuY3Rpb24gaW5DZWxsQ29udGVudEJvZHkoY29kZSkge1xuICAgIC8vIEVPRiwgd2hpdGVzcGFjZSwgcGlwZVxuICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPCAwIHx8IGNvZGUgPT09IDMyIHx8IGNvZGUgPT09IDEyNCkge1xuICAgICAgZWZmZWN0cy5leGl0KCd0ZW1wb3JhcnlUYWJsZUNlbGxDb250ZW50JylcbiAgICAgIHJldHVybiBjZWxsQnJlYWtCb2R5KGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgLy8gYFxcYFxuICAgIHJldHVybiBjb2RlID09PSA5MiA/IGluQ2VsbENvbnRlbnRFc2NhcGVCb2R5IDogaW5DZWxsQ29udGVudEJvZHlcbiAgfVxuXG4gIGZ1bmN0aW9uIGluQ2VsbENvbnRlbnRFc2NhcGVCb2R5KGNvZGUpIHtcbiAgICAvLyBgXFxgIG9yIGB8YFxuICAgIGlmIChjb2RlID09PSA5MiB8fCBjb2RlID09PSAxMjQpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIGluQ2VsbENvbnRlbnRCb2R5XG4gICAgfVxuXG4gICAgLy8gQW55dGhpbmcgZWxzZS5cbiAgICByZXR1cm4gaW5DZWxsQ29udGVudEJvZHkoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGF0Um93RW5kQm9keShjb2RlKSB7XG4gICAgZWZmZWN0cy5leGl0KCd0YWJsZVJvdycpXG5cbiAgICBpZiAoY29kZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRhYmxlQm9keUNsb3NlKGNvZGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVmZmVjdHMuY2hlY2soXG4gICAgICBuZXh0UHJlZml4ZWRPckJsYW5rLFxuICAgICAgdGFibGVCb2R5Q2xvc2UsXG4gICAgICB0YWJsZUJvZHlDb250aW51ZVxuICAgICkoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRhYmxlQm9keUNsb3NlKGNvZGUpIHtcbiAgICBlZmZlY3RzLmV4aXQoJ3RhYmxlQm9keScpXG4gICAgcmV0dXJuIHRhYmxlQ2xvc2UoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRhYmxlQm9keUNvbnRpbnVlKGNvZGUpIHtcbiAgICAvLyBBbHdheXMgYSBsaW5lIGVuZGluZy5cbiAgICBlZmZlY3RzLmVudGVyKCdsaW5lRW5kaW5nJylcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBlZmZlY3RzLmV4aXQoJ2xpbmVFbmRpbmcnKVxuICAgIC8vIFN1cHBvcnQgYW4gb3B0aW9uYWwgcHJlZml4LCB0aGVuIHN0YXJ0IGEgYm9keSByb3cuXG4gICAgcmV0dXJuIGNyZWF0ZVNwYWNlKGVmZmVjdHMsIHJvd1N0YXJ0Qm9keSwgJ2xpbmVQcmVmaXgnLCA0KVxuICB9XG59XG5cbi8vIEJhc2VkIG9uIG1pY3JvbWFyaywgYnV0IHRoYXQgd29uXHUyMDE5dCB3b3JrIGFzIHdlXHUyMDE5cmUgaW4gYSB0YWJsZSwgYW5kIHRoYXQgZXhwZWN0c1xuLy8gY29udGVudC5cbi8vIDxodHRwczovL2dpdGh1Yi5jb20vbWljcm9tYXJrL21pY3JvbWFyay9ibG9iL21haW4vbGliL3Rva2VuaXplL3NldGV4dC11bmRlcmxpbmUuanM+XG5mdW5jdGlvbiB0b2tlbml6ZVNldGV4dFVuZGVybGluZU1pbmkoZWZmZWN0cywgb2ssIG5vaykge1xuICByZXR1cm4gc3RhcnRcblxuICBmdW5jdGlvbiBzdGFydChjb2RlKSB7XG4gICAgLy8gYC1gXG4gICAgaWYgKGNvZGUgIT09IDQ1KSB7XG4gICAgICByZXR1cm4gbm9rKGNvZGUpXG4gICAgfVxuXG4gICAgZWZmZWN0cy5lbnRlcignc2V0ZXh0VW5kZXJsaW5lJylcbiAgICByZXR1cm4gc2VxdWVuY2UoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlcXVlbmNlKGNvZGUpIHtcbiAgICBpZiAoY29kZSA9PT0gNDUpIHtcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgcmV0dXJuIHNlcXVlbmNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHdoaXRlc3BhY2UoY29kZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHdoaXRlc3BhY2UoY29kZSkge1xuICAgIGlmIChjb2RlID09PSAtMiB8fCBjb2RlID09PSAtMSB8fCBjb2RlID09PSAzMikge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICByZXR1cm4gd2hpdGVzcGFjZVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IC01IHx8IGNvZGUgPT09IC00IHx8IGNvZGUgPT09IC0zKSB7XG4gICAgICByZXR1cm4gb2soY29kZSlcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gdG9rZW5pemVOZXh0UHJlZml4ZWRPckJsYW5rKGVmZmVjdHMsIG9rLCBub2spIHtcbiAgdmFyIHNpemUgPSAwXG5cbiAgcmV0dXJuIHN0YXJ0XG5cbiAgZnVuY3Rpb24gc3RhcnQoY29kZSkge1xuICAgIC8vIFRoaXMgaXMgYSBjaGVjaywgc28gd2UgZG9uXHUyMDE5dCBjYXJlIGFib3V0IHRva2VucywgYnV0IHdlIG9wZW4gYSBib2d1cyBvbmVcbiAgICAvLyBzbyB3ZVx1MjAxOXJlIHZhbGlkLlxuICAgIGVmZmVjdHMuZW50ZXIoJ2NoZWNrJylcbiAgICAvLyBFT0wuXG4gICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgcmV0dXJuIHdoaXRlc3BhY2VcbiAgfVxuXG4gIGZ1bmN0aW9uIHdoaXRlc3BhY2UoY29kZSkge1xuICAgIC8vIFZTIG9yIFNQLlxuICAgIGlmIChjb2RlID09PSAtMSB8fCBjb2RlID09PSAzMikge1xuICAgICAgZWZmZWN0cy5jb25zdW1lKGNvZGUpXG4gICAgICBzaXplKytcbiAgICAgIHJldHVybiBzaXplID09PSA0ID8gb2sgOiB3aGl0ZXNwYWNlXG4gICAgfVxuXG4gICAgLy8gRU9GIG9yIHdoaXRlc3BhY2VcbiAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlIDwgMCkge1xuICAgICAgcmV0dXJuIG9rKGNvZGUpXG4gICAgfVxuXG4gICAgLy8gQW55dGhpbmcgZWxzZS5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cbn1cbiIsICJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vc3ludGF4JylcbiIsICJ2YXIgbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZSA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L2NoYXJhY3Rlci9tYXJrZG93bi1saW5lLWVuZGluZy1vci1zcGFjZScpXG52YXIgc3BhY2VGYWN0b3J5ID0gcmVxdWlyZSgnbWljcm9tYXJrL2Rpc3QvdG9rZW5pemUvZmFjdG9yeS1zcGFjZScpXG52YXIgcHJlZml4U2l6ZSA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L3V0aWwvcHJlZml4LXNpemUnKVxuXG52YXIgdGFza2xpc3RDaGVjayA9IHt0b2tlbml6ZTogdG9rZW5pemVUYXNrbGlzdENoZWNrfVxuXG5leHBvcnRzLnRleHQgPSB7OTE6IHRhc2tsaXN0Q2hlY2t9XG5cbmZ1bmN0aW9uIHRva2VuaXplVGFza2xpc3RDaGVjayhlZmZlY3RzLCBvaywgbm9rKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIHJldHVybiBvcGVuXG5cbiAgZnVuY3Rpb24gb3Blbihjb2RlKSB7XG4gICAgaWYgKFxuICAgICAgLy8gRXhpdCBpZiBub3QgYFtgLlxuICAgICAgY29kZSAhPT0gOTEgfHxcbiAgICAgIC8vIEV4aXQgaWYgdGhlcmVcdTIwMTlzIHN0dWZmIGJlZm9yZS5cbiAgICAgIHNlbGYucHJldmlvdXMgIT09IG51bGwgfHxcbiAgICAgIC8vIEV4aXQgaWYgbm90IGluIHRoZSBmaXJzdCBjb250ZW50IHRoYXQgaXMgdGhlIGZpcnN0IGNoaWxkIG9mIGEgbGlzdFxuICAgICAgLy8gaXRlbS5cbiAgICAgICFzZWxmLl9nZm1UYXNrbGlzdEZpcnN0Q29udGVudE9mTGlzdEl0ZW1cbiAgICApIHtcbiAgICAgIHJldHVybiBub2soY29kZSlcbiAgICB9XG5cbiAgICBlZmZlY3RzLmVudGVyKCd0YXNrTGlzdENoZWNrJylcbiAgICBlZmZlY3RzLmVudGVyKCd0YXNrTGlzdENoZWNrTWFya2VyJylcbiAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICBlZmZlY3RzLmV4aXQoJ3Rhc2tMaXN0Q2hlY2tNYXJrZXInKVxuICAgIHJldHVybiBpbnNpZGVcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2lkZShjb2RlKSB7XG4gICAgLy8gVGFiIG9yIHNwYWNlLlxuICAgIGlmIChjb2RlID09PSAtMiB8fCBjb2RlID09PSAzMikge1xuICAgICAgZWZmZWN0cy5lbnRlcigndGFza0xpc3RDaGVja1ZhbHVlVW5jaGVja2VkJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgZWZmZWN0cy5leGl0KCd0YXNrTGlzdENoZWNrVmFsdWVVbmNoZWNrZWQnKVxuICAgICAgcmV0dXJuIGNsb3NlXG4gICAgfVxuXG4gICAgLy8gVXBwZXItIGFuZCBsb3dlciBgeGAuXG4gICAgaWYgKGNvZGUgPT09IDg4IHx8IGNvZGUgPT09IDEyMCkge1xuICAgICAgZWZmZWN0cy5lbnRlcigndGFza0xpc3RDaGVja1ZhbHVlQ2hlY2tlZCcpXG4gICAgICBlZmZlY3RzLmNvbnN1bWUoY29kZSlcbiAgICAgIGVmZmVjdHMuZXhpdCgndGFza0xpc3RDaGVja1ZhbHVlQ2hlY2tlZCcpXG4gICAgICByZXR1cm4gY2xvc2VcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZShjb2RlKSB7XG4gICAgLy8gYF1gXG4gICAgaWYgKGNvZGUgPT09IDkzKSB7XG4gICAgICBlZmZlY3RzLmVudGVyKCd0YXNrTGlzdENoZWNrTWFya2VyJylcbiAgICAgIGVmZmVjdHMuY29uc3VtZShjb2RlKVxuICAgICAgZWZmZWN0cy5leGl0KCd0YXNrTGlzdENoZWNrTWFya2VyJylcbiAgICAgIGVmZmVjdHMuZXhpdCgndGFza0xpc3RDaGVjaycpXG4gICAgICByZXR1cm4gZWZmZWN0cy5jaGVjayh7dG9rZW5pemU6IHNwYWNlVGhlbk5vblNwYWNlfSwgb2ssIG5vaylcbiAgICB9XG5cbiAgICByZXR1cm4gbm9rKGNvZGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gc3BhY2VUaGVuTm9uU3BhY2UoZWZmZWN0cywgb2ssIG5vaykge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICByZXR1cm4gc3BhY2VGYWN0b3J5KGVmZmVjdHMsIGFmdGVyLCAnd2hpdGVzcGFjZScpXG5cbiAgZnVuY3Rpb24gYWZ0ZXIoY29kZSkge1xuICAgIHJldHVybiBwcmVmaXhTaXplKHNlbGYuZXZlbnRzLCAnd2hpdGVzcGFjZScpICYmXG4gICAgICBjb2RlICE9PSBudWxsICYmXG4gICAgICAhbWFya2Rvd25MaW5lRW5kaW5nT3JTcGFjZShjb2RlKVxuICAgICAgPyBvayhjb2RlKVxuICAgICAgOiBub2soY29kZSlcbiAgfVxufVxuIiwgIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9zeW50YXgnKVxuIiwgInZhciBjb21iaW5lID0gcmVxdWlyZSgnbWljcm9tYXJrL2Rpc3QvdXRpbC9jb21iaW5lLWV4dGVuc2lvbnMnKVxudmFyIGF1dG9saW5rID0gcmVxdWlyZSgnbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tYXV0b2xpbmstbGl0ZXJhbCcpXG52YXIgc3RyaWtldGhyb3VnaCA9IHJlcXVpcmUoJ21pY3JvbWFyay1leHRlbnNpb24tZ2ZtLXN0cmlrZXRocm91Z2gnKVxudmFyIHRhYmxlID0gcmVxdWlyZSgnbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFibGUnKVxudmFyIHRhc2tsaXN0ID0gcmVxdWlyZSgnbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0tdGFzay1saXN0LWl0ZW0nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVxuXG5mdW5jdGlvbiBjcmVhdGUob3B0aW9ucykge1xuICByZXR1cm4gY29tYmluZShbYXV0b2xpbmssIHN0cmlrZXRocm91Z2gob3B0aW9ucyksIHRhYmxlLCB0YXNrbGlzdF0pXG59XG4iLCAibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL3N5bnRheCcpXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gY2NvdW50XG5cbmZ1bmN0aW9uIGNjb3VudChzb3VyY2UsIGNoYXJhY3Rlcikge1xuICB2YXIgdmFsdWUgPSBTdHJpbmcoc291cmNlKVxuICB2YXIgY291bnQgPSAwXG4gIHZhciBpbmRleFxuXG4gIGlmICh0eXBlb2YgY2hhcmFjdGVyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgY2hhcmFjdGVyJylcbiAgfVxuXG4gIGluZGV4ID0gdmFsdWUuaW5kZXhPZihjaGFyYWN0ZXIpXG5cbiAgd2hpbGUgKGluZGV4ICE9PSAtMSkge1xuICAgIGNvdW50KytcbiAgICBpbmRleCA9IHZhbHVlLmluZGV4T2YoY2hhcmFjdGVyLCBpbmRleCArIGNoYXJhY3Rlci5sZW5ndGgpXG4gIH1cblxuICByZXR1cm4gY291bnRcbn1cbiIsICIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSBjb252ZXJ0XG5cbmZ1bmN0aW9uIGNvbnZlcnQodGVzdCkge1xuICBpZiAodGVzdCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG9rXG4gIH1cblxuICBpZiAodHlwZW9mIHRlc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHR5cGVGYWN0b3J5KHRlc3QpXG4gIH1cblxuICBpZiAodHlwZW9mIHRlc3QgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuICdsZW5ndGgnIGluIHRlc3QgPyBhbnlGYWN0b3J5KHRlc3QpIDogYWxsRmFjdG9yeSh0ZXN0KVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRlc3RcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZnVuY3Rpb24sIHN0cmluZywgb3Igb2JqZWN0IGFzIHRlc3QnKVxufVxuXG4vLyBVdGlsaXR5IGFzc2VydCBlYWNoIHByb3BlcnR5IGluIGB0ZXN0YCBpcyByZXByZXNlbnRlZCBpbiBgbm9kZWAsIGFuZCBlYWNoXG4vLyB2YWx1ZXMgYXJlIHN0cmljdGx5IGVxdWFsLlxuZnVuY3Rpb24gYWxsRmFjdG9yeSh0ZXN0KSB7XG4gIHJldHVybiBhbGxcblxuICBmdW5jdGlvbiBhbGwobm9kZSkge1xuICAgIHZhciBrZXlcblxuICAgIGZvciAoa2V5IGluIHRlc3QpIHtcbiAgICAgIGlmIChub2RlW2tleV0gIT09IHRlc3Rba2V5XSkgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxufVxuXG5mdW5jdGlvbiBhbnlGYWN0b3J5KHRlc3RzKSB7XG4gIHZhciBjaGVja3MgPSBbXVxuICB2YXIgaW5kZXggPSAtMVxuXG4gIHdoaWxlICgrK2luZGV4IDwgdGVzdHMubGVuZ3RoKSB7XG4gICAgY2hlY2tzW2luZGV4XSA9IGNvbnZlcnQodGVzdHNbaW5kZXhdKVxuICB9XG5cbiAgcmV0dXJuIGFueVxuXG4gIGZ1bmN0aW9uIGFueSgpIHtcbiAgICB2YXIgaW5kZXggPSAtMVxuXG4gICAgd2hpbGUgKCsraW5kZXggPCBjaGVja3MubGVuZ3RoKSB7XG4gICAgICBpZiAoY2hlY2tzW2luZGV4XS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuLy8gVXRpbGl0eSB0byBjb252ZXJ0IGEgc3RyaW5nIGludG8gYSBmdW5jdGlvbiB3aGljaCBjaGVja3MgYSBnaXZlbiBub2RlXHUyMDE5cyB0eXBlXG4vLyBmb3Igc2FpZCBzdHJpbmcuXG5mdW5jdGlvbiB0eXBlRmFjdG9yeSh0ZXN0KSB7XG4gIHJldHVybiB0eXBlXG5cbiAgZnVuY3Rpb24gdHlwZShub2RlKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4obm9kZSAmJiBub2RlLnR5cGUgPT09IHRlc3QpXG4gIH1cbn1cblxuLy8gVXRpbGl0eSB0byByZXR1cm4gdHJ1ZS5cbmZ1bmN0aW9uIG9rKCkge1xuICByZXR1cm4gdHJ1ZVxufVxuIiwgIm1vZHVsZS5leHBvcnRzID0gaWRlbnRpdHlcbmZ1bmN0aW9uIGlkZW50aXR5KGQpIHtcbiAgcmV0dXJuIGRcbn1cbiIsICIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB2aXNpdFBhcmVudHNcblxudmFyIGNvbnZlcnQgPSByZXF1aXJlKCd1bmlzdC11dGlsLWlzL2NvbnZlcnQnKVxudmFyIGNvbG9yID0gcmVxdWlyZSgnLi9jb2xvcicpXG5cbnZhciBDT05USU5VRSA9IHRydWVcbnZhciBTS0lQID0gJ3NraXAnXG52YXIgRVhJVCA9IGZhbHNlXG5cbnZpc2l0UGFyZW50cy5DT05USU5VRSA9IENPTlRJTlVFXG52aXNpdFBhcmVudHMuU0tJUCA9IFNLSVBcbnZpc2l0UGFyZW50cy5FWElUID0gRVhJVFxuXG5mdW5jdGlvbiB2aXNpdFBhcmVudHModHJlZSwgdGVzdCwgdmlzaXRvciwgcmV2ZXJzZSkge1xuICB2YXIgc3RlcFxuICB2YXIgaXNcblxuICBpZiAodHlwZW9mIHRlc3QgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZpc2l0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXZlcnNlID0gdmlzaXRvclxuICAgIHZpc2l0b3IgPSB0ZXN0XG4gICAgdGVzdCA9IG51bGxcbiAgfVxuXG4gIGlzID0gY29udmVydCh0ZXN0KVxuICBzdGVwID0gcmV2ZXJzZSA/IC0xIDogMVxuXG4gIGZhY3RvcnkodHJlZSwgbnVsbCwgW10pKClcblxuICBmdW5jdGlvbiBmYWN0b3J5KG5vZGUsIGluZGV4LCBwYXJlbnRzKSB7XG4gICAgdmFyIHZhbHVlID0gdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIG5vZGUgIT09IG51bGwgPyBub2RlIDoge31cbiAgICB2YXIgbmFtZVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZS50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgbmFtZSA9XG4gICAgICAgIHR5cGVvZiB2YWx1ZS50YWdOYW1lID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gdmFsdWUudGFnTmFtZVxuICAgICAgICAgIDogdHlwZW9mIHZhbHVlLm5hbWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyB2YWx1ZS5uYW1lXG4gICAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgdmlzaXQuZGlzcGxheU5hbWUgPVxuICAgICAgICAnbm9kZSAoJyArIGNvbG9yKHZhbHVlLnR5cGUgKyAobmFtZSA/ICc8JyArIG5hbWUgKyAnPicgOiAnJykpICsgJyknXG4gICAgfVxuXG4gICAgcmV0dXJuIHZpc2l0XG5cbiAgICBmdW5jdGlvbiB2aXNpdCgpIHtcbiAgICAgIHZhciBncmFuZHBhcmVudHMgPSBwYXJlbnRzLmNvbmNhdChub2RlKVxuICAgICAgdmFyIHJlc3VsdCA9IFtdXG4gICAgICB2YXIgc3VicmVzdWx0XG4gICAgICB2YXIgb2Zmc2V0XG5cbiAgICAgIGlmICghdGVzdCB8fCBpcyhub2RlLCBpbmRleCwgcGFyZW50c1twYXJlbnRzLmxlbmd0aCAtIDFdIHx8IG51bGwpKSB7XG4gICAgICAgIHJlc3VsdCA9IHRvUmVzdWx0KHZpc2l0b3Iobm9kZSwgcGFyZW50cykpXG5cbiAgICAgICAgaWYgKHJlc3VsdFswXSA9PT0gRVhJVCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5jaGlsZHJlbiAmJiByZXN1bHRbMF0gIT09IFNLSVApIHtcbiAgICAgICAgb2Zmc2V0ID0gKHJldmVyc2UgPyBub2RlLmNoaWxkcmVuLmxlbmd0aCA6IC0xKSArIHN0ZXBcblxuICAgICAgICB3aGlsZSAob2Zmc2V0ID4gLTEgJiYgb2Zmc2V0IDwgbm9kZS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICBzdWJyZXN1bHQgPSBmYWN0b3J5KG5vZGUuY2hpbGRyZW5bb2Zmc2V0XSwgb2Zmc2V0LCBncmFuZHBhcmVudHMpKClcblxuICAgICAgICAgIGlmIChzdWJyZXN1bHRbMF0gPT09IEVYSVQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdWJyZXN1bHRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvZmZzZXQgPVxuICAgICAgICAgICAgdHlwZW9mIHN1YnJlc3VsdFsxXSA9PT0gJ251bWJlcicgPyBzdWJyZXN1bHRbMV0gOiBvZmZzZXQgKyBzdGVwXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0b1Jlc3VsdCh2YWx1ZSkge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAnbGVuZ3RoJyBpbiB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gW0NPTlRJTlVFLCB2YWx1ZV1cbiAgfVxuXG4gIHJldHVybiBbdmFsdWVdXG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZyA9PiB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHQvLyBFc2NhcGUgY2hhcmFjdGVycyB3aXRoIHNwZWNpYWwgbWVhbmluZyBlaXRoZXIgaW5zaWRlIG9yIG91dHNpZGUgY2hhcmFjdGVyIHNldHMuXG5cdC8vIFVzZSBhIHNpbXBsZSBiYWNrc2xhc2ggZXNjYXBlIHdoZW4gaXRcdTIwMTlzIGFsd2F5cyB2YWxpZCwgYW5kIGEgXFx1bm5ubiBlc2NhcGUgd2hlbiB0aGUgc2ltcGxlciBmb3JtIHdvdWxkIGJlIGRpc2FsbG93ZWQgYnkgVW5pY29kZSBwYXR0ZXJuc1x1MjAxOSBzdHJpY3RlciBncmFtbWFyLlxuXHRyZXR1cm4gc3RyaW5nXG5cdFx0LnJlcGxhY2UoL1t8XFxcXHt9KClbXFxdXiQrKj8uXS9nLCAnXFxcXCQmJylcblx0XHQucmVwbGFjZSgvLS9nLCAnXFxcXHgyZCcpO1xufTtcbiIsICIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSBmaW5kQW5kUmVwbGFjZVxuXG52YXIgdmlzaXQgPSByZXF1aXJlKCd1bmlzdC11dGlsLXZpc2l0LXBhcmVudHMnKVxudmFyIGNvbnZlcnQgPSByZXF1aXJlKCd1bmlzdC11dGlsLWlzL2NvbnZlcnQnKVxudmFyIGVzY2FwZSA9IHJlcXVpcmUoJ2VzY2FwZS1zdHJpbmctcmVnZXhwJylcblxudmFyIHNwbGljZSA9IFtdLnNwbGljZVxuXG5mdW5jdGlvbiBmaW5kQW5kUmVwbGFjZSh0cmVlLCBmaW5kLCByZXBsYWNlLCBvcHRpb25zKSB7XG4gIHZhciBzZXR0aW5nc1xuICB2YXIgc2NoZW1hXG5cbiAgaWYgKHR5cGVvZiBmaW5kID09PSAnc3RyaW5nJyB8fCAoZmluZCAmJiB0eXBlb2YgZmluZC5leGVjID09PSAnZnVuY3Rpb24nKSkge1xuICAgIHNjaGVtYSA9IFtbZmluZCwgcmVwbGFjZV1dXG4gIH0gZWxzZSB7XG4gICAgc2NoZW1hID0gZmluZFxuICAgIG9wdGlvbnMgPSByZXBsYWNlXG4gIH1cblxuICBzZXR0aW5ncyA9IG9wdGlvbnMgfHwge31cblxuICBzZWFyY2godHJlZSwgc2V0dGluZ3MsIGhhbmRsZXJGYWN0b3J5KHRvUGFpcnMoc2NoZW1hKSkpXG5cbiAgcmV0dXJuIHRyZWVcblxuICBmdW5jdGlvbiBoYW5kbGVyRmFjdG9yeShwYWlycykge1xuICAgIHZhciBwYWlyID0gcGFpcnNbMF1cblxuICAgIHJldHVybiBoYW5kbGVyXG5cbiAgICBmdW5jdGlvbiBoYW5kbGVyKG5vZGUsIHBhcmVudCkge1xuICAgICAgdmFyIGZpbmQgPSBwYWlyWzBdXG4gICAgICB2YXIgcmVwbGFjZSA9IHBhaXJbMV1cbiAgICAgIHZhciBub2RlcyA9IFtdXG4gICAgICB2YXIgc3RhcnQgPSAwXG4gICAgICB2YXIgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihub2RlKVxuICAgICAgdmFyIHBvc2l0aW9uXG4gICAgICB2YXIgbWF0Y2hcbiAgICAgIHZhciBzdWJoYW5kbGVyXG4gICAgICB2YXIgdmFsdWVcblxuICAgICAgZmluZC5sYXN0SW5kZXggPSAwXG5cbiAgICAgIG1hdGNoID0gZmluZC5leGVjKG5vZGUudmFsdWUpXG5cbiAgICAgIHdoaWxlIChtYXRjaCkge1xuICAgICAgICBwb3NpdGlvbiA9IG1hdGNoLmluZGV4XG4gICAgICAgIHZhbHVlID0gcmVwbGFjZS5hcHBseShcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIFtdLmNvbmNhdChtYXRjaCwge2luZGV4OiBtYXRjaC5pbmRleCwgaW5wdXQ6IG1hdGNoLmlucHV0fSlcbiAgICAgICAgKVxuXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBpZiAoc3RhcnQgIT09IHBvc2l0aW9uKSB7XG4gICAgICAgICAgICBub2Rlcy5wdXNoKHt0eXBlOiAndGV4dCcsIHZhbHVlOiBub2RlLnZhbHVlLnNsaWNlKHN0YXJ0LCBwb3NpdGlvbil9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhbHVlID0ge3R5cGU6ICd0ZXh0JywgdmFsdWU6IHZhbHVlfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgbm9kZXMgPSBbXS5jb25jYXQobm9kZXMsIHZhbHVlKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHN0YXJ0ID0gcG9zaXRpb24gKyBtYXRjaFswXS5sZW5ndGhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZmluZC5nbG9iYWwpIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgbWF0Y2ggPSBmaW5kLmV4ZWMobm9kZS52YWx1ZSlcbiAgICAgIH1cblxuICAgICAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbm9kZXMgPSBbbm9kZV1cbiAgICAgICAgaW5kZXgtLVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHN0YXJ0IDwgbm9kZS52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICBub2Rlcy5wdXNoKHt0eXBlOiAndGV4dCcsIHZhbHVlOiBub2RlLnZhbHVlLnNsaWNlKHN0YXJ0KX0pXG4gICAgICAgIH1cblxuICAgICAgICBub2Rlcy51bnNoaWZ0KGluZGV4LCAxKVxuICAgICAgICBzcGxpY2UuYXBwbHkocGFyZW50LmNoaWxkcmVuLCBub2RlcylcbiAgICAgIH1cblxuICAgICAgaWYgKHBhaXJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgc3ViaGFuZGxlciA9IGhhbmRsZXJGYWN0b3J5KHBhaXJzLnNsaWNlKDEpKVxuICAgICAgICBwb3NpdGlvbiA9IC0xXG5cbiAgICAgICAgd2hpbGUgKCsrcG9zaXRpb24gPCBub2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICBub2RlID0gbm9kZXNbcG9zaXRpb25dXG5cbiAgICAgICAgICBpZiAobm9kZS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgIHN1YmhhbmRsZXIobm9kZSwgcGFyZW50KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWFyY2gobm9kZSwgc2V0dGluZ3MsIHN1YmhhbmRsZXIpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbmRleCArIG5vZGVzLmxlbmd0aCArIDFcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2VhcmNoKHRyZWUsIHNldHRpbmdzLCBoYW5kbGVyKSB7XG4gIHZhciBpZ25vcmVkID0gY29udmVydChzZXR0aW5ncy5pZ25vcmUgfHwgW10pXG4gIHZhciByZXN1bHQgPSBbXVxuXG4gIHZpc2l0KHRyZWUsICd0ZXh0JywgdmlzaXRvcilcblxuICByZXR1cm4gcmVzdWx0XG5cbiAgZnVuY3Rpb24gdmlzaXRvcihub2RlLCBwYXJlbnRzKSB7XG4gICAgdmFyIGluZGV4ID0gLTFcbiAgICB2YXIgcGFyZW50XG4gICAgdmFyIGdyYW5kcGFyZW50XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IHBhcmVudHMubGVuZ3RoKSB7XG4gICAgICBwYXJlbnQgPSBwYXJlbnRzW2luZGV4XVxuXG4gICAgICBpZiAoXG4gICAgICAgIGlnbm9yZWQoXG4gICAgICAgICAgcGFyZW50LFxuICAgICAgICAgIGdyYW5kcGFyZW50ID8gZ3JhbmRwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihwYXJlbnQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGdyYW5kcGFyZW50XG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZ3JhbmRwYXJlbnQgPSBwYXJlbnRcbiAgICB9XG5cbiAgICByZXR1cm4gaGFuZGxlcihub2RlLCBncmFuZHBhcmVudClcbiAgfVxufVxuXG5mdW5jdGlvbiB0b1BhaXJzKHNjaGVtYSkge1xuICB2YXIgcmVzdWx0ID0gW11cbiAgdmFyIGtleVxuICB2YXIgaW5kZXhcblxuICBpZiAodHlwZW9mIHNjaGVtYSAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGFycmF5IG9yIG9iamVjdCBhcyBzY2hlbWEnKVxuICB9XG5cbiAgaWYgKCdsZW5ndGgnIGluIHNjaGVtYSkge1xuICAgIGluZGV4ID0gLTFcblxuICAgIHdoaWxlICgrK2luZGV4IDwgc2NoZW1hLmxlbmd0aCkge1xuICAgICAgcmVzdWx0LnB1c2goW1xuICAgICAgICB0b0V4cHJlc3Npb24oc2NoZW1hW2luZGV4XVswXSksXG4gICAgICAgIHRvRnVuY3Rpb24oc2NoZW1hW2luZGV4XVsxXSlcbiAgICAgIF0pXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoa2V5IGluIHNjaGVtYSkge1xuICAgICAgcmVzdWx0LnB1c2goW3RvRXhwcmVzc2lvbihrZXkpLCB0b0Z1bmN0aW9uKHNjaGVtYVtrZXldKV0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiB0b0V4cHJlc3Npb24oZmluZCkge1xuICByZXR1cm4gdHlwZW9mIGZpbmQgPT09ICdzdHJpbmcnID8gbmV3IFJlZ0V4cChlc2NhcGUoZmluZCksICdnJykgOiBmaW5kXG59XG5cbmZ1bmN0aW9uIHRvRnVuY3Rpb24ocmVwbGFjZSkge1xuICByZXR1cm4gdHlwZW9mIHJlcGxhY2UgPT09ICdmdW5jdGlvbicgPyByZXBsYWNlIDogcmV0dXJuZXJcblxuICBmdW5jdGlvbiByZXR1cm5lcigpIHtcbiAgICByZXR1cm4gcmVwbGFjZVxuICB9XG59XG4iLCAidmFyIGNjb3VudCA9IHJlcXVpcmUoJ2Njb3VudCcpXG52YXIgZmluZEFuZFJlcGxhY2UgPSByZXF1aXJlKCdtZGFzdC11dGlsLWZpbmQtYW5kLXJlcGxhY2UnKVxudmFyIHVuaWNvZGVQdW5jdHVhdGlvbiA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L2NoYXJhY3Rlci91bmljb2RlLXB1bmN0dWF0aW9uJylcbnZhciB1bmljb2RlV2hpdGVzcGFjZSA9IHJlcXVpcmUoJ21pY3JvbWFyay9kaXN0L2NoYXJhY3Rlci91bmljb2RlLXdoaXRlc3BhY2UnKVxuXG5leHBvcnRzLnRyYW5zZm9ybXMgPSBbdHJhbnNmb3JtR2ZtQXV0b2xpbmtMaXRlcmFsc11cbmV4cG9ydHMuZW50ZXIgPSB7XG4gIGxpdGVyYWxBdXRvbGluazogZW50ZXJMaXRlcmFsQXV0b2xpbmssXG4gIGxpdGVyYWxBdXRvbGlua0VtYWlsOiBlbnRlckxpdGVyYWxBdXRvbGlua1ZhbHVlLFxuICBsaXRlcmFsQXV0b2xpbmtIdHRwOiBlbnRlckxpdGVyYWxBdXRvbGlua1ZhbHVlLFxuICBsaXRlcmFsQXV0b2xpbmtXd3c6IGVudGVyTGl0ZXJhbEF1dG9saW5rVmFsdWVcbn1cbmV4cG9ydHMuZXhpdCA9IHtcbiAgbGl0ZXJhbEF1dG9saW5rOiBleGl0TGl0ZXJhbEF1dG9saW5rLFxuICBsaXRlcmFsQXV0b2xpbmtFbWFpbDogZXhpdExpdGVyYWxBdXRvbGlua0VtYWlsLFxuICBsaXRlcmFsQXV0b2xpbmtIdHRwOiBleGl0TGl0ZXJhbEF1dG9saW5rSHR0cCxcbiAgbGl0ZXJhbEF1dG9saW5rV3d3OiBleGl0TGl0ZXJhbEF1dG9saW5rV3d3XG59XG5cbmZ1bmN0aW9uIGVudGVyTGl0ZXJhbEF1dG9saW5rKHRva2VuKSB7XG4gIHRoaXMuZW50ZXIoe3R5cGU6ICdsaW5rJywgdGl0bGU6IG51bGwsIHVybDogJycsIGNoaWxkcmVuOiBbXX0sIHRva2VuKVxufVxuXG5mdW5jdGlvbiBlbnRlckxpdGVyYWxBdXRvbGlua1ZhbHVlKHRva2VuKSB7XG4gIHRoaXMuY29uZmlnLmVudGVyLmF1dG9saW5rUHJvdG9jb2wuY2FsbCh0aGlzLCB0b2tlbilcbn1cblxuZnVuY3Rpb24gZXhpdExpdGVyYWxBdXRvbGlua0h0dHAodG9rZW4pIHtcbiAgdGhpcy5jb25maWcuZXhpdC5hdXRvbGlua1Byb3RvY29sLmNhbGwodGhpcywgdG9rZW4pXG59XG5cbmZ1bmN0aW9uIGV4aXRMaXRlcmFsQXV0b2xpbmtXd3codG9rZW4pIHtcbiAgdGhpcy5jb25maWcuZXhpdC5kYXRhLmNhbGwodGhpcywgdG9rZW4pXG4gIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXS51cmwgPSAnaHR0cDovLycgKyB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKVxufVxuXG5mdW5jdGlvbiBleGl0TGl0ZXJhbEF1dG9saW5rRW1haWwodG9rZW4pIHtcbiAgdGhpcy5jb25maWcuZXhpdC5hdXRvbGlua0VtYWlsLmNhbGwodGhpcywgdG9rZW4pXG59XG5cbmZ1bmN0aW9uIGV4aXRMaXRlcmFsQXV0b2xpbmsodG9rZW4pIHtcbiAgdGhpcy5leGl0KHRva2VuKVxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1HZm1BdXRvbGlua0xpdGVyYWxzKHRyZWUpIHtcbiAgZmluZEFuZFJlcGxhY2UoXG4gICAgdHJlZSxcbiAgICBbXG4gICAgICBbLyhodHRwcz86XFwvXFwvfHd3dyg/PVxcLikpKFstLlxcd10rKShbXiBcXHRcXHJcXG5dKikvaSwgZmluZFVybF0sXG4gICAgICBbLyhbLS5cXHcrXSspQChbLVxcd10rKD86XFwuWy1cXHddKykrKS8sIGZpbmRFbWFpbF1cbiAgICBdLFxuICAgIHtpZ25vcmU6IFsnbGluaycsICdsaW5rUmVmZXJlbmNlJ119XG4gIClcbn1cblxuZnVuY3Rpb24gZmluZFVybCgkMCwgcHJvdG9jb2wsIGRvbWFpbiwgcGF0aCwgbWF0Y2gpIHtcbiAgdmFyIHByZWZpeCA9ICcnXG4gIHZhciBwYXJ0c1xuICB2YXIgcmVzdWx0XG5cbiAgLy8gTm90IGFuIGV4cGVjdGVkIHByZXZpb3VzIGNoYXJhY3Rlci5cbiAgaWYgKCFwcmV2aW91cyhtYXRjaCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFRyZWF0IGB3d3dgIGFzIHBhcnQgb2YgdGhlIGRvbWFpbi5cbiAgaWYgKC9edy9pLnRlc3QocHJvdG9jb2wpKSB7XG4gICAgZG9tYWluID0gcHJvdG9jb2wgKyBkb21haW5cbiAgICBwcm90b2NvbCA9ICcnXG4gICAgcHJlZml4ID0gJ2h0dHA6Ly8nXG4gIH1cblxuICBpZiAoIWlzQ29ycmVjdERvbWFpbihkb21haW4pKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBwYXJ0cyA9IHNwbGl0VXJsKGRvbWFpbiArIHBhdGgpXG5cbiAgaWYgKCFwYXJ0c1swXSkgcmV0dXJuIGZhbHNlXG5cbiAgcmVzdWx0ID0ge1xuICAgIHR5cGU6ICdsaW5rJyxcbiAgICB0aXRsZTogbnVsbCxcbiAgICB1cmw6IHByZWZpeCArIHByb3RvY29sICsgcGFydHNbMF0sXG4gICAgY2hpbGRyZW46IFt7dHlwZTogJ3RleHQnLCB2YWx1ZTogcHJvdG9jb2wgKyBwYXJ0c1swXX1dXG4gIH1cblxuICBpZiAocGFydHNbMV0pIHtcbiAgICByZXN1bHQgPSBbcmVzdWx0LCB7dHlwZTogJ3RleHQnLCB2YWx1ZTogcGFydHNbMV19XVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBmaW5kRW1haWwoJDAsIGF0ZXh0LCBsYWJlbCwgbWF0Y2gpIHtcbiAgLy8gTm90IGFuIGV4cGVjdGVkIHByZXZpb3VzIGNoYXJhY3Rlci5cbiAgaWYgKCFwcmV2aW91cyhtYXRjaCwgdHJ1ZSkgfHwgL1tfLV0kLy50ZXN0KGxhYmVsKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnbGluaycsXG4gICAgdGl0bGU6IG51bGwsXG4gICAgdXJsOiAnbWFpbHRvOicgKyBhdGV4dCArICdAJyArIGxhYmVsLFxuICAgIGNoaWxkcmVuOiBbe3R5cGU6ICd0ZXh0JywgdmFsdWU6IGF0ZXh0ICsgJ0AnICsgbGFiZWx9XVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ29ycmVjdERvbWFpbihkb21haW4pIHtcbiAgdmFyIHBhcnRzID0gZG9tYWluLnNwbGl0KCcuJylcblxuICBpZiAoXG4gICAgcGFydHMubGVuZ3RoIDwgMiB8fFxuICAgIChwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSAmJlxuICAgICAgKC9fLy50ZXN0KHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdKSB8fFxuICAgICAgICAhL1thLXpBLVpcXGRdLy50ZXN0KHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdKSkpIHx8XG4gICAgKHBhcnRzW3BhcnRzLmxlbmd0aCAtIDJdICYmXG4gICAgICAoL18vLnRlc3QocGFydHNbcGFydHMubGVuZ3RoIC0gMl0pIHx8XG4gICAgICAgICEvW2EtekEtWlxcZF0vLnRlc3QocGFydHNbcGFydHMubGVuZ3RoIC0gMl0pKSlcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBzcGxpdFVybCh1cmwpIHtcbiAgdmFyIHRyYWlsID0gL1shXCImJyksLjo7PD4/XFxdfV0rJC8uZXhlYyh1cmwpXG4gIHZhciBjbG9zaW5nUGFyZW5JbmRleFxuICB2YXIgb3BlbmluZ1BhcmVuc1xuICB2YXIgY2xvc2luZ1BhcmVuc1xuXG4gIGlmICh0cmFpbCkge1xuICAgIHVybCA9IHVybC5zbGljZSgwLCB0cmFpbC5pbmRleClcbiAgICB0cmFpbCA9IHRyYWlsWzBdXG4gICAgY2xvc2luZ1BhcmVuSW5kZXggPSB0cmFpbC5pbmRleE9mKCcpJylcbiAgICBvcGVuaW5nUGFyZW5zID0gY2NvdW50KHVybCwgJygnKVxuICAgIGNsb3NpbmdQYXJlbnMgPSBjY291bnQodXJsLCAnKScpXG5cbiAgICB3aGlsZSAoY2xvc2luZ1BhcmVuSW5kZXggIT09IC0xICYmIG9wZW5pbmdQYXJlbnMgPiBjbG9zaW5nUGFyZW5zKSB7XG4gICAgICB1cmwgKz0gdHJhaWwuc2xpY2UoMCwgY2xvc2luZ1BhcmVuSW5kZXggKyAxKVxuICAgICAgdHJhaWwgPSB0cmFpbC5zbGljZShjbG9zaW5nUGFyZW5JbmRleCArIDEpXG4gICAgICBjbG9zaW5nUGFyZW5JbmRleCA9IHRyYWlsLmluZGV4T2YoJyknKVxuICAgICAgY2xvc2luZ1BhcmVucysrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFt1cmwsIHRyYWlsXVxufVxuXG5mdW5jdGlvbiBwcmV2aW91cyhtYXRjaCwgZW1haWwpIHtcbiAgdmFyIGNvZGUgPSBtYXRjaC5pbnB1dC5jaGFyQ29kZUF0KG1hdGNoLmluZGV4IC0gMSlcbiAgcmV0dXJuIChcbiAgICAoY29kZSAhPT0gY29kZSB8fCB1bmljb2RlV2hpdGVzcGFjZShjb2RlKSB8fCB1bmljb2RlUHVuY3R1YXRpb24oY29kZSkpICYmXG4gICAgKCFlbWFpbCB8fCBjb2RlICE9PSA0NylcbiAgKVxufVxuIiwgImV4cG9ydHMuY2FuQ29udGFpbkVvbHMgPSBbJ2RlbGV0ZSddXG5leHBvcnRzLmVudGVyID0ge3N0cmlrZXRocm91Z2g6IGVudGVyU3RyaWtldGhyb3VnaH1cbmV4cG9ydHMuZXhpdCA9IHtzdHJpa2V0aHJvdWdoOiBleGl0U3RyaWtldGhyb3VnaH1cblxuZnVuY3Rpb24gZW50ZXJTdHJpa2V0aHJvdWdoKHRva2VuKSB7XG4gIHRoaXMuZW50ZXIoe3R5cGU6ICdkZWxldGUnLCBjaGlsZHJlbjogW119LCB0b2tlbilcbn1cblxuZnVuY3Rpb24gZXhpdFN0cmlrZXRocm91Z2godG9rZW4pIHtcbiAgdGhpcy5leGl0KHRva2VuKVxufVxuIiwgImV4cG9ydHMuZW50ZXIgPSB7XG4gIHRhYmxlOiBlbnRlclRhYmxlLFxuICB0YWJsZURhdGE6IGVudGVyQ2VsbCxcbiAgdGFibGVIZWFkZXI6IGVudGVyQ2VsbCxcbiAgdGFibGVSb3c6IGVudGVyUm93XG59XG5leHBvcnRzLmV4aXQgPSB7XG4gIGNvZGVUZXh0OiBleGl0Q29kZVRleHQsXG4gIHRhYmxlOiBleGl0VGFibGUsXG4gIHRhYmxlRGF0YTogZXhpdCxcbiAgdGFibGVIZWFkZXI6IGV4aXQsXG4gIHRhYmxlUm93OiBleGl0XG59XG5cbmZ1bmN0aW9uIGVudGVyVGFibGUodG9rZW4pIHtcbiAgdGhpcy5lbnRlcih7dHlwZTogJ3RhYmxlJywgYWxpZ246IHRva2VuLl9hbGlnbiwgY2hpbGRyZW46IFtdfSwgdG9rZW4pXG4gIHRoaXMuc2V0RGF0YSgnaW5UYWJsZScsIHRydWUpXG59XG5cbmZ1bmN0aW9uIGV4aXRUYWJsZSh0b2tlbikge1xuICB0aGlzLmV4aXQodG9rZW4pXG4gIHRoaXMuc2V0RGF0YSgnaW5UYWJsZScpXG59XG5cbmZ1bmN0aW9uIGVudGVyUm93KHRva2VuKSB7XG4gIHRoaXMuZW50ZXIoe3R5cGU6ICd0YWJsZVJvdycsIGNoaWxkcmVuOiBbXX0sIHRva2VuKVxufVxuXG5mdW5jdGlvbiBleGl0KHRva2VuKSB7XG4gIHRoaXMuZXhpdCh0b2tlbilcbn1cblxuZnVuY3Rpb24gZW50ZXJDZWxsKHRva2VuKSB7XG4gIHRoaXMuZW50ZXIoe3R5cGU6ICd0YWJsZUNlbGwnLCBjaGlsZHJlbjogW119LCB0b2tlbilcbn1cblxuLy8gT3ZlcndyaXRlIHRoZSBkZWZhdWx0IGNvZGUgdGV4dCBkYXRhIGhhbmRsZXIgdG8gdW5lc2NhcGUgZXNjYXBlZCBwaXBlcyB3aGVuXG4vLyB0aGV5IGFyZSBpbiB0YWJsZXMuXG5mdW5jdGlvbiBleGl0Q29kZVRleHQodG9rZW4pIHtcbiAgdmFyIHZhbHVlID0gdGhpcy5yZXN1bWUoKVxuXG4gIGlmICh0aGlzLmdldERhdGEoJ2luVGFibGUnKSkge1xuICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFxcXChbXFxcXHxdKS9nLCByZXBsYWNlKVxuICB9XG5cbiAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdLnZhbHVlID0gdmFsdWVcbiAgdGhpcy5leGl0KHRva2VuKVxufVxuXG5mdW5jdGlvbiByZXBsYWNlKCQwLCAkMSkge1xuICAvLyBQaXBlcyB3b3JrLCBiYWNrc2xhc2hlcyBkb25cdTIwMTl0IChidXQgY2FuXHUyMDE5dCBlc2NhcGUgcGlwZXMpLlxuICByZXR1cm4gJDEgPT09ICd8JyA/ICQxIDogJDBcbn1cbiIsICJleHBvcnRzLmV4aXQgPSB7XG4gIHRhc2tMaXN0Q2hlY2tWYWx1ZUNoZWNrZWQ6IGV4aXRDaGVjayxcbiAgdGFza0xpc3RDaGVja1ZhbHVlVW5jaGVja2VkOiBleGl0Q2hlY2ssXG4gIHBhcmFncmFwaDogZXhpdFBhcmFncmFwaFdpdGhUYXNrTGlzdEl0ZW1cbn1cblxuZnVuY3Rpb24gZXhpdENoZWNrKHRva2VuKSB7XG4gIC8vIFdlXHUyMDE5cmUgYWx3YXlzIGluIGEgcGFyYWdyYXBoLCBpbiBhIGxpc3QgaXRlbS5cbiAgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDJdLmNoZWNrZWQgPVxuICAgIHRva2VuLnR5cGUgPT09ICd0YXNrTGlzdENoZWNrVmFsdWVDaGVja2VkJ1xufVxuXG5mdW5jdGlvbiBleGl0UGFyYWdyYXBoV2l0aFRhc2tMaXN0SXRlbSh0b2tlbikge1xuICB2YXIgcGFyZW50ID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDJdXG4gIHZhciBub2RlID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdXG4gIHZhciBzaWJsaW5ncyA9IHBhcmVudC5jaGlsZHJlblxuICB2YXIgaGVhZCA9IG5vZGUuY2hpbGRyZW5bMF1cbiAgdmFyIGluZGV4ID0gLTFcbiAgdmFyIGZpcnN0UGFyYWdocmFwaFxuXG4gIGlmIChcbiAgICBwYXJlbnQgJiZcbiAgICBwYXJlbnQudHlwZSA9PT0gJ2xpc3RJdGVtJyAmJlxuICAgIHR5cGVvZiBwYXJlbnQuY2hlY2tlZCA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgaGVhZCAmJlxuICAgIGhlYWQudHlwZSA9PT0gJ3RleHQnXG4gICkge1xuICAgIHdoaWxlICgrK2luZGV4IDwgc2libGluZ3MubGVuZ3RoKSB7XG4gICAgICBpZiAoc2libGluZ3NbaW5kZXhdLnR5cGUgPT09ICdwYXJhZ3JhcGgnKSB7XG4gICAgICAgIGZpcnN0UGFyYWdocmFwaCA9IHNpYmxpbmdzW2luZGV4XVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmaXJzdFBhcmFnaHJhcGggPT09IG5vZGUpIHtcbiAgICAgIC8vIE11c3Qgc3RhcnQgd2l0aCBhIHNwYWNlIG9yIGEgdGFiLlxuICAgICAgaGVhZC52YWx1ZSA9IGhlYWQudmFsdWUuc2xpY2UoMSlcblxuICAgICAgaWYgKGhlYWQudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG5vZGUuY2hpbGRyZW4uc2hpZnQoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGVhZC5wb3NpdGlvbi5zdGFydC5jb2x1bW4rK1xuICAgICAgICBoZWFkLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCsrXG4gICAgICAgIG5vZGUucG9zaXRpb24uc3RhcnQgPSBPYmplY3QuYXNzaWduKHt9LCBoZWFkLnBvc2l0aW9uLnN0YXJ0KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRoaXMuZXhpdCh0b2tlbilcbn1cbiIsICJ2YXIgYXV0b2xpbmtMaXRlcmFsID0gcmVxdWlyZSgnbWRhc3QtdXRpbC1nZm0tYXV0b2xpbmstbGl0ZXJhbC9mcm9tLW1hcmtkb3duJylcbnZhciBzdHJpa2V0aHJvdWdoID0gcmVxdWlyZSgnbWRhc3QtdXRpbC1nZm0tc3RyaWtldGhyb3VnaC9mcm9tLW1hcmtkb3duJylcbnZhciB0YWJsZSA9IHJlcXVpcmUoJ21kYXN0LXV0aWwtZ2ZtLXRhYmxlL2Zyb20tbWFya2Rvd24nKVxudmFyIHRhc2tMaXN0SXRlbSA9IHJlcXVpcmUoJ21kYXN0LXV0aWwtZ2ZtLXRhc2stbGlzdC1pdGVtL2Zyb20tbWFya2Rvd24nKVxuXG52YXIgb3duID0ge30uaGFzT3duUHJvcGVydHlcblxubW9kdWxlLmV4cG9ydHMgPSBjb25maWd1cmUoW1xuICBhdXRvbGlua0xpdGVyYWwsXG4gIHN0cmlrZXRocm91Z2gsXG4gIHRhYmxlLFxuICB0YXNrTGlzdEl0ZW1cbl0pXG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZShleHRlbnNpb25zKSB7XG4gIHZhciBjb25maWcgPSB7dHJhbnNmb3JtczogW10sIGNhbkNvbnRhaW5Fb2xzOiBbXX1cbiAgdmFyIGxlbmd0aCA9IGV4dGVuc2lvbnMubGVuZ3RoXG4gIHZhciBpbmRleCA9IC0xXG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBleHRlbnNpb24oY29uZmlnLCBleHRlbnNpb25zW2luZGV4XSlcbiAgfVxuXG4gIHJldHVybiBjb25maWdcbn1cblxuZnVuY3Rpb24gZXh0ZW5zaW9uKGNvbmZpZywgZXh0ZW5zaW9uKSB7XG4gIHZhciBrZXlcbiAgdmFyIGxlZnRcbiAgdmFyIHJpZ2h0XG5cbiAgZm9yIChrZXkgaW4gZXh0ZW5zaW9uKSB7XG4gICAgbGVmdCA9IG93bi5jYWxsKGNvbmZpZywga2V5KSA/IGNvbmZpZ1trZXldIDogKGNvbmZpZ1trZXldID0ge30pXG4gICAgcmlnaHQgPSBleHRlbnNpb25ba2V5XVxuXG4gICAgaWYgKGtleSA9PT0gJ2NhbkNvbnRhaW5Fb2xzJyB8fCBrZXkgPT09ICd0cmFuc2Zvcm1zJykge1xuICAgICAgY29uZmlnW2tleV0gPSBbXS5jb25jYXQobGVmdCwgcmlnaHQpXG4gICAgfSBlbHNlIHtcbiAgICAgIE9iamVjdC5hc3NpZ24obGVmdCwgcmlnaHQpXG4gICAgfVxuICB9XG59XG4iLCAidmFyIGluQ29uc3RydWN0ID0gJ3BocmFzaW5nJ1xudmFyIG5vdEluQ29uc3RydWN0ID0gWydhdXRvbGluaycsICdsaW5rJywgJ2ltYWdlJywgJ2xhYmVsJ11cblxuZXhwb3J0cy51bnNhZmUgPSBbXG4gIHtcbiAgICBjaGFyYWN0ZXI6ICdAJyxcbiAgICBiZWZvcmU6ICdbK1xcXFwtLlxcXFx3XScsXG4gICAgYWZ0ZXI6ICdbXFxcXC0uXFxcXHddJyxcbiAgICBpbkNvbnN0cnVjdDogaW5Db25zdHJ1Y3QsXG4gICAgbm90SW5Db25zdHJ1Y3Q6IG5vdEluQ29uc3RydWN0XG4gIH0sXG4gIHtcbiAgICBjaGFyYWN0ZXI6ICcuJyxcbiAgICBiZWZvcmU6ICdbV3ddJyxcbiAgICBhZnRlcjogJ1tcXFxcLS5cXFxcd10nLFxuICAgIGluQ29uc3RydWN0OiBpbkNvbnN0cnVjdCxcbiAgICBub3RJbkNvbnN0cnVjdDogbm90SW5Db25zdHJ1Y3RcbiAgfSxcbiAge1xuICAgIGNoYXJhY3RlcjogJzonLFxuICAgIGJlZm9yZTogJ1twc10nLFxuICAgIGFmdGVyOiAnXFxcXC8nLFxuICAgIGluQ29uc3RydWN0OiBpbkNvbnN0cnVjdCxcbiAgICBub3RJbkNvbnN0cnVjdDogbm90SW5Db25zdHJ1Y3RcbiAgfVxuXVxuIiwgIm1vZHVsZS5leHBvcnRzID0gcGhyYXNpbmdcblxuZnVuY3Rpb24gcGhyYXNpbmcocGFyZW50LCBjb250ZXh0LCBzYWZlT3B0aW9ucykge1xuICB2YXIgY2hpbGRyZW4gPSBwYXJlbnQuY2hpbGRyZW4gfHwgW11cbiAgdmFyIHJlc3VsdHMgPSBbXVxuICB2YXIgaW5kZXggPSAtMVxuICB2YXIgYmVmb3JlID0gc2FmZU9wdGlvbnMuYmVmb3JlXG4gIHZhciBhZnRlclxuICB2YXIgaGFuZGxlXG4gIHZhciBjaGlsZFxuXG4gIHdoaWxlICgrK2luZGV4IDwgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgY2hpbGQgPSBjaGlsZHJlbltpbmRleF1cblxuICAgIGlmIChpbmRleCArIDEgPCBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIGhhbmRsZSA9IGNvbnRleHQuaGFuZGxlLmhhbmRsZXJzW2NoaWxkcmVuW2luZGV4ICsgMV0udHlwZV1cbiAgICAgIGlmIChoYW5kbGUgJiYgaGFuZGxlLnBlZWspIGhhbmRsZSA9IGhhbmRsZS5wZWVrXG4gICAgICBhZnRlciA9IGhhbmRsZVxuICAgICAgICA/IGhhbmRsZShjaGlsZHJlbltpbmRleCArIDFdLCBwYXJlbnQsIGNvbnRleHQsIHtcbiAgICAgICAgICAgIGJlZm9yZTogJycsXG4gICAgICAgICAgICBhZnRlcjogJydcbiAgICAgICAgICB9KS5jaGFyQXQoMClcbiAgICAgICAgOiAnJ1xuICAgIH0gZWxzZSB7XG4gICAgICBhZnRlciA9IHNhZmVPcHRpb25zLmFmdGVyXG4gICAgfVxuXG4gICAgLy8gSW4gc29tZSBjYXNlcywgaHRtbCAodGV4dCkgY2FuIGJlIGZvdW5kIGluIHBocmFzaW5nIHJpZ2h0IGFmdGVyIGFuIGVvbC5cbiAgICAvLyBXaGVuIHdlXHUyMDE5ZCBzZXJpYWxpemUgdGhhdCwgaW4gbW9zdCBjYXNlcyB0aGF0IHdvdWxkIGJlIHNlZW4gYXMgaHRtbFxuICAgIC8vIChmbG93KS5cbiAgICAvLyBBcyB3ZSBjYW5cdTIwMTl0IGVzY2FwZSBvciBzbyB0byBwcmV2ZW50IGl0IGZyb20gaGFwcGVuaW5nLCB3ZSB0YWtlIGEgc29tZXdoYXRcbiAgICAvLyByZWFzb25hYmxlIGFwcHJvYWNoOiByZXBsYWNlIHRoYXQgZW9sIHdpdGggYSBzcGFjZS5cbiAgICAvLyBTZWU6IDxodHRwczovL2dpdGh1Yi5jb20vc3ludGF4LXRyZWUvbWRhc3QtdXRpbC10by1tYXJrZG93bi9pc3N1ZXMvMTU+XG4gICAgaWYgKFxuICAgICAgcmVzdWx0cy5sZW5ndGggPiAwICYmXG4gICAgICAoYmVmb3JlID09PSAnXFxyJyB8fCBiZWZvcmUgPT09ICdcXG4nKSAmJlxuICAgICAgY2hpbGQudHlwZSA9PT0gJ2h0bWwnXG4gICAgKSB7XG4gICAgICByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0gPSByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0ucmVwbGFjZShcbiAgICAgICAgLyhcXHI/XFxufFxccikkLyxcbiAgICAgICAgJyAnXG4gICAgICApXG4gICAgICBiZWZvcmUgPSAnICdcbiAgICB9XG5cbiAgICByZXN1bHRzLnB1c2goXG4gICAgICBjb250ZXh0LmhhbmRsZShjaGlsZCwgcGFyZW50LCBjb250ZXh0LCB7XG4gICAgICAgIGJlZm9yZTogYmVmb3JlLFxuICAgICAgICBhZnRlcjogYWZ0ZXJcbiAgICAgIH0pXG4gICAgKVxuXG4gICAgYmVmb3JlID0gcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdLnNsaWNlKC0xKVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHMuam9pbignJylcbn1cbiIsICJ2YXIgcGhyYXNpbmcgPSByZXF1aXJlKCdtZGFzdC11dGlsLXRvLW1hcmtkb3duL2xpYi91dGlsL2NvbnRhaW5lci1waHJhc2luZycpXG5cbmV4cG9ydHMudW5zYWZlID0gW3tjaGFyYWN0ZXI6ICd+JywgaW5Db25zdHJ1Y3Q6ICdwaHJhc2luZyd9XVxuZXhwb3J0cy5oYW5kbGVycyA9IHtkZWxldGU6IGhhbmRsZURlbGV0ZX1cblxuaGFuZGxlRGVsZXRlLnBlZWsgPSBwZWVrRGVsZXRlXG5cbmZ1bmN0aW9uIGhhbmRsZURlbGV0ZShub2RlLCBfLCBjb250ZXh0KSB7XG4gIHZhciBleGl0ID0gY29udGV4dC5lbnRlcignZW1waGFzaXMnKVxuICB2YXIgdmFsdWUgPSBwaHJhc2luZyhub2RlLCBjb250ZXh0LCB7YmVmb3JlOiAnficsIGFmdGVyOiAnfid9KVxuICBleGl0KClcbiAgcmV0dXJuICd+ficgKyB2YWx1ZSArICd+fidcbn1cblxuZnVuY3Rpb24gcGVla0RlbGV0ZSgpIHtcbiAgcmV0dXJuICd+J1xufVxuIiwgIm1vZHVsZS5leHBvcnRzID0gcGF0dGVybkNvbXBpbGVcblxuZnVuY3Rpb24gcGF0dGVybkNvbXBpbGUocGF0dGVybikge1xuICB2YXIgYmVmb3JlXG4gIHZhciBhZnRlclxuXG4gIGlmICghcGF0dGVybi5fY29tcGlsZWQpIHtcbiAgICBiZWZvcmUgPSBwYXR0ZXJuLmJlZm9yZSA/ICcoPzonICsgcGF0dGVybi5iZWZvcmUgKyAnKScgOiAnJ1xuICAgIGFmdGVyID0gcGF0dGVybi5hZnRlciA/ICcoPzonICsgcGF0dGVybi5hZnRlciArICcpJyA6ICcnXG5cbiAgICBpZiAocGF0dGVybi5hdEJyZWFrKSB7XG4gICAgICBiZWZvcmUgPSAnW1xcXFxyXFxcXG5dW1xcXFx0IF0qJyArIGJlZm9yZVxuICAgIH1cblxuICAgIHBhdHRlcm4uX2NvbXBpbGVkID0gbmV3IFJlZ0V4cChcbiAgICAgIChiZWZvcmUgPyAnKCcgKyBiZWZvcmUgKyAnKScgOiAnJykgK1xuICAgICAgICAoL1t8XFxcXHt9KClbXFxdXiQrKj8uLV0vLnRlc3QocGF0dGVybi5jaGFyYWN0ZXIpID8gJ1xcXFwnIDogJycpICtcbiAgICAgICAgcGF0dGVybi5jaGFyYWN0ZXIgK1xuICAgICAgICAoYWZ0ZXIgfHwgJycpLFxuICAgICAgJ2cnXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHBhdHRlcm4uX2NvbXBpbGVkXG59XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBpbmxpbmVDb2RlXG5pbmxpbmVDb2RlLnBlZWsgPSBpbmxpbmVDb2RlUGVla1xuXG52YXIgcGF0dGVybkNvbXBpbGUgPSByZXF1aXJlKCcuLi91dGlsL3BhdHRlcm4tY29tcGlsZScpXG5cbmZ1bmN0aW9uIGlubGluZUNvZGUobm9kZSwgcGFyZW50LCBjb250ZXh0KSB7XG4gIHZhciB2YWx1ZSA9IG5vZGUudmFsdWUgfHwgJydcbiAgdmFyIHNlcXVlbmNlID0gJ2AnXG4gIHZhciBpbmRleCA9IC0xXG4gIHZhciBwYXR0ZXJuXG4gIHZhciBleHByZXNzaW9uXG4gIHZhciBtYXRjaFxuICB2YXIgcG9zaXRpb25cblxuICAvLyBJZiB0aGVyZSBpcyBhIHNpbmdsZSBncmF2ZSBhY2NlbnQgb24gaXRzIG93biBpbiB0aGUgY29kZSwgdXNlIGEgZmVuY2Ugb2ZcbiAgLy8gdHdvLlxuICAvLyBJZiB0aGVyZSBhcmUgdHdvIGluIGEgcm93LCB1c2Ugb25lLlxuICB3aGlsZSAobmV3IFJlZ0V4cCgnKF58W15gXSknICsgc2VxdWVuY2UgKyAnKFteYF18JCknKS50ZXN0KHZhbHVlKSkge1xuICAgIHNlcXVlbmNlICs9ICdgJ1xuICB9XG5cbiAgLy8gSWYgdGhpcyBpcyBub3QganVzdCBzcGFjZXMgb3IgZW9scyAodGFicyBkb25cdTIwMTl0IGNvdW50KSwgYW5kIGVpdGhlciB0aGVcbiAgLy8gZmlyc3Qgb3IgbGFzdCBjaGFyYWN0ZXIgYXJlIGEgc3BhY2UsIGVvbCwgb3IgdGljaywgdGhlbiBwYWQgd2l0aCBzcGFjZXMuXG4gIGlmIChcbiAgICAvW14gXFxyXFxuXS8udGVzdCh2YWx1ZSkgJiZcbiAgICAoL1sgXFxyXFxuYF0vLnRlc3QodmFsdWUuY2hhckF0KDApKSB8fFxuICAgICAgL1sgXFxyXFxuYF0vLnRlc3QodmFsdWUuY2hhckF0KHZhbHVlLmxlbmd0aCAtIDEpKSlcbiAgKSB7XG4gICAgdmFsdWUgPSAnICcgKyB2YWx1ZSArICcgJ1xuICB9XG5cbiAgLy8gV2UgaGF2ZSBhIHBvdGVudGlhbCBwcm9ibGVtOiBjZXJ0YWluIGNoYXJhY3RlcnMgYWZ0ZXIgZW9scyBjb3VsZCByZXN1bHQgaW5cbiAgLy8gYmxvY2tzIGJlaW5nIHNlZW4uXG4gIC8vIEZvciBleGFtcGxlLCBpZiBzb21lb25lIGluamVjdGVkIHRoZSBzdHJpbmcgYCdcXG4jIGInYCwgdGhlbiB0aGF0IHdvdWxkXG4gIC8vIHJlc3VsdCBpbiBhbiBBVFggaGVhZGluZy5cbiAgLy8gV2UgY2FuXHUyMDE5dCBlc2NhcGUgY2hhcmFjdGVycyBpbiBgaW5saW5lQ29kZWAsIGJ1dCBiZWNhdXNlIGVvbHMgYXJlXG4gIC8vIHRyYW5zZm9ybWVkIHRvIHNwYWNlcyB3aGVuIGdvaW5nIGZyb20gbWFya2Rvd24gdG8gSFRNTCBhbnl3YXksIHdlIGNhbiBzd2FwXG4gIC8vIHRoZW0gb3V0LlxuICB3aGlsZSAoKytpbmRleCA8IGNvbnRleHQudW5zYWZlLmxlbmd0aCkge1xuICAgIHBhdHRlcm4gPSBjb250ZXh0LnVuc2FmZVtpbmRleF1cblxuICAgIC8vIE9ubHkgbG9vayBmb3IgYGF0QnJlYWtgcy5cbiAgICAvLyBCdHc6IG5vdGUgdGhhdCBgYXRCcmVha2AgcGF0dGVybnMgd2lsbCBhbHdheXMgc3RhcnQgdGhlIHJlZ2V4IGF0IExGIG9yXG4gICAgLy8gQ1IuXG4gICAgaWYgKCFwYXR0ZXJuLmF0QnJlYWspIGNvbnRpbnVlXG5cbiAgICBleHByZXNzaW9uID0gcGF0dGVybkNvbXBpbGUocGF0dGVybilcblxuICAgIHdoaWxlICgobWF0Y2ggPSBleHByZXNzaW9uLmV4ZWModmFsdWUpKSkge1xuICAgICAgcG9zaXRpb24gPSBtYXRjaC5pbmRleFxuXG4gICAgICAvLyBTdXBwb3J0IENSTEYgKHBhdHRlcm5zIG9ubHkgbG9vayBmb3Igb25lIG9mIHRoZSBjaGFyYWN0ZXJzKS5cbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUuY2hhckNvZGVBdChwb3NpdGlvbikgPT09IDEwIC8qIGBcXG5gICovICYmXG4gICAgICAgIHZhbHVlLmNoYXJDb2RlQXQocG9zaXRpb24gLSAxKSA9PT0gMTMgLyogYFxccmAgKi9cbiAgICAgICkge1xuICAgICAgICBwb3NpdGlvbi0tXG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgcG9zaXRpb24pICsgJyAnICsgdmFsdWUuc2xpY2UobWF0Y2guaW5kZXggKyAxKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzZXF1ZW5jZSArIHZhbHVlICsgc2VxdWVuY2Vcbn1cblxuZnVuY3Rpb24gaW5saW5lQ29kZVBlZWsoKSB7XG4gIHJldHVybiAnYCdcbn1cbiIsICIvKiFcbiAqIHJlcGVhdC1zdHJpbmcgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L3JlcGVhdC1zdHJpbmc+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBSZXN1bHRzIGNhY2hlXG4gKi9cblxudmFyIHJlcyA9ICcnO1xudmFyIGNhY2hlO1xuXG4vKipcbiAqIEV4cG9zZSBgcmVwZWF0YFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcmVwZWF0O1xuXG4vKipcbiAqIFJlcGVhdCB0aGUgZ2l2ZW4gYHN0cmluZ2AgdGhlIHNwZWNpZmllZCBgbnVtYmVyYFxuICogb2YgdGltZXMuXG4gKlxuICogKipFeGFtcGxlOioqXG4gKlxuICogYGBganNcbiAqIHZhciByZXBlYXQgPSByZXF1aXJlKCdyZXBlYXQtc3RyaW5nJyk7XG4gKiByZXBlYXQoJ0EnLCA1KTtcbiAqIC8vPT4gQUFBQUFcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RyaW5nYCBUaGUgc3RyaW5nIHRvIHJlcGVhdFxuICogQHBhcmFtIHtOdW1iZXJ9IGBudW1iZXJgIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBzdHJpbmdcbiAqIEByZXR1cm4ge1N0cmluZ30gUmVwZWF0ZWQgc3RyaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHJlcGVhdChzdHIsIG51bSkge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleHBlY3RlZCBhIHN0cmluZycpO1xuICB9XG5cbiAgLy8gY292ZXIgY29tbW9uLCBxdWljayB1c2UgY2FzZXNcbiAgaWYgKG51bSA9PT0gMSkgcmV0dXJuIHN0cjtcbiAgaWYgKG51bSA9PT0gMikgcmV0dXJuIHN0ciArIHN0cjtcblxuICB2YXIgbWF4ID0gc3RyLmxlbmd0aCAqIG51bTtcbiAgaWYgKGNhY2hlICE9PSBzdHIgfHwgdHlwZW9mIGNhY2hlID09PSAndW5kZWZpbmVkJykge1xuICAgIGNhY2hlID0gc3RyO1xuICAgIHJlcyA9ICcnO1xuICB9IGVsc2UgaWYgKHJlcy5sZW5ndGggPj0gbWF4KSB7XG4gICAgcmV0dXJuIHJlcy5zdWJzdHIoMCwgbWF4KTtcbiAgfVxuXG4gIHdoaWxlIChtYXggPiByZXMubGVuZ3RoICYmIG51bSA+IDEpIHtcbiAgICBpZiAobnVtICYgMSkge1xuICAgICAgcmVzICs9IHN0cjtcbiAgICB9XG5cbiAgICBudW0gPj49IDE7XG4gICAgc3RyICs9IHN0cjtcbiAgfVxuXG4gIHJlcyArPSBzdHI7XG4gIHJlcyA9IHJlcy5zdWJzdHIoMCwgbWF4KTtcbiAgcmV0dXJuIHJlcztcbn1cbiIsICIndXNlIHN0cmljdCdcblxudmFyIHJlcGVhdCA9IHJlcXVpcmUoJ3JlcGVhdC1zdHJpbmcnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcmtkb3duVGFibGVcblxudmFyIHRyYWlsaW5nV2hpdGVzcGFjZSA9IC8gKyQvXG5cbi8vIENoYXJhY3RlcnMuXG52YXIgc3BhY2UgPSAnICdcbnZhciBsaW5lRmVlZCA9ICdcXG4nXG52YXIgZGFzaCA9ICctJ1xudmFyIGNvbG9uID0gJzonXG52YXIgdmVydGljYWxCYXIgPSAnfCdcblxudmFyIHggPSAwXG52YXIgQyA9IDY3XG52YXIgTCA9IDc2XG52YXIgUiA9IDgyXG52YXIgYyA9IDk5XG52YXIgbCA9IDEwOFxudmFyIHIgPSAxMTRcblxuLy8gQ3JlYXRlIGEgdGFibGUgZnJvbSBhIG1hdHJpeCBvZiBzdHJpbmdzLlxuZnVuY3Rpb24gbWFya2Rvd25UYWJsZSh0YWJsZSwgb3B0aW9ucykge1xuICB2YXIgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9XG4gIHZhciBwYWRkaW5nID0gc2V0dGluZ3MucGFkZGluZyAhPT0gZmFsc2VcbiAgdmFyIHN0YXJ0ID0gc2V0dGluZ3MuZGVsaW1pdGVyU3RhcnQgIT09IGZhbHNlXG4gIHZhciBlbmQgPSBzZXR0aW5ncy5kZWxpbWl0ZXJFbmQgIT09IGZhbHNlXG4gIHZhciBhbGlnbiA9IChzZXR0aW5ncy5hbGlnbiB8fCBbXSkuY29uY2F0KClcbiAgdmFyIGFsaWduRGVsaW1pdGVycyA9IHNldHRpbmdzLmFsaWduRGVsaW1pdGVycyAhPT0gZmFsc2VcbiAgdmFyIGFsaWdubWVudHMgPSBbXVxuICB2YXIgc3RyaW5nTGVuZ3RoID0gc2V0dGluZ3Muc3RyaW5nTGVuZ3RoIHx8IGRlZmF1bHRTdHJpbmdMZW5ndGhcbiAgdmFyIHJvd0luZGV4ID0gLTFcbiAgdmFyIHJvd0xlbmd0aCA9IHRhYmxlLmxlbmd0aFxuICB2YXIgY2VsbE1hdHJpeCA9IFtdXG4gIHZhciBzaXplTWF0cml4ID0gW11cbiAgdmFyIHJvdyA9IFtdXG4gIHZhciBzaXplcyA9IFtdXG4gIHZhciBsb25nZXN0Q2VsbEJ5Q29sdW1uID0gW11cbiAgdmFyIG1vc3RDZWxsc1BlclJvdyA9IDBcbiAgdmFyIGNlbGxzXG4gIHZhciBjb2x1bW5JbmRleFxuICB2YXIgY29sdW1uTGVuZ3RoXG4gIHZhciBsYXJnZXN0XG4gIHZhciBzaXplXG4gIHZhciBjZWxsXG4gIHZhciBsaW5lc1xuICB2YXIgbGluZVxuICB2YXIgYmVmb3JlXG4gIHZhciBhZnRlclxuICB2YXIgY29kZVxuXG4gIC8vIFRoaXMgaXMgYSBzdXBlcmZsdW91cyBsb29wIGlmIHdlIGRvblx1MjAxOXQgYWxpZ24gZGVsaW1pdGVycywgYnV0IG90aGVyd2lzZSB3ZVx1MjAxOWRcbiAgLy8gZG8gc3VwZXJmbHVvdXMgd29yayB3aGVuIGFsaWduaW5nLCBzbyBvcHRpbWl6ZSBmb3IgYWxpZ25pbmcuXG4gIHdoaWxlICgrK3Jvd0luZGV4IDwgcm93TGVuZ3RoKSB7XG4gICAgY2VsbHMgPSB0YWJsZVtyb3dJbmRleF1cbiAgICBjb2x1bW5JbmRleCA9IC0xXG4gICAgY29sdW1uTGVuZ3RoID0gY2VsbHMubGVuZ3RoXG4gICAgcm93ID0gW11cbiAgICBzaXplcyA9IFtdXG5cbiAgICBpZiAoY29sdW1uTGVuZ3RoID4gbW9zdENlbGxzUGVyUm93KSB7XG4gICAgICBtb3N0Q2VsbHNQZXJSb3cgPSBjb2x1bW5MZW5ndGhcbiAgICB9XG5cbiAgICB3aGlsZSAoKytjb2x1bW5JbmRleCA8IGNvbHVtbkxlbmd0aCkge1xuICAgICAgY2VsbCA9IHNlcmlhbGl6ZShjZWxsc1tjb2x1bW5JbmRleF0pXG5cbiAgICAgIGlmIChhbGlnbkRlbGltaXRlcnMgPT09IHRydWUpIHtcbiAgICAgICAgc2l6ZSA9IHN0cmluZ0xlbmd0aChjZWxsKVxuICAgICAgICBzaXplc1tjb2x1bW5JbmRleF0gPSBzaXplXG5cbiAgICAgICAgbGFyZ2VzdCA9IGxvbmdlc3RDZWxsQnlDb2x1bW5bY29sdW1uSW5kZXhdXG5cbiAgICAgICAgaWYgKGxhcmdlc3QgPT09IHVuZGVmaW5lZCB8fCBzaXplID4gbGFyZ2VzdCkge1xuICAgICAgICAgIGxvbmdlc3RDZWxsQnlDb2x1bW5bY29sdW1uSW5kZXhdID0gc2l6ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJvdy5wdXNoKGNlbGwpXG4gICAgfVxuXG4gICAgY2VsbE1hdHJpeFtyb3dJbmRleF0gPSByb3dcbiAgICBzaXplTWF0cml4W3Jvd0luZGV4XSA9IHNpemVzXG4gIH1cblxuICAvLyBGaWd1cmUgb3V0IHdoaWNoIGFsaWdubWVudHMgdG8gdXNlLlxuICBjb2x1bW5JbmRleCA9IC0xXG4gIGNvbHVtbkxlbmd0aCA9IG1vc3RDZWxsc1BlclJvd1xuXG4gIGlmICh0eXBlb2YgYWxpZ24gPT09ICdvYmplY3QnICYmICdsZW5ndGgnIGluIGFsaWduKSB7XG4gICAgd2hpbGUgKCsrY29sdW1uSW5kZXggPCBjb2x1bW5MZW5ndGgpIHtcbiAgICAgIGFsaWdubWVudHNbY29sdW1uSW5kZXhdID0gdG9BbGlnbm1lbnQoYWxpZ25bY29sdW1uSW5kZXhdKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb2RlID0gdG9BbGlnbm1lbnQoYWxpZ24pXG5cbiAgICB3aGlsZSAoKytjb2x1bW5JbmRleCA8IGNvbHVtbkxlbmd0aCkge1xuICAgICAgYWxpZ25tZW50c1tjb2x1bW5JbmRleF0gPSBjb2RlXG4gICAgfVxuICB9XG5cbiAgLy8gSW5qZWN0IHRoZSBhbGlnbm1lbnQgcm93LlxuICBjb2x1bW5JbmRleCA9IC0xXG4gIGNvbHVtbkxlbmd0aCA9IG1vc3RDZWxsc1BlclJvd1xuICByb3cgPSBbXVxuICBzaXplcyA9IFtdXG5cbiAgd2hpbGUgKCsrY29sdW1uSW5kZXggPCBjb2x1bW5MZW5ndGgpIHtcbiAgICBjb2RlID0gYWxpZ25tZW50c1tjb2x1bW5JbmRleF1cbiAgICBiZWZvcmUgPSAnJ1xuICAgIGFmdGVyID0gJydcblxuICAgIGlmIChjb2RlID09PSBsKSB7XG4gICAgICBiZWZvcmUgPSBjb2xvblxuICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gcikge1xuICAgICAgYWZ0ZXIgPSBjb2xvblxuICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gYykge1xuICAgICAgYmVmb3JlID0gY29sb25cbiAgICAgIGFmdGVyID0gY29sb25cbiAgICB9XG5cbiAgICAvLyBUaGVyZSAqbXVzdCogYmUgYXQgbGVhc3Qgb25lIGh5cGhlbi1taW51cyBpbiBlYWNoIGFsaWdubWVudCBjZWxsLlxuICAgIHNpemUgPSBhbGlnbkRlbGltaXRlcnNcbiAgICAgID8gTWF0aC5tYXgoXG4gICAgICAgICAgMSxcbiAgICAgICAgICBsb25nZXN0Q2VsbEJ5Q29sdW1uW2NvbHVtbkluZGV4XSAtIGJlZm9yZS5sZW5ndGggLSBhZnRlci5sZW5ndGhcbiAgICAgICAgKVxuICAgICAgOiAxXG5cbiAgICBjZWxsID0gYmVmb3JlICsgcmVwZWF0KGRhc2gsIHNpemUpICsgYWZ0ZXJcblxuICAgIGlmIChhbGlnbkRlbGltaXRlcnMgPT09IHRydWUpIHtcbiAgICAgIHNpemUgPSBiZWZvcmUubGVuZ3RoICsgc2l6ZSArIGFmdGVyLmxlbmd0aFxuXG4gICAgICBpZiAoc2l6ZSA+IGxvbmdlc3RDZWxsQnlDb2x1bW5bY29sdW1uSW5kZXhdKSB7XG4gICAgICAgIGxvbmdlc3RDZWxsQnlDb2x1bW5bY29sdW1uSW5kZXhdID0gc2l6ZVxuICAgICAgfVxuXG4gICAgICBzaXplc1tjb2x1bW5JbmRleF0gPSBzaXplXG4gICAgfVxuXG4gICAgcm93W2NvbHVtbkluZGV4XSA9IGNlbGxcbiAgfVxuXG4gIC8vIEluamVjdCB0aGUgYWxpZ25tZW50IHJvdy5cbiAgY2VsbE1hdHJpeC5zcGxpY2UoMSwgMCwgcm93KVxuICBzaXplTWF0cml4LnNwbGljZSgxLCAwLCBzaXplcylcblxuICByb3dJbmRleCA9IC0xXG4gIHJvd0xlbmd0aCA9IGNlbGxNYXRyaXgubGVuZ3RoXG4gIGxpbmVzID0gW11cblxuICB3aGlsZSAoKytyb3dJbmRleCA8IHJvd0xlbmd0aCkge1xuICAgIHJvdyA9IGNlbGxNYXRyaXhbcm93SW5kZXhdXG4gICAgc2l6ZXMgPSBzaXplTWF0cml4W3Jvd0luZGV4XVxuICAgIGNvbHVtbkluZGV4ID0gLTFcbiAgICBjb2x1bW5MZW5ndGggPSBtb3N0Q2VsbHNQZXJSb3dcbiAgICBsaW5lID0gW11cblxuICAgIHdoaWxlICgrK2NvbHVtbkluZGV4IDwgY29sdW1uTGVuZ3RoKSB7XG4gICAgICBjZWxsID0gcm93W2NvbHVtbkluZGV4XSB8fCAnJ1xuICAgICAgYmVmb3JlID0gJydcbiAgICAgIGFmdGVyID0gJydcblxuICAgICAgaWYgKGFsaWduRGVsaW1pdGVycyA9PT0gdHJ1ZSkge1xuICAgICAgICBzaXplID0gbG9uZ2VzdENlbGxCeUNvbHVtbltjb2x1bW5JbmRleF0gLSAoc2l6ZXNbY29sdW1uSW5kZXhdIHx8IDApXG4gICAgICAgIGNvZGUgPSBhbGlnbm1lbnRzW2NvbHVtbkluZGV4XVxuXG4gICAgICAgIGlmIChjb2RlID09PSByKSB7XG4gICAgICAgICAgYmVmb3JlID0gcmVwZWF0KHNwYWNlLCBzaXplKVxuICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IGMpIHtcbiAgICAgICAgICBpZiAoc2l6ZSAlIDIgPT09IDApIHtcbiAgICAgICAgICAgIGJlZm9yZSA9IHJlcGVhdChzcGFjZSwgc2l6ZSAvIDIpXG4gICAgICAgICAgICBhZnRlciA9IGJlZm9yZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBiZWZvcmUgPSByZXBlYXQoc3BhY2UsIHNpemUgLyAyICsgMC41KVxuICAgICAgICAgICAgYWZ0ZXIgPSByZXBlYXQoc3BhY2UsIHNpemUgLyAyIC0gMC41KVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZnRlciA9IHJlcGVhdChzcGFjZSwgc2l6ZSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3RhcnQgPT09IHRydWUgJiYgY29sdW1uSW5kZXggPT09IDApIHtcbiAgICAgICAgbGluZS5wdXNoKHZlcnRpY2FsQmFyKVxuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHBhZGRpbmcgPT09IHRydWUgJiZcbiAgICAgICAgLy8gRG9uXHUyMDE5dCBhZGQgdGhlIG9wZW5pbmcgc3BhY2UgaWYgd2VcdTIwMTlyZSBub3QgYWxpZ25pbmcgYW5kIHRoZSBjZWxsIGlzXG4gICAgICAgIC8vIGVtcHR5OiB0aGVyZSB3aWxsIGJlIGEgY2xvc2luZyBzcGFjZS5cbiAgICAgICAgIShhbGlnbkRlbGltaXRlcnMgPT09IGZhbHNlICYmIGNlbGwgPT09ICcnKSAmJlxuICAgICAgICAoc3RhcnQgPT09IHRydWUgfHwgY29sdW1uSW5kZXggIT09IDApXG4gICAgICApIHtcbiAgICAgICAgbGluZS5wdXNoKHNwYWNlKVxuICAgICAgfVxuXG4gICAgICBpZiAoYWxpZ25EZWxpbWl0ZXJzID09PSB0cnVlKSB7XG4gICAgICAgIGxpbmUucHVzaChiZWZvcmUpXG4gICAgICB9XG5cbiAgICAgIGxpbmUucHVzaChjZWxsKVxuXG4gICAgICBpZiAoYWxpZ25EZWxpbWl0ZXJzID09PSB0cnVlKSB7XG4gICAgICAgIGxpbmUucHVzaChhZnRlcilcbiAgICAgIH1cblxuICAgICAgaWYgKHBhZGRpbmcgPT09IHRydWUpIHtcbiAgICAgICAgbGluZS5wdXNoKHNwYWNlKVxuICAgICAgfVxuXG4gICAgICBpZiAoZW5kID09PSB0cnVlIHx8IGNvbHVtbkluZGV4ICE9PSBjb2x1bW5MZW5ndGggLSAxKSB7XG4gICAgICAgIGxpbmUucHVzaCh2ZXJ0aWNhbEJhcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsaW5lID0gbGluZS5qb2luKCcnKVxuXG4gICAgaWYgKGVuZCA9PT0gZmFsc2UpIHtcbiAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UodHJhaWxpbmdXaGl0ZXNwYWNlLCAnJylcbiAgICB9XG5cbiAgICBsaW5lcy5wdXNoKGxpbmUpXG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbihsaW5lRmVlZClcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gJycgOiBTdHJpbmcodmFsdWUpXG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRTdHJpbmdMZW5ndGgodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLmxlbmd0aFxufVxuXG5mdW5jdGlvbiB0b0FsaWdubWVudCh2YWx1ZSkge1xuICB2YXIgY29kZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS5jaGFyQ29kZUF0KDApIDogeFxuXG4gIHJldHVybiBjb2RlID09PSBMIHx8IGNvZGUgPT09IGxcbiAgICA/IGxcbiAgICA6IGNvZGUgPT09IFIgfHwgY29kZSA9PT0gclxuICAgID8gclxuICAgIDogY29kZSA9PT0gQyB8fCBjb2RlID09PSBjXG4gICAgPyBjXG4gICAgOiB4XG59XG4iLCAidmFyIHBocmFzaW5nID0gcmVxdWlyZSgnbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvdXRpbC9jb250YWluZXItcGhyYXNpbmcnKVxudmFyIGRlZmF1bHRJbmxpbmVDb2RlID0gcmVxdWlyZSgnbWRhc3QtdXRpbC10by1tYXJrZG93bi9saWIvaGFuZGxlL2lubGluZS1jb2RlJylcbnZhciBtYXJrZG93blRhYmxlID0gcmVxdWlyZSgnbWFya2Rvd24tdGFibGUnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvTWFya2Rvd25cblxuZnVuY3Rpb24gdG9NYXJrZG93bihvcHRpb25zKSB7XG4gIHZhciBzZXR0aW5ncyA9IG9wdGlvbnMgfHwge31cbiAgdmFyIHBhZGRpbmcgPSBzZXR0aW5ncy50YWJsZUNlbGxQYWRkaW5nXG4gIHZhciBhbGlnbkRlbGltaXRlcnMgPSBzZXR0aW5ncy50YWJsZVBpcGVBbGlnblxuICB2YXIgc3RyaW5nTGVuZ3RoID0gc2V0dGluZ3Muc3RyaW5nTGVuZ3RoXG4gIHZhciBhcm91bmQgPSBwYWRkaW5nID8gJyAnIDogJ3wnXG5cbiAgcmV0dXJuIHtcbiAgICB1bnNhZmU6IFtcbiAgICAgIHtjaGFyYWN0ZXI6ICdcXHInLCBpbkNvbnN0cnVjdDogJ3RhYmxlQ2VsbCd9LFxuICAgICAge2NoYXJhY3RlcjogJ1xcbicsIGluQ29uc3RydWN0OiAndGFibGVDZWxsJ30sXG4gICAgICAvLyBBIHBpcGUsIHdoZW4gZm9sbG93ZWQgYnkgYSB0YWIgb3Igc3BhY2UgKHBhZGRpbmcpLCBvciBhIGRhc2ggb3IgY29sb25cbiAgICAgIC8vICh1bnBhZGRlZCBkZWxpbWl0ZXIgcm93KSwgY291bGQgcmVzdWx0IGluIGEgdGFibGUuXG4gICAgICB7YXRCcmVhazogdHJ1ZSwgY2hhcmFjdGVyOiAnfCcsIGFmdGVyOiAnW1xcdCA6LV0nfSxcbiAgICAgIC8vIEEgcGlwZSBpbiBhIGNlbGwgbXVzdCBiZSBlbmNvZGVkLlxuICAgICAge2NoYXJhY3RlcjogJ3wnLCBpbkNvbnN0cnVjdDogJ3RhYmxlQ2VsbCd9LFxuICAgICAgLy8gQSBjb2xvbiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgZGFzaCwgaW4gd2hpY2ggY2FzZSBpdCBjb3VsZCBzdGFydCBhXG4gICAgICAvLyBkZWxpbWl0ZXIgcm93LlxuICAgICAge2F0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogJzonLCBhZnRlcjogJy0nfSxcbiAgICAgIC8vIEEgZGVsaW1pdGVyIHJvdyBjYW4gYWxzbyBzdGFydCB3aXRoIGEgZGFzaCwgd2hlbiBmb2xsb3dlZCBieSBtb3JlXG4gICAgICAvLyBkYXNoZXMsIGEgY29sb24sIG9yIGEgcGlwZS5cbiAgICAgIC8vIFRoaXMgaXMgYSBzdHJpY3RlciB2ZXJzaW9uIHRoYW4gdGhlIGJ1aWx0IGluIGNoZWNrIGZvciBsaXN0cywgdGhlbWF0aWNcbiAgICAgIC8vIGJyZWFrcywgYW5kIHNldGV4IGhlYWRpbmcgdW5kZXJsaW5lcyB0aG91Z2g6XG4gICAgICAvLyA8aHR0cHM6Ly9naXRodWIuY29tL3N5bnRheC10cmVlL21kYXN0LXV0aWwtdG8tbWFya2Rvd24vYmxvYi81MWEyMDM4L2xpYi91bnNhZmUuanMjTDU3PlxuICAgICAge2F0QnJlYWs6IHRydWUsIGNoYXJhY3RlcjogJy0nLCBhZnRlcjogJ1s6fC1dJ31cbiAgICBdLFxuICAgIGhhbmRsZXJzOiB7XG4gICAgICB0YWJsZTogaGFuZGxlVGFibGUsXG4gICAgICB0YWJsZVJvdzogaGFuZGxlVGFibGVSb3csXG4gICAgICB0YWJsZUNlbGw6IGhhbmRsZVRhYmxlQ2VsbCxcbiAgICAgIGlubGluZUNvZGU6IGlubGluZUNvZGVXaXRoVGFibGVcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVUYWJsZShub2RlLCBfLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZURhdGEoaGFuZGxlVGFibGVBc0RhdGEobm9kZSwgY29udGV4dCksIG5vZGUuYWxpZ24pXG4gIH1cblxuICAvLyBUaGlzIGZ1bmN0aW9uIGlzblx1MjAxOXQgcmVhbGx5IHVzZWQgbm9ybWFsbHksIGJlY2F1c2Ugd2UgaGFuZGxlIHJvd3MgYXQgdGhlXG4gIC8vIHRhYmxlIGxldmVsLlxuICAvLyBCdXQsIGlmIHNvbWVvbmUgcGFzc2VzIGluIGEgdGFibGUgcm93LCB0aGlzIGVuc3VyZXMgd2UgbWFrZSBzb21ld2hhdCBzZW5zZS5cbiAgZnVuY3Rpb24gaGFuZGxlVGFibGVSb3cobm9kZSwgXywgY29udGV4dCkge1xuICAgIHZhciByb3cgPSBoYW5kbGVUYWJsZVJvd0FzRGF0YShub2RlLCBjb250ZXh0KVxuICAgIC8vIGBtYXJrZG93bi10YWJsZWAgd2lsbCBhbHdheXMgYWRkIGFuIGFsaWduIHJvd1xuICAgIHZhciB2YWx1ZSA9IHNlcmlhbGl6ZURhdGEoW3Jvd10pXG4gICAgcmV0dXJuIHZhbHVlLnNsaWNlKDAsIHZhbHVlLmluZGV4T2YoJ1xcbicpKVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlVGFibGVDZWxsKG5vZGUsIF8sIGNvbnRleHQpIHtcbiAgICB2YXIgZXhpdCA9IGNvbnRleHQuZW50ZXIoJ3RhYmxlQ2VsbCcpXG4gICAgdmFyIHZhbHVlID0gcGhyYXNpbmcobm9kZSwgY29udGV4dCwge2JlZm9yZTogYXJvdW5kLCBhZnRlcjogYXJvdW5kfSlcbiAgICBleGl0KClcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlcmlhbGl6ZURhdGEobWF0cml4LCBhbGlnbikge1xuICAgIHJldHVybiBtYXJrZG93blRhYmxlKG1hdHJpeCwge1xuICAgICAgYWxpZ246IGFsaWduLFxuICAgICAgYWxpZ25EZWxpbWl0ZXJzOiBhbGlnbkRlbGltaXRlcnMsXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgICAgc3RyaW5nTGVuZ3RoOiBzdHJpbmdMZW5ndGhcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlVGFibGVBc0RhdGEobm9kZSwgY29udGV4dCkge1xuICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW5cbiAgICB2YXIgaW5kZXggPSAtMVxuICAgIHZhciBsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGhcbiAgICB2YXIgcmVzdWx0ID0gW11cbiAgICB2YXIgc3ViZXhpdCA9IGNvbnRleHQuZW50ZXIoJ3RhYmxlJylcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gaGFuZGxlVGFibGVSb3dBc0RhdGEoY2hpbGRyZW5baW5kZXhdLCBjb250ZXh0KVxuICAgIH1cblxuICAgIHN1YmV4aXQoKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlVGFibGVSb3dBc0RhdGEobm9kZSwgY29udGV4dCkge1xuICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW5cbiAgICB2YXIgaW5kZXggPSAtMVxuICAgIHZhciBsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGhcbiAgICB2YXIgcmVzdWx0ID0gW11cbiAgICB2YXIgc3ViZXhpdCA9IGNvbnRleHQuZW50ZXIoJ3RhYmxlUm93JylcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gaGFuZGxlVGFibGVDZWxsKGNoaWxkcmVuW2luZGV4XSwgbm9kZSwgY29udGV4dClcbiAgICB9XG5cbiAgICBzdWJleGl0KClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGZ1bmN0aW9uIGlubGluZUNvZGVXaXRoVGFibGUobm9kZSwgcGFyZW50LCBjb250ZXh0KSB7XG4gICAgdmFyIHZhbHVlID0gZGVmYXVsdElubGluZUNvZGUobm9kZSwgcGFyZW50LCBjb250ZXh0KVxuXG4gICAgaWYgKGNvbnRleHQuc3RhY2suaW5kZXhPZigndGFibGVDZWxsJykgIT09IC0xKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcfC9nLCAnXFxcXCQmJylcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxufVxuIiwgIm1vZHVsZS5leHBvcnRzID0gY2hlY2tCdWxsZXRcblxuZnVuY3Rpb24gY2hlY2tCdWxsZXQoY29udGV4dCkge1xuICB2YXIgbWFya2VyID0gY29udGV4dC5vcHRpb25zLmJ1bGxldCB8fCAnKidcblxuICBpZiAobWFya2VyICE9PSAnKicgJiYgbWFya2VyICE9PSAnKycgJiYgbWFya2VyICE9PSAnLScpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQ2Fubm90IHNlcmlhbGl6ZSBpdGVtcyB3aXRoIGAnICtcbiAgICAgICAgbWFya2VyICtcbiAgICAgICAgJ2AgZm9yIGBvcHRpb25zLmJ1bGxldGAsIGV4cGVjdGVkIGAqYCwgYCtgLCBvciBgLWAnXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIG1hcmtlclxufVxuIiwgIm1vZHVsZS5leHBvcnRzID0gY2hlY2tMaXN0SXRlbUluZGVudFxuXG5mdW5jdGlvbiBjaGVja0xpc3RJdGVtSW5kZW50KGNvbnRleHQpIHtcbiAgdmFyIHN0eWxlID0gY29udGV4dC5vcHRpb25zLmxpc3RJdGVtSW5kZW50IHx8ICd0YWInXG5cbiAgaWYgKHN0eWxlID09PSAxIHx8IHN0eWxlID09PSAnMScpIHtcbiAgICByZXR1cm4gJ29uZSdcbiAgfVxuXG4gIGlmIChzdHlsZSAhPT0gJ3RhYicgJiYgc3R5bGUgIT09ICdvbmUnICYmIHN0eWxlICE9PSAnbWl4ZWQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0Nhbm5vdCBzZXJpYWxpemUgaXRlbXMgd2l0aCBgJyArXG4gICAgICAgIHN0eWxlICtcbiAgICAgICAgJ2AgZm9yIGBvcHRpb25zLmxpc3RJdGVtSW5kZW50YCwgZXhwZWN0ZWQgYHRhYmAsIGBvbmVgLCBvciBgbWl4ZWRgJ1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBzdHlsZVxufVxuIiwgIm1vZHVsZS5leHBvcnRzID0gZmxvd1xuXG52YXIgcmVwZWF0ID0gcmVxdWlyZSgncmVwZWF0LXN0cmluZycpXG5cbmZ1bmN0aW9uIGZsb3cocGFyZW50LCBjb250ZXh0KSB7XG4gIHZhciBjaGlsZHJlbiA9IHBhcmVudC5jaGlsZHJlbiB8fCBbXVxuICB2YXIgcmVzdWx0cyA9IFtdXG4gIHZhciBpbmRleCA9IC0xXG4gIHZhciBjaGlsZFxuXG4gIHdoaWxlICgrK2luZGV4IDwgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgY2hpbGQgPSBjaGlsZHJlbltpbmRleF1cblxuICAgIHJlc3VsdHMucHVzaChcbiAgICAgIGNvbnRleHQuaGFuZGxlKGNoaWxkLCBwYXJlbnQsIGNvbnRleHQsIHtiZWZvcmU6ICdcXG4nLCBhZnRlcjogJ1xcbid9KVxuICAgIClcblxuICAgIGlmIChpbmRleCArIDEgPCBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdHMucHVzaChiZXR3ZWVuKGNoaWxkLCBjaGlsZHJlbltpbmRleCArIDFdKSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0cy5qb2luKCcnKVxuXG4gIGZ1bmN0aW9uIGJldHdlZW4obGVmdCwgcmlnaHQpIHtcbiAgICB2YXIgaW5kZXggPSAtMVxuICAgIHZhciByZXN1bHRcblxuICAgIHdoaWxlICgrK2luZGV4IDwgY29udGV4dC5qb2luLmxlbmd0aCkge1xuICAgICAgcmVzdWx0ID0gY29udGV4dC5qb2luW2luZGV4XShsZWZ0LCByaWdodCwgcGFyZW50LCBjb250ZXh0KVxuXG4gICAgICBpZiAocmVzdWx0ID09PSB0cnVlIHx8IHJlc3VsdCA9PT0gMSkge1xuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHJlcGVhdCgnXFxuJywgMSArIE51bWJlcihyZXN1bHQpKVxuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gJ1xcblxcbjwhLS0tLT5cXG5cXG4nXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICdcXG5cXG4nXG4gIH1cbn1cbiIsICJtb2R1bGUuZXhwb3J0cyA9IGluZGVudExpbmVzXG5cbnZhciBlb2wgPSAvXFxyP1xcbnxcXHIvZ1xuXG5mdW5jdGlvbiBpbmRlbnRMaW5lcyh2YWx1ZSwgbWFwKSB7XG4gIHZhciByZXN1bHQgPSBbXVxuICB2YXIgc3RhcnQgPSAwXG4gIHZhciBsaW5lID0gMFxuICB2YXIgbWF0Y2hcblxuICB3aGlsZSAoKG1hdGNoID0gZW9sLmV4ZWModmFsdWUpKSkge1xuICAgIG9uZSh2YWx1ZS5zbGljZShzdGFydCwgbWF0Y2guaW5kZXgpKVxuICAgIHJlc3VsdC5wdXNoKG1hdGNoWzBdKVxuICAgIHN0YXJ0ID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGhcbiAgICBsaW5lKytcbiAgfVxuXG4gIG9uZSh2YWx1ZS5zbGljZShzdGFydCkpXG5cbiAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKVxuXG4gIGZ1bmN0aW9uIG9uZSh2YWx1ZSkge1xuICAgIHJlc3VsdC5wdXNoKG1hcCh2YWx1ZSwgbGluZSwgIXZhbHVlKSlcbiAgfVxufVxuIiwgIm1vZHVsZS5leHBvcnRzID0gbGlzdEl0ZW1cblxudmFyIHJlcGVhdCA9IHJlcXVpcmUoJ3JlcGVhdC1zdHJpbmcnKVxudmFyIGNoZWNrQnVsbGV0ID0gcmVxdWlyZSgnLi4vdXRpbC9jaGVjay1idWxsZXQnKVxudmFyIGNoZWNrTGlzdEl0ZW1JbmRlbnQgPSByZXF1aXJlKCcuLi91dGlsL2NoZWNrLWxpc3QtaXRlbS1pbmRlbnQnKVxudmFyIGZsb3cgPSByZXF1aXJlKCcuLi91dGlsL2NvbnRhaW5lci1mbG93JylcbnZhciBpbmRlbnRMaW5lcyA9IHJlcXVpcmUoJy4uL3V0aWwvaW5kZW50LWxpbmVzJylcblxuZnVuY3Rpb24gbGlzdEl0ZW0obm9kZSwgcGFyZW50LCBjb250ZXh0KSB7XG4gIHZhciBidWxsZXQgPSBjaGVja0J1bGxldChjb250ZXh0KVxuICB2YXIgbGlzdEl0ZW1JbmRlbnQgPSBjaGVja0xpc3RJdGVtSW5kZW50KGNvbnRleHQpXG4gIHZhciBzaXplXG4gIHZhciB2YWx1ZVxuICB2YXIgZXhpdFxuXG4gIGlmIChwYXJlbnQgJiYgcGFyZW50Lm9yZGVyZWQpIHtcbiAgICBidWxsZXQgPVxuICAgICAgKHBhcmVudC5zdGFydCA+IC0xID8gcGFyZW50LnN0YXJ0IDogMSkgK1xuICAgICAgKGNvbnRleHQub3B0aW9ucy5pbmNyZW1lbnRMaXN0TWFya2VyID09PSBmYWxzZVxuICAgICAgICA/IDBcbiAgICAgICAgOiBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihub2RlKSkgK1xuICAgICAgJy4nXG4gIH1cblxuICBzaXplID0gYnVsbGV0Lmxlbmd0aCArIDFcblxuICBpZiAoXG4gICAgbGlzdEl0ZW1JbmRlbnQgPT09ICd0YWInIHx8XG4gICAgKGxpc3RJdGVtSW5kZW50ID09PSAnbWl4ZWQnICYmICgocGFyZW50ICYmIHBhcmVudC5zcHJlYWQpIHx8IG5vZGUuc3ByZWFkKSlcbiAgKSB7XG4gICAgc2l6ZSA9IE1hdGguY2VpbChzaXplIC8gNCkgKiA0XG4gIH1cblxuICBleGl0ID0gY29udGV4dC5lbnRlcignbGlzdEl0ZW0nKVxuICB2YWx1ZSA9IGluZGVudExpbmVzKGZsb3cobm9kZSwgY29udGV4dCksIG1hcClcbiAgZXhpdCgpXG5cbiAgcmV0dXJuIHZhbHVlXG5cbiAgZnVuY3Rpb24gbWFwKGxpbmUsIGluZGV4LCBibGFuaykge1xuICAgIGlmIChpbmRleCkge1xuICAgICAgcmV0dXJuIChibGFuayA/ICcnIDogcmVwZWF0KCcgJywgc2l6ZSkpICsgbGluZVxuICAgIH1cblxuICAgIHJldHVybiAoYmxhbmsgPyBidWxsZXQgOiBidWxsZXQgKyByZXBlYXQoJyAnLCBzaXplIC0gYnVsbGV0Lmxlbmd0aCkpICsgbGluZVxuICB9XG59XG4iLCAidmFyIGRlZmF1bHRMaXN0SXRlbSA9IHJlcXVpcmUoJ21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2hhbmRsZS9saXN0LWl0ZW0nKVxuXG5leHBvcnRzLnVuc2FmZSA9IFt7YXRCcmVhazogdHJ1ZSwgY2hhcmFjdGVyOiAnLScsIGFmdGVyOiAnWzp8LV0nfV1cblxuZXhwb3J0cy5oYW5kbGVycyA9IHtcbiAgbGlzdEl0ZW06IGxpc3RJdGVtV2l0aFRhc2tMaXN0SXRlbVxufVxuXG5mdW5jdGlvbiBsaXN0SXRlbVdpdGhUYXNrTGlzdEl0ZW0obm9kZSwgcGFyZW50LCBjb250ZXh0KSB7XG4gIHZhciB2YWx1ZSA9IGRlZmF1bHRMaXN0SXRlbShub2RlLCBwYXJlbnQsIGNvbnRleHQpXG4gIHZhciBoZWFkID0gbm9kZS5jaGlsZHJlblswXVxuXG4gIGlmICh0eXBlb2Ygbm9kZS5jaGVja2VkID09PSAnYm9vbGVhbicgJiYgaGVhZCAmJiBoZWFkLnR5cGUgPT09ICdwYXJhZ3JhcGgnKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eKD86WyorLV18XFxkK1xcLikoW1xcclxcbl18IHsxLDN9KS8sIGNoZWNrKVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlXG5cbiAgZnVuY3Rpb24gY2hlY2soJDApIHtcbiAgICByZXR1cm4gJDAgKyAnWycgKyAobm9kZS5jaGVja2VkID8gJ3gnIDogJyAnKSArICddICdcbiAgfVxufVxuIiwgIm1vZHVsZS5leHBvcnRzID0gY29uZmlndXJlXG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZShiYXNlLCBleHRlbnNpb24pIHtcbiAgdmFyIGluZGV4ID0gLTFcbiAgdmFyIGtleVxuXG4gIC8vIEZpcnN0IGRvIHN1YmV4dGVuc2lvbnMuXG4gIGlmIChleHRlbnNpb24uZXh0ZW5zaW9ucykge1xuICAgIHdoaWxlICgrK2luZGV4IDwgZXh0ZW5zaW9uLmV4dGVuc2lvbnMubGVuZ3RoKSB7XG4gICAgICBjb25maWd1cmUoYmFzZSwgZXh0ZW5zaW9uLmV4dGVuc2lvbnNbaW5kZXhdKVxuICAgIH1cbiAgfVxuXG4gIGZvciAoa2V5IGluIGV4dGVuc2lvbikge1xuICAgIGlmIChrZXkgPT09ICdleHRlbnNpb25zJykge1xuICAgICAgLy8gRW1wdHkuXG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICd1bnNhZmUnIHx8IGtleSA9PT0gJ2pvaW4nKSB7XG4gICAgICBiYXNlW2tleV0gPSBiYXNlW2tleV0uY29uY2F0KGV4dGVuc2lvbltrZXldIHx8IFtdKVxuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnaGFuZGxlcnMnKSB7XG4gICAgICBiYXNlW2tleV0gPSBPYmplY3QuYXNzaWduKGJhc2Vba2V5XSwgZXh0ZW5zaW9uW2tleV0gfHwge30pXG4gICAgfSBlbHNlIHtcbiAgICAgIGJhc2Uub3B0aW9uc1trZXldID0gZXh0ZW5zaW9uW2tleV1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFzZVxufVxuIiwgInZhciBhdXRvbGlua0xpdGVyYWwgPSByZXF1aXJlKCdtZGFzdC11dGlsLWdmbS1hdXRvbGluay1saXRlcmFsL3RvLW1hcmtkb3duJylcbnZhciBzdHJpa2V0aHJvdWdoID0gcmVxdWlyZSgnbWRhc3QtdXRpbC1nZm0tc3RyaWtldGhyb3VnaC90by1tYXJrZG93bicpXG52YXIgdGFibGUgPSByZXF1aXJlKCdtZGFzdC11dGlsLWdmbS10YWJsZS90by1tYXJrZG93bicpXG52YXIgdGFza0xpc3RJdGVtID0gcmVxdWlyZSgnbWRhc3QtdXRpbC1nZm0tdGFzay1saXN0LWl0ZW0vdG8tbWFya2Rvd24nKVxudmFyIGNvbmZpZ3VyZSA9IHJlcXVpcmUoJ21kYXN0LXV0aWwtdG8tbWFya2Rvd24vbGliL2NvbmZpZ3VyZScpXG5cbm1vZHVsZS5leHBvcnRzID0gdG9NYXJrZG93blxuXG5mdW5jdGlvbiB0b01hcmtkb3duKG9wdGlvbnMpIHtcbiAgdmFyIGNvbmZpZyA9IGNvbmZpZ3VyZShcbiAgICB7aGFuZGxlcnM6IHt9LCBqb2luOiBbXSwgdW5zYWZlOiBbXSwgb3B0aW9uczoge319LFxuICAgIHtcbiAgICAgIGV4dGVuc2lvbnM6IFthdXRvbGlua0xpdGVyYWwsIHN0cmlrZXRocm91Z2gsIHRhYmxlKG9wdGlvbnMpLCB0YXNrTGlzdEl0ZW1dXG4gICAgfVxuICApXG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oY29uZmlnLm9wdGlvbnMsIHtcbiAgICBoYW5kbGVyczogY29uZmlnLmhhbmRsZXJzLFxuICAgIGpvaW46IGNvbmZpZy5qb2luLFxuICAgIHVuc2FmZTogY29uZmlnLnVuc2FmZVxuICB9KVxufVxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgc3ludGF4ID0gcmVxdWlyZSgnbWljcm9tYXJrLWV4dGVuc2lvbi1nZm0nKVxudmFyIGZyb21NYXJrZG93biA9IHJlcXVpcmUoJ21kYXN0LXV0aWwtZ2ZtL2Zyb20tbWFya2Rvd24nKVxudmFyIHRvTWFya2Rvd24gPSByZXF1aXJlKCdtZGFzdC11dGlsLWdmbS90by1tYXJrZG93bicpXG5cbnZhciB3YXJuaW5nSXNzdWVkXG5cbm1vZHVsZS5leHBvcnRzID0gZ2ZtXG5cbmZ1bmN0aW9uIGdmbShvcHRpb25zKSB7XG4gIHZhciBkYXRhID0gdGhpcy5kYXRhKClcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAtIG9sZCByZW1hcmsuICovXG4gIGlmIChcbiAgICAhd2FybmluZ0lzc3VlZCAmJlxuICAgICgodGhpcy5QYXJzZXIgJiZcbiAgICAgIHRoaXMuUGFyc2VyLnByb3RvdHlwZSAmJlxuICAgICAgdGhpcy5QYXJzZXIucHJvdG90eXBlLmJsb2NrVG9rZW5pemVycykgfHxcbiAgICAgICh0aGlzLkNvbXBpbGVyICYmXG4gICAgICAgIHRoaXMuQ29tcGlsZXIucHJvdG90eXBlICYmXG4gICAgICAgIHRoaXMuQ29tcGlsZXIucHJvdG90eXBlLnZpc2l0b3JzKSlcbiAgKSB7XG4gICAgd2FybmluZ0lzc3VlZCA9IHRydWVcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnW3JlbWFyay1nZm1dIFdhcm5pbmc6IHBsZWFzZSB1cGdyYWRlIHRvIHJlbWFyayAxMyB0byB1c2UgdGhpcyBwbHVnaW4nXG4gICAgKVxuICB9XG5cbiAgYWRkKCdtaWNyb21hcmtFeHRlbnNpb25zJywgc3ludGF4KG9wdGlvbnMpKVxuICBhZGQoJ2Zyb21NYXJrZG93bkV4dGVuc2lvbnMnLCBmcm9tTWFya2Rvd24pXG4gIGFkZCgndG9NYXJrZG93bkV4dGVuc2lvbnMnLCB0b01hcmtkb3duKG9wdGlvbnMpKVxuXG4gIGZ1bmN0aW9uIGFkZChmaWVsZCwgdmFsdWUpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBvdGhlciBleHRlbnNpb25zLiAqL1xuICAgIGlmIChkYXRhW2ZpZWxkXSkgZGF0YVtmaWVsZF0ucHVzaCh2YWx1ZSlcbiAgICBlbHNlIGRhdGFbZmllbGRdID0gW3ZhbHVlXVxuICB9XG59XG4iLCBudWxsLCAiJ3VzZSBzdHJpY3QnO1xuXG5cbmZ1bmN0aW9uIGlzTm90aGluZyhzdWJqZWN0KSB7XG4gIHJldHVybiAodHlwZW9mIHN1YmplY3QgPT09ICd1bmRlZmluZWQnKSB8fCAoc3ViamVjdCA9PT0gbnVsbCk7XG59XG5cblxuZnVuY3Rpb24gaXNPYmplY3Qoc3ViamVjdCkge1xuICByZXR1cm4gKHR5cGVvZiBzdWJqZWN0ID09PSAnb2JqZWN0JykgJiYgKHN1YmplY3QgIT09IG51bGwpO1xufVxuXG5cbmZ1bmN0aW9uIHRvQXJyYXkoc2VxdWVuY2UpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2VxdWVuY2UpKSByZXR1cm4gc2VxdWVuY2U7XG4gIGVsc2UgaWYgKGlzTm90aGluZyhzZXF1ZW5jZSkpIHJldHVybiBbXTtcblxuICByZXR1cm4gWyBzZXF1ZW5jZSBdO1xufVxuXG5cbmZ1bmN0aW9uIGV4dGVuZCh0YXJnZXQsIHNvdXJjZSkge1xuICB2YXIgaW5kZXgsIGxlbmd0aCwga2V5LCBzb3VyY2VLZXlzO1xuXG4gIGlmIChzb3VyY2UpIHtcbiAgICBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcblxuICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBzb3VyY2VLZXlzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGtleSA9IHNvdXJjZUtleXNbaW5kZXhdO1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5cbmZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsIGNvdW50KSB7XG4gIHZhciByZXN1bHQgPSAnJywgY3ljbGU7XG5cbiAgZm9yIChjeWNsZSA9IDA7IGN5Y2xlIDwgY291bnQ7IGN5Y2xlICs9IDEpIHtcbiAgICByZXN1bHQgKz0gc3RyaW5nO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG5mdW5jdGlvbiBpc05lZ2F0aXZlWmVybyhudW1iZXIpIHtcbiAgcmV0dXJuIChudW1iZXIgPT09IDApICYmIChOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPT09IDEgLyBudW1iZXIpO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzLmlzTm90aGluZyAgICAgID0gaXNOb3RoaW5nO1xubW9kdWxlLmV4cG9ydHMuaXNPYmplY3QgICAgICAgPSBpc09iamVjdDtcbm1vZHVsZS5leHBvcnRzLnRvQXJyYXkgICAgICAgID0gdG9BcnJheTtcbm1vZHVsZS5leHBvcnRzLnJlcGVhdCAgICAgICAgID0gcmVwZWF0O1xubW9kdWxlLmV4cG9ydHMuaXNOZWdhdGl2ZVplcm8gPSBpc05lZ2F0aXZlWmVybztcbm1vZHVsZS5leHBvcnRzLmV4dGVuZCAgICAgICAgID0gZXh0ZW5kO1xuIiwgIi8vIFlBTUwgZXJyb3IgY2xhc3MuIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvODQ1ODk4NFxuLy9cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gWUFNTEV4Y2VwdGlvbihyZWFzb24sIG1hcmspIHtcbiAgLy8gU3VwZXIgY29uc3RydWN0b3JcbiAgRXJyb3IuY2FsbCh0aGlzKTtcblxuICB0aGlzLm5hbWUgPSAnWUFNTEV4Y2VwdGlvbic7XG4gIHRoaXMucmVhc29uID0gcmVhc29uO1xuICB0aGlzLm1hcmsgPSBtYXJrO1xuICB0aGlzLm1lc3NhZ2UgPSAodGhpcy5yZWFzb24gfHwgJyh1bmtub3duIHJlYXNvbiknKSArICh0aGlzLm1hcmsgPyAnICcgKyB0aGlzLm1hcmsudG9TdHJpbmcoKSA6ICcnKTtcblxuICAvLyBJbmNsdWRlIHN0YWNrIHRyYWNlIGluIGVycm9yIG9iamVjdFxuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAvLyBDaHJvbWUgYW5kIE5vZGVKU1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICB9IGVsc2Uge1xuICAgIC8vIEZGLCBJRSAxMCsgYW5kIFNhZmFyaSA2Ky4gRmFsbGJhY2sgZm9yIG90aGVyc1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrIHx8ICcnO1xuICB9XG59XG5cblxuLy8gSW5oZXJpdCBmcm9tIEVycm9yXG5ZQU1MRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbllBTUxFeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gWUFNTEV4Y2VwdGlvbjtcblxuXG5ZQU1MRXhjZXB0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKGNvbXBhY3QpIHtcbiAgdmFyIHJlc3VsdCA9IHRoaXMubmFtZSArICc6ICc7XG5cbiAgcmVzdWx0ICs9IHRoaXMucmVhc29uIHx8ICcodW5rbm93biByZWFzb24pJztcblxuICBpZiAoIWNvbXBhY3QgJiYgdGhpcy5tYXJrKSB7XG4gICAgcmVzdWx0ICs9ICcgJyArIHRoaXMubWFyay50b1N0cmluZygpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBZQU1MRXhjZXB0aW9uO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuXG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24nKTtcblxuXG5mdW5jdGlvbiBNYXJrKG5hbWUsIGJ1ZmZlciwgcG9zaXRpb24sIGxpbmUsIGNvbHVtbikge1xuICB0aGlzLm5hbWUgICAgID0gbmFtZTtcbiAgdGhpcy5idWZmZXIgICA9IGJ1ZmZlcjtcbiAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uO1xuICB0aGlzLmxpbmUgICAgID0gbGluZTtcbiAgdGhpcy5jb2x1bW4gICA9IGNvbHVtbjtcbn1cblxuXG5NYXJrLnByb3RvdHlwZS5nZXRTbmlwcGV0ID0gZnVuY3Rpb24gZ2V0U25pcHBldChpbmRlbnQsIG1heExlbmd0aCkge1xuICB2YXIgaGVhZCwgc3RhcnQsIHRhaWwsIGVuZCwgc25pcHBldDtcblxuICBpZiAoIXRoaXMuYnVmZmVyKSByZXR1cm4gbnVsbDtcblxuICBpbmRlbnQgPSBpbmRlbnQgfHwgNDtcbiAgbWF4TGVuZ3RoID0gbWF4TGVuZ3RoIHx8IDc1O1xuXG4gIGhlYWQgPSAnJztcbiAgc3RhcnQgPSB0aGlzLnBvc2l0aW9uO1xuXG4gIHdoaWxlIChzdGFydCA+IDAgJiYgJ1xceDAwXFxyXFxuXFx4ODVcXHUyMDI4XFx1MjAyOScuaW5kZXhPZih0aGlzLmJ1ZmZlci5jaGFyQXQoc3RhcnQgLSAxKSkgPT09IC0xKSB7XG4gICAgc3RhcnQgLT0gMTtcbiAgICBpZiAodGhpcy5wb3NpdGlvbiAtIHN0YXJ0ID4gKG1heExlbmd0aCAvIDIgLSAxKSkge1xuICAgICAgaGVhZCA9ICcgLi4uICc7XG4gICAgICBzdGFydCArPSA1O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdGFpbCA9ICcnO1xuICBlbmQgPSB0aGlzLnBvc2l0aW9uO1xuXG4gIHdoaWxlIChlbmQgPCB0aGlzLmJ1ZmZlci5sZW5ndGggJiYgJ1xceDAwXFxyXFxuXFx4ODVcXHUyMDI4XFx1MjAyOScuaW5kZXhPZih0aGlzLmJ1ZmZlci5jaGFyQXQoZW5kKSkgPT09IC0xKSB7XG4gICAgZW5kICs9IDE7XG4gICAgaWYgKGVuZCAtIHRoaXMucG9zaXRpb24gPiAobWF4TGVuZ3RoIC8gMiAtIDEpKSB7XG4gICAgICB0YWlsID0gJyAuLi4gJztcbiAgICAgIGVuZCAtPSA1O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgc25pcHBldCA9IHRoaXMuYnVmZmVyLnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gIHJldHVybiBjb21tb24ucmVwZWF0KCcgJywgaW5kZW50KSArIGhlYWQgKyBzbmlwcGV0ICsgdGFpbCArICdcXG4nICtcbiAgICAgICAgIGNvbW1vbi5yZXBlYXQoJyAnLCBpbmRlbnQgKyB0aGlzLnBvc2l0aW9uIC0gc3RhcnQgKyBoZWFkLmxlbmd0aCkgKyAnXic7XG59O1xuXG5cbk1hcmsucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoY29tcGFjdCkge1xuICB2YXIgc25pcHBldCwgd2hlcmUgPSAnJztcblxuICBpZiAodGhpcy5uYW1lKSB7XG4gICAgd2hlcmUgKz0gJ2luIFwiJyArIHRoaXMubmFtZSArICdcIiAnO1xuICB9XG5cbiAgd2hlcmUgKz0gJ2F0IGxpbmUgJyArICh0aGlzLmxpbmUgKyAxKSArICcsIGNvbHVtbiAnICsgKHRoaXMuY29sdW1uICsgMSk7XG5cbiAgaWYgKCFjb21wYWN0KSB7XG4gICAgc25pcHBldCA9IHRoaXMuZ2V0U25pcHBldCgpO1xuXG4gICAgaWYgKHNuaXBwZXQpIHtcbiAgICAgIHdoZXJlICs9ICc6XFxuJyArIHNuaXBwZXQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdoZXJlO1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcms7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgWUFNTEV4Y2VwdGlvbiA9IHJlcXVpcmUoJy4vZXhjZXB0aW9uJyk7XG5cbnZhciBUWVBFX0NPTlNUUlVDVE9SX09QVElPTlMgPSBbXG4gICdraW5kJyxcbiAgJ3Jlc29sdmUnLFxuICAnY29uc3RydWN0JyxcbiAgJ2luc3RhbmNlT2YnLFxuICAncHJlZGljYXRlJyxcbiAgJ3JlcHJlc2VudCcsXG4gICdkZWZhdWx0U3R5bGUnLFxuICAnc3R5bGVBbGlhc2VzJ1xuXTtcblxudmFyIFlBTUxfTk9ERV9LSU5EUyA9IFtcbiAgJ3NjYWxhcicsXG4gICdzZXF1ZW5jZScsXG4gICdtYXBwaW5nJ1xuXTtcblxuZnVuY3Rpb24gY29tcGlsZVN0eWxlQWxpYXNlcyhtYXApIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIGlmIChtYXAgIT09IG51bGwpIHtcbiAgICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goZnVuY3Rpb24gKHN0eWxlKSB7XG4gICAgICBtYXBbc3R5bGVdLmZvckVhY2goZnVuY3Rpb24gKGFsaWFzKSB7XG4gICAgICAgIHJlc3VsdFtTdHJpbmcoYWxpYXMpXSA9IHN0eWxlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBUeXBlKHRhZywgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICBPYmplY3Qua2V5cyhvcHRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKFRZUEVfQ09OU1RSVUNUT1JfT1BUSU9OUy5pbmRleE9mKG5hbWUpID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1Vua25vd24gb3B0aW9uIFwiJyArIG5hbWUgKyAnXCIgaXMgbWV0IGluIGRlZmluaXRpb24gb2YgXCInICsgdGFnICsgJ1wiIFlBTUwgdHlwZS4nKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFRPRE86IEFkZCB0YWcgZm9ybWF0IGNoZWNrLlxuICB0aGlzLnRhZyAgICAgICAgICA9IHRhZztcbiAgdGhpcy5raW5kICAgICAgICAgPSBvcHRpb25zWydraW5kJ10gICAgICAgICB8fCBudWxsO1xuICB0aGlzLnJlc29sdmUgICAgICA9IG9wdGlvbnNbJ3Jlc29sdmUnXSAgICAgIHx8IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07XG4gIHRoaXMuY29uc3RydWN0ICAgID0gb3B0aW9uc1snY29uc3RydWN0J10gICAgfHwgZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIGRhdGE7IH07XG4gIHRoaXMuaW5zdGFuY2VPZiAgID0gb3B0aW9uc1snaW5zdGFuY2VPZiddICAgfHwgbnVsbDtcbiAgdGhpcy5wcmVkaWNhdGUgICAgPSBvcHRpb25zWydwcmVkaWNhdGUnXSAgICB8fCBudWxsO1xuICB0aGlzLnJlcHJlc2VudCAgICA9IG9wdGlvbnNbJ3JlcHJlc2VudCddICAgIHx8IG51bGw7XG4gIHRoaXMuZGVmYXVsdFN0eWxlID0gb3B0aW9uc1snZGVmYXVsdFN0eWxlJ10gfHwgbnVsbDtcbiAgdGhpcy5zdHlsZUFsaWFzZXMgPSBjb21waWxlU3R5bGVBbGlhc2VzKG9wdGlvbnNbJ3N0eWxlQWxpYXNlcyddIHx8IG51bGwpO1xuXG4gIGlmIChZQU1MX05PREVfS0lORFMuaW5kZXhPZih0aGlzLmtpbmQpID09PSAtMSkge1xuICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdVbmtub3duIGtpbmQgXCInICsgdGhpcy5raW5kICsgJ1wiIGlzIHNwZWNpZmllZCBmb3IgXCInICsgdGFnICsgJ1wiIFlBTUwgdHlwZS4nKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFR5cGU7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKmVzbGludC1kaXNhYmxlIG1heC1sZW4qL1xuXG52YXIgY29tbW9uICAgICAgICA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG52YXIgWUFNTEV4Y2VwdGlvbiA9IHJlcXVpcmUoJy4vZXhjZXB0aW9uJyk7XG52YXIgVHlwZSAgICAgICAgICA9IHJlcXVpcmUoJy4vdHlwZScpO1xuXG5cbmZ1bmN0aW9uIGNvbXBpbGVMaXN0KHNjaGVtYSwgbmFtZSwgcmVzdWx0KSB7XG4gIHZhciBleGNsdWRlID0gW107XG5cbiAgc2NoZW1hLmluY2x1ZGUuZm9yRWFjaChmdW5jdGlvbiAoaW5jbHVkZWRTY2hlbWEpIHtcbiAgICByZXN1bHQgPSBjb21waWxlTGlzdChpbmNsdWRlZFNjaGVtYSwgbmFtZSwgcmVzdWx0KTtcbiAgfSk7XG5cbiAgc2NoZW1hW25hbWVdLmZvckVhY2goZnVuY3Rpb24gKGN1cnJlbnRUeXBlKSB7XG4gICAgcmVzdWx0LmZvckVhY2goZnVuY3Rpb24gKHByZXZpb3VzVHlwZSwgcHJldmlvdXNJbmRleCkge1xuICAgICAgaWYgKHByZXZpb3VzVHlwZS50YWcgPT09IGN1cnJlbnRUeXBlLnRhZyAmJiBwcmV2aW91c1R5cGUua2luZCA9PT0gY3VycmVudFR5cGUua2luZCkge1xuICAgICAgICBleGNsdWRlLnB1c2gocHJldmlvdXNJbmRleCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXN1bHQucHVzaChjdXJyZW50VHlwZSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQuZmlsdGVyKGZ1bmN0aW9uICh0eXBlLCBpbmRleCkge1xuICAgIHJldHVybiBleGNsdWRlLmluZGV4T2YoaW5kZXgpID09PSAtMTtcbiAgfSk7XG59XG5cblxuZnVuY3Rpb24gY29tcGlsZU1hcCgvKiBsaXN0cy4uLiAqLykge1xuICB2YXIgcmVzdWx0ID0ge1xuICAgICAgICBzY2FsYXI6IHt9LFxuICAgICAgICBzZXF1ZW5jZToge30sXG4gICAgICAgIG1hcHBpbmc6IHt9LFxuICAgICAgICBmYWxsYmFjazoge31cbiAgICAgIH0sIGluZGV4LCBsZW5ndGg7XG5cbiAgZnVuY3Rpb24gY29sbGVjdFR5cGUodHlwZSkge1xuICAgIHJlc3VsdFt0eXBlLmtpbmRdW3R5cGUudGFnXSA9IHJlc3VsdFsnZmFsbGJhY2snXVt0eXBlLnRhZ10gPSB0eXBlO1xuICB9XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgYXJndW1lbnRzW2luZGV4XS5mb3JFYWNoKGNvbGxlY3RUeXBlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbmZ1bmN0aW9uIFNjaGVtYShkZWZpbml0aW9uKSB7XG4gIHRoaXMuaW5jbHVkZSAgPSBkZWZpbml0aW9uLmluY2x1ZGUgIHx8IFtdO1xuICB0aGlzLmltcGxpY2l0ID0gZGVmaW5pdGlvbi5pbXBsaWNpdCB8fCBbXTtcbiAgdGhpcy5leHBsaWNpdCA9IGRlZmluaXRpb24uZXhwbGljaXQgfHwgW107XG5cbiAgdGhpcy5pbXBsaWNpdC5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgaWYgKHR5cGUubG9hZEtpbmQgJiYgdHlwZS5sb2FkS2luZCAhPT0gJ3NjYWxhcicpIHtcbiAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdUaGVyZSBpcyBhIG5vbi1zY2FsYXIgdHlwZSBpbiB0aGUgaW1wbGljaXQgbGlzdCBvZiBhIHNjaGVtYS4gSW1wbGljaXQgcmVzb2x2aW5nIG9mIHN1Y2ggdHlwZXMgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gIH0pO1xuXG4gIHRoaXMuY29tcGlsZWRJbXBsaWNpdCA9IGNvbXBpbGVMaXN0KHRoaXMsICdpbXBsaWNpdCcsIFtdKTtcbiAgdGhpcy5jb21waWxlZEV4cGxpY2l0ID0gY29tcGlsZUxpc3QodGhpcywgJ2V4cGxpY2l0JywgW10pO1xuICB0aGlzLmNvbXBpbGVkVHlwZU1hcCAgPSBjb21waWxlTWFwKHRoaXMuY29tcGlsZWRJbXBsaWNpdCwgdGhpcy5jb21waWxlZEV4cGxpY2l0KTtcbn1cblxuXG5TY2hlbWEuREVGQVVMVCA9IG51bGw7XG5cblxuU2NoZW1hLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZVNjaGVtYSgpIHtcbiAgdmFyIHNjaGVtYXMsIHR5cGVzO1xuXG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMTpcbiAgICAgIHNjaGVtYXMgPSBTY2hlbWEuREVGQVVMVDtcbiAgICAgIHR5cGVzID0gYXJndW1lbnRzWzBdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIDI6XG4gICAgICBzY2hlbWFzID0gYXJndW1lbnRzWzBdO1xuICAgICAgdHlwZXMgPSBhcmd1bWVudHNbMV07XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgU2NoZW1hLmNyZWF0ZSBmdW5jdGlvbicpO1xuICB9XG5cbiAgc2NoZW1hcyA9IGNvbW1vbi50b0FycmF5KHNjaGVtYXMpO1xuICB0eXBlcyA9IGNvbW1vbi50b0FycmF5KHR5cGVzKTtcblxuICBpZiAoIXNjaGVtYXMuZXZlcnkoZnVuY3Rpb24gKHNjaGVtYSkgeyByZXR1cm4gc2NoZW1hIGluc3RhbmNlb2YgU2NoZW1hOyB9KSkge1xuICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdTcGVjaWZpZWQgbGlzdCBvZiBzdXBlciBzY2hlbWFzIChvciBhIHNpbmdsZSBTY2hlbWEgb2JqZWN0KSBjb250YWlucyBhIG5vbi1TY2hlbWEgb2JqZWN0LicpO1xuICB9XG5cbiAgaWYgKCF0eXBlcy5ldmVyeShmdW5jdGlvbiAodHlwZSkgeyByZXR1cm4gdHlwZSBpbnN0YW5jZW9mIFR5cGU7IH0pKSB7XG4gICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1NwZWNpZmllZCBsaXN0IG9mIFlBTUwgdHlwZXMgKG9yIGEgc2luZ2xlIFR5cGUgb2JqZWN0KSBjb250YWlucyBhIG5vbi1UeXBlIG9iamVjdC4nKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2NoZW1hKHtcbiAgICBpbmNsdWRlOiBzY2hlbWFzLFxuICAgIGV4cGxpY2l0OiB0eXBlc1xuICB9KTtcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBTY2hlbWE7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6c3RyJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgY29uc3RydWN0OiBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiAnJzsgfVxufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6c2VxJywge1xuICBraW5kOiAnc2VxdWVuY2UnLFxuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IFtdOyB9XG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjptYXAnLCB7XG4gIGtpbmQ6ICdtYXBwaW5nJyxcbiAgY29uc3RydWN0OiBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiB7fTsgfVxufSk7XG4iLCAiLy8gU3RhbmRhcmQgWUFNTCdzIEZhaWxzYWZlIHNjaGVtYS5cbi8vIGh0dHA6Ly93d3cueWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sI2lkMjgwMjM0NlxuXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgU2NoZW1hID0gcmVxdWlyZSgnLi4vc2NoZW1hJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hKHtcbiAgZXhwbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL3N0cicpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvc2VxJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9tYXAnKVxuICBdXG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbE51bGwoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG5cbiAgdmFyIG1heCA9IGRhdGEubGVuZ3RoO1xuXG4gIHJldHVybiAobWF4ID09PSAxICYmIGRhdGEgPT09ICd+JykgfHxcbiAgICAgICAgIChtYXggPT09IDQgJiYgKGRhdGEgPT09ICdudWxsJyB8fCBkYXRhID09PSAnTnVsbCcgfHwgZGF0YSA9PT0gJ05VTEwnKSk7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxOdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNOdWxsKG9iamVjdCkge1xuICByZXR1cm4gb2JqZWN0ID09PSBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpudWxsJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxOdWxsLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxOdWxsLFxuICBwcmVkaWNhdGU6IGlzTnVsbCxcbiAgcmVwcmVzZW50OiB7XG4gICAgY2Fub25pY2FsOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnfic7ICAgIH0sXG4gICAgbG93ZXJjYXNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnbnVsbCc7IH0sXG4gICAgdXBwZXJjYXNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnTlVMTCc7IH0sXG4gICAgY2FtZWxjYXNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnTnVsbCc7IH1cbiAgfSxcbiAgZGVmYXVsdFN0eWxlOiAnbG93ZXJjYXNlJ1xufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxCb29sZWFuKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICB2YXIgbWF4ID0gZGF0YS5sZW5ndGg7XG5cbiAgcmV0dXJuIChtYXggPT09IDQgJiYgKGRhdGEgPT09ICd0cnVlJyB8fCBkYXRhID09PSAnVHJ1ZScgfHwgZGF0YSA9PT0gJ1RSVUUnKSkgfHxcbiAgICAgICAgIChtYXggPT09IDUgJiYgKGRhdGEgPT09ICdmYWxzZScgfHwgZGF0YSA9PT0gJ0ZhbHNlJyB8fCBkYXRhID09PSAnRkFMU0UnKSk7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxCb29sZWFuKGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEgPT09ICd0cnVlJyB8fFxuICAgICAgICAgZGF0YSA9PT0gJ1RydWUnIHx8XG4gICAgICAgICBkYXRhID09PSAnVFJVRSc7XG59XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBCb29sZWFuXSc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmJvb2wnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbEJvb2xlYW4sXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEJvb2xlYW4sXG4gIHByZWRpY2F0ZTogaXNCb29sZWFuLFxuICByZXByZXNlbnQ6IHtcbiAgICBsb3dlcmNhc2U6IGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuIG9iamVjdCA/ICd0cnVlJyA6ICdmYWxzZSc7IH0sXG4gICAgdXBwZXJjYXNlOiBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiBvYmplY3QgPyAnVFJVRScgOiAnRkFMU0UnOyB9LFxuICAgIGNhbWVsY2FzZTogZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gb2JqZWN0ID8gJ1RydWUnIDogJ0ZhbHNlJzsgfVxuICB9LFxuICBkZWZhdWx0U3R5bGU6ICdsb3dlcmNhc2UnXG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBUeXBlICAgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIGlzSGV4Q29kZShjKSB7XG4gIHJldHVybiAoKDB4MzAvKiAwICovIDw9IGMpICYmIChjIDw9IDB4MzkvKiA5ICovKSkgfHxcbiAgICAgICAgICgoMHg0MS8qIEEgKi8gPD0gYykgJiYgKGMgPD0gMHg0Ni8qIEYgKi8pKSB8fFxuICAgICAgICAgKCgweDYxLyogYSAqLyA8PSBjKSAmJiAoYyA8PSAweDY2LyogZiAqLykpO1xufVxuXG5mdW5jdGlvbiBpc09jdENvZGUoYykge1xuICByZXR1cm4gKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM3LyogNyAqLykpO1xufVxuXG5mdW5jdGlvbiBpc0RlY0NvZGUoYykge1xuICByZXR1cm4gKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlWWFtbEludGVnZXIoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBtYXggPSBkYXRhLmxlbmd0aCxcbiAgICAgIGluZGV4ID0gMCxcbiAgICAgIGhhc0RpZ2l0cyA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgaWYgKCFtYXgpIHJldHVybiBmYWxzZTtcblxuICBjaCA9IGRhdGFbaW5kZXhdO1xuXG4gIC8vIHNpZ25cbiAgaWYgKGNoID09PSAnLScgfHwgY2ggPT09ICcrJykge1xuICAgIGNoID0gZGF0YVsrK2luZGV4XTtcbiAgfVxuXG4gIGlmIChjaCA9PT0gJzAnKSB7XG4gICAgLy8gMFxuICAgIGlmIChpbmRleCArIDEgPT09IG1heCkgcmV0dXJuIHRydWU7XG4gICAgY2ggPSBkYXRhWysraW5kZXhdO1xuXG4gICAgLy8gYmFzZSAyLCBiYXNlIDgsIGJhc2UgMTZcblxuICAgIGlmIChjaCA9PT0gJ2InKSB7XG4gICAgICAvLyBiYXNlIDJcbiAgICAgIGluZGV4Kys7XG5cbiAgICAgIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgICAgICBjaCA9IGRhdGFbaW5kZXhdO1xuICAgICAgICBpZiAoY2ggPT09ICdfJykgY29udGludWU7XG4gICAgICAgIGlmIChjaCAhPT0gJzAnICYmIGNoICE9PSAnMScpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaGFzRGlnaXRzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNEaWdpdHMgJiYgY2ggIT09ICdfJztcbiAgICB9XG5cblxuICAgIGlmIChjaCA9PT0gJ3gnKSB7XG4gICAgICAvLyBiYXNlIDE2XG4gICAgICBpbmRleCsrO1xuXG4gICAgICBmb3IgKDsgaW5kZXggPCBtYXg7IGluZGV4KyspIHtcbiAgICAgICAgY2ggPSBkYXRhW2luZGV4XTtcbiAgICAgICAgaWYgKGNoID09PSAnXycpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWlzSGV4Q29kZShkYXRhLmNoYXJDb2RlQXQoaW5kZXgpKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBoYXNEaWdpdHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhc0RpZ2l0cyAmJiBjaCAhPT0gJ18nO1xuICAgIH1cblxuICAgIC8vIGJhc2UgOFxuICAgIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgICAgY2ggPSBkYXRhW2luZGV4XTtcbiAgICAgIGlmIChjaCA9PT0gJ18nKSBjb250aW51ZTtcbiAgICAgIGlmICghaXNPY3RDb2RlKGRhdGEuY2hhckNvZGVBdChpbmRleCkpKSByZXR1cm4gZmFsc2U7XG4gICAgICBoYXNEaWdpdHMgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzRGlnaXRzICYmIGNoICE9PSAnXyc7XG4gIH1cblxuICAvLyBiYXNlIDEwIChleGNlcHQgMCkgb3IgYmFzZSA2MFxuXG4gIC8vIHZhbHVlIHNob3VsZCBub3Qgc3RhcnQgd2l0aCBgX2A7XG4gIGlmIChjaCA9PT0gJ18nKSByZXR1cm4gZmFsc2U7XG5cbiAgZm9yICg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7XG4gICAgY2ggPSBkYXRhW2luZGV4XTtcbiAgICBpZiAoY2ggPT09ICdfJykgY29udGludWU7XG4gICAgaWYgKGNoID09PSAnOicpIGJyZWFrO1xuICAgIGlmICghaXNEZWNDb2RlKGRhdGEuY2hhckNvZGVBdChpbmRleCkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGhhc0RpZ2l0cyA9IHRydWU7XG4gIH1cblxuICAvLyBTaG91bGQgaGF2ZSBkaWdpdHMgYW5kIHNob3VsZCBub3QgZW5kIHdpdGggYF9gXG4gIGlmICghaGFzRGlnaXRzIHx8IGNoID09PSAnXycpIHJldHVybiBmYWxzZTtcblxuICAvLyBpZiAhYmFzZTYwIC0gZG9uZTtcbiAgaWYgKGNoICE9PSAnOicpIHJldHVybiB0cnVlO1xuXG4gIC8vIGJhc2U2MCBhbG1vc3Qgbm90IHVzZWQsIG5vIG5lZWRzIHRvIG9wdGltaXplXG4gIHJldHVybiAvXig6WzAtNV0/WzAtOV0pKyQvLnRlc3QoZGF0YS5zbGljZShpbmRleCkpO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sSW50ZWdlcihkYXRhKSB7XG4gIHZhciB2YWx1ZSA9IGRhdGEsIHNpZ24gPSAxLCBjaCwgYmFzZSwgZGlnaXRzID0gW107XG5cbiAgaWYgKHZhbHVlLmluZGV4T2YoJ18nKSAhPT0gLTEpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL18vZywgJycpO1xuICB9XG5cbiAgY2ggPSB2YWx1ZVswXTtcblxuICBpZiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJysnKSB7XG4gICAgaWYgKGNoID09PSAnLScpIHNpZ24gPSAtMTtcbiAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEpO1xuICAgIGNoID0gdmFsdWVbMF07XG4gIH1cblxuICBpZiAodmFsdWUgPT09ICcwJykgcmV0dXJuIDA7XG5cbiAgaWYgKGNoID09PSAnMCcpIHtcbiAgICBpZiAodmFsdWVbMV0gPT09ICdiJykgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgMik7XG4gICAgaWYgKHZhbHVlWzFdID09PSAneCcpIHJldHVybiBzaWduICogcGFyc2VJbnQodmFsdWUsIDE2KTtcbiAgICByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlLCA4KTtcbiAgfVxuXG4gIGlmICh2YWx1ZS5pbmRleE9mKCc6JykgIT09IC0xKSB7XG4gICAgdmFsdWUuc3BsaXQoJzonKS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgICBkaWdpdHMudW5zaGlmdChwYXJzZUludCh2LCAxMCkpO1xuICAgIH0pO1xuXG4gICAgdmFsdWUgPSAwO1xuICAgIGJhc2UgPSAxO1xuXG4gICAgZGlnaXRzLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgIHZhbHVlICs9IChkICogYmFzZSk7XG4gICAgICBiYXNlICo9IDYwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNpZ24gKiB2YWx1ZTtcblxuICB9XG5cbiAgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZSwgMTApO1xufVxuXG5mdW5jdGlvbiBpc0ludGVnZXIob2JqZWN0KSB7XG4gIHJldHVybiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJlxuICAgICAgICAgKG9iamVjdCAlIDEgPT09IDAgJiYgIWNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6aW50Jywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxJbnRlZ2VyLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxJbnRlZ2VyLFxuICBwcmVkaWNhdGU6IGlzSW50ZWdlcixcbiAgcmVwcmVzZW50OiB7XG4gICAgYmluYXJ5OiAgICAgIGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiA+PSAwID8gJzBiJyArIG9iai50b1N0cmluZygyKSA6ICctMGInICsgb2JqLnRvU3RyaW5nKDIpLnNsaWNlKDEpOyB9LFxuICAgIG9jdGFsOiAgICAgICBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogPj0gMCA/ICcwJyAgKyBvYmoudG9TdHJpbmcoOCkgOiAnLTAnICArIG9iai50b1N0cmluZyg4KS5zbGljZSgxKTsgfSxcbiAgICBkZWNpbWFsOiAgICAgZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqLnRvU3RyaW5nKDEwKTsgfSxcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG4gICAgaGV4YWRlY2ltYWw6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiA+PSAwID8gJzB4JyArIG9iai50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSA6ICAnLTB4JyArIG9iai50b1N0cmluZygxNikudG9VcHBlckNhc2UoKS5zbGljZSgxKTsgfVxuICB9LFxuICBkZWZhdWx0U3R5bGU6ICdkZWNpbWFsJyxcbiAgc3R5bGVBbGlhc2VzOiB7XG4gICAgYmluYXJ5OiAgICAgIFsgMiwgICdiaW4nIF0sXG4gICAgb2N0YWw6ICAgICAgIFsgOCwgICdvY3QnIF0sXG4gICAgZGVjaW1hbDogICAgIFsgMTAsICdkZWMnIF0sXG4gICAgaGV4YWRlY2ltYWw6IFsgMTYsICdoZXgnIF1cbiAgfVxufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi4vY29tbW9uJyk7XG52YXIgVHlwZSAgID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgWUFNTF9GTE9BVF9QQVRURVJOID0gbmV3IFJlZ0V4cChcbiAgLy8gMi41ZTQsIDIuNSBhbmQgaW50ZWdlcnNcbiAgJ14oPzpbLStdPyg/OjB8WzEtOV1bMC05X10qKSg/OlxcXFwuWzAtOV9dKik/KD86W2VFXVstK10/WzAtOV0rKT8nICtcbiAgLy8gLjJlNCwgLjJcbiAgLy8gc3BlY2lhbCBjYXNlLCBzZWVtcyBub3QgZnJvbSBzcGVjXG4gICd8XFxcXC5bMC05X10rKD86W2VFXVstK10/WzAtOV0rKT8nICtcbiAgLy8gMjA6NTlcbiAgJ3xbLStdP1swLTldWzAtOV9dKig/OjpbMC01XT9bMC05XSkrXFxcXC5bMC05X10qJyArXG4gIC8vIC5pbmZcbiAgJ3xbLStdP1xcXFwuKD86aW5mfEluZnxJTkYpJyArXG4gIC8vIC5uYW5cbiAgJ3xcXFxcLig/Om5hbnxOYU58TkFOKSkkJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sRmxvYXQoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICghWUFNTF9GTE9BVF9QQVRURVJOLnRlc3QoZGF0YSkgfHxcbiAgICAgIC8vIFF1aWNrIGhhY2sgdG8gbm90IGFsbG93IGludGVnZXJzIGVuZCB3aXRoIGBfYFxuICAgICAgLy8gUHJvYmFibHkgc2hvdWxkIHVwZGF0ZSByZWdleHAgJiBjaGVjayBzcGVlZFxuICAgICAgZGF0YVtkYXRhLmxlbmd0aCAtIDFdID09PSAnXycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbEZsb2F0KGRhdGEpIHtcbiAgdmFyIHZhbHVlLCBzaWduLCBiYXNlLCBkaWdpdHM7XG5cbiAgdmFsdWUgID0gZGF0YS5yZXBsYWNlKC9fL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuICBzaWduICAgPSB2YWx1ZVswXSA9PT0gJy0nID8gLTEgOiAxO1xuICBkaWdpdHMgPSBbXTtcblxuICBpZiAoJystJy5pbmRleE9mKHZhbHVlWzBdKSA+PSAwKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxKTtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gJy5pbmYnKSB7XG4gICAgcmV0dXJuIChzaWduID09PSAxKSA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcblxuICB9IGVsc2UgaWYgKHZhbHVlID09PSAnLm5hbicpIHtcbiAgICByZXR1cm4gTmFOO1xuXG4gIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignOicpID49IDApIHtcbiAgICB2YWx1ZS5zcGxpdCgnOicpLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgIGRpZ2l0cy51bnNoaWZ0KHBhcnNlRmxvYXQodiwgMTApKTtcbiAgICB9KTtcblxuICAgIHZhbHVlID0gMC4wO1xuICAgIGJhc2UgPSAxO1xuXG4gICAgZGlnaXRzLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgIHZhbHVlICs9IGQgKiBiYXNlO1xuICAgICAgYmFzZSAqPSA2MDtcbiAgICB9KTtcblxuICAgIHJldHVybiBzaWduICogdmFsdWU7XG5cbiAgfVxuICByZXR1cm4gc2lnbiAqIHBhcnNlRmxvYXQodmFsdWUsIDEwKTtcbn1cblxuXG52YXIgU0NJRU5USUZJQ19XSVRIT1VUX0RPVCA9IC9eWy0rXT9bMC05XStlLztcblxuZnVuY3Rpb24gcmVwcmVzZW50WWFtbEZsb2F0KG9iamVjdCwgc3R5bGUpIHtcbiAgdmFyIHJlcztcblxuICBpZiAoaXNOYU4ob2JqZWN0KSkge1xuICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgIGNhc2UgJ2xvd2VyY2FzZSc6IHJldHVybiAnLm5hbic7XG4gICAgICBjYXNlICd1cHBlcmNhc2UnOiByZXR1cm4gJy5OQU4nO1xuICAgICAgY2FzZSAnY2FtZWxjYXNlJzogcmV0dXJuICcuTmFOJztcbiAgICB9XG4gIH0gZWxzZSBpZiAoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZID09PSBvYmplY3QpIHtcbiAgICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgICBjYXNlICdsb3dlcmNhc2UnOiByZXR1cm4gJy5pbmYnO1xuICAgICAgY2FzZSAndXBwZXJjYXNlJzogcmV0dXJuICcuSU5GJztcbiAgICAgIGNhc2UgJ2NhbWVsY2FzZSc6IHJldHVybiAnLkluZic7XG4gICAgfVxuICB9IGVsc2UgaWYgKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA9PT0gb2JqZWN0KSB7XG4gICAgc3dpdGNoIChzdHlsZSkge1xuICAgICAgY2FzZSAnbG93ZXJjYXNlJzogcmV0dXJuICctLmluZic7XG4gICAgICBjYXNlICd1cHBlcmNhc2UnOiByZXR1cm4gJy0uSU5GJztcbiAgICAgIGNhc2UgJ2NhbWVsY2FzZSc6IHJldHVybiAnLS5JbmYnO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb21tb24uaXNOZWdhdGl2ZVplcm8ob2JqZWN0KSkge1xuICAgIHJldHVybiAnLTAuMCc7XG4gIH1cblxuICByZXMgPSBvYmplY3QudG9TdHJpbmcoMTApO1xuXG4gIC8vIEpTIHN0cmluZ2lmaWVyIGNhbiBidWlsZCBzY2llbnRpZmljIGZvcm1hdCB3aXRob3V0IGRvdHM6IDVlLTEwMCxcbiAgLy8gd2hpbGUgWUFNTCByZXF1cmVzIGRvdDogNS5lLTEwMC4gRml4IGl0IHdpdGggc2ltcGxlIGhhY2tcblxuICByZXR1cm4gU0NJRU5USUZJQ19XSVRIT1VUX0RPVC50ZXN0KHJlcykgPyByZXMucmVwbGFjZSgnZScsICcuZScpIDogcmVzO1xufVxuXG5mdW5jdGlvbiBpc0Zsb2F0KG9iamVjdCkge1xuICByZXR1cm4gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBOdW1iZXJdJykgJiZcbiAgICAgICAgIChvYmplY3QgJSAxICE9PSAwIHx8IGNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbEZsb2F0LFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxGbG9hdCxcbiAgcHJlZGljYXRlOiBpc0Zsb2F0LFxuICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxGbG9hdCxcbiAgZGVmYXVsdFN0eWxlOiAnbG93ZXJjYXNlJ1xufSk7XG4iLCAiLy8gU3RhbmRhcmQgWUFNTCdzIEpTT04gc2NoZW1hLlxuLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyODAzMjMxXG4vL1xuLy8gTk9URTogSlMtWUFNTCBkb2VzIG5vdCBzdXBwb3J0IHNjaGVtYS1zcGVjaWZpYyB0YWcgcmVzb2x1dGlvbiByZXN0cmljdGlvbnMuXG4vLyBTbywgdGhpcyBzY2hlbWEgaXMgbm90IHN1Y2ggc3RyaWN0IGFzIGRlZmluZWQgaW4gdGhlIFlBTUwgc3BlY2lmaWNhdGlvbi5cbi8vIEl0IGFsbG93cyBudW1iZXJzIGluIGJpbmFyeSBub3RhaW9uLCB1c2UgYE51bGxgIGFuZCBgTlVMTGAgYXMgYG51bGxgLCBldGMuXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9mYWlsc2FmZScpXG4gIF0sXG4gIGltcGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9udWxsJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9ib29sJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9pbnQnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2Zsb2F0JylcbiAgXVxufSk7XG4iLCAiLy8gU3RhbmRhcmQgWUFNTCdzIENvcmUgc2NoZW1hLlxuLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyODA0OTIzXG4vL1xuLy8gTk9URTogSlMtWUFNTCBkb2VzIG5vdCBzdXBwb3J0IHNjaGVtYS1zcGVjaWZpYyB0YWcgcmVzb2x1dGlvbiByZXN0cmljdGlvbnMuXG4vLyBTbywgQ29yZSBzY2hlbWEgaGFzIG5vIGRpc3RpbmN0aW9ucyBmcm9tIEpTT04gc2NoZW1hIGlzIEpTLVlBTUwuXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9qc29uJylcbiAgXVxufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIFlBTUxfREFURV9SRUdFWFAgPSBuZXcgUmVnRXhwKFxuICAnXihbMC05XVswLTldWzAtOV1bMC05XSknICAgICAgICAgICsgLy8gWzFdIHllYXJcbiAgJy0oWzAtOV1bMC05XSknICAgICAgICAgICAgICAgICAgICArIC8vIFsyXSBtb250aFxuICAnLShbMC05XVswLTldKSQnKTsgICAgICAgICAgICAgICAgICAgLy8gWzNdIGRheVxuXG52YXIgWUFNTF9USU1FU1RBTVBfUkVHRVhQID0gbmV3IFJlZ0V4cChcbiAgJ14oWzAtOV1bMC05XVswLTldWzAtOV0pJyAgICAgICAgICArIC8vIFsxXSB5ZWFyXG4gICctKFswLTldWzAtOV0/KScgICAgICAgICAgICAgICAgICAgKyAvLyBbMl0gbW9udGhcbiAgJy0oWzAtOV1bMC05XT8pJyAgICAgICAgICAgICAgICAgICArIC8vIFszXSBkYXlcbiAgJyg/OltUdF18WyBcXFxcdF0rKScgICAgICAgICAgICAgICAgICsgLy8gLi4uXG4gICcoWzAtOV1bMC05XT8pJyAgICAgICAgICAgICAgICAgICAgKyAvLyBbNF0gaG91clxuICAnOihbMC05XVswLTldKScgICAgICAgICAgICAgICAgICAgICsgLy8gWzVdIG1pbnV0ZVxuICAnOihbMC05XVswLTldKScgICAgICAgICAgICAgICAgICAgICsgLy8gWzZdIHNlY29uZFxuICAnKD86XFxcXC4oWzAtOV0qKSk/JyAgICAgICAgICAgICAgICAgKyAvLyBbN10gZnJhY3Rpb25cbiAgJyg/OlsgXFxcXHRdKihafChbLStdKShbMC05XVswLTldPyknICsgLy8gWzhdIHR6IFs5XSB0el9zaWduIFsxMF0gdHpfaG91clxuICAnKD86OihbMC05XVswLTldKSk/KSk/JCcpOyAgICAgICAgICAgLy8gWzExXSB0el9taW51dGVcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxUaW1lc3RhbXAoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoWUFNTF9EQVRFX1JFR0VYUC5leGVjKGRhdGEpICE9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKFlBTUxfVElNRVNUQU1QX1JFR0VYUC5leGVjKGRhdGEpICE9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sVGltZXN0YW1wKGRhdGEpIHtcbiAgdmFyIG1hdGNoLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgZnJhY3Rpb24gPSAwLFxuICAgICAgZGVsdGEgPSBudWxsLCB0el9ob3VyLCB0el9taW51dGUsIGRhdGU7XG5cbiAgbWF0Y2ggPSBZQU1MX0RBVEVfUkVHRVhQLmV4ZWMoZGF0YSk7XG4gIGlmIChtYXRjaCA9PT0gbnVsbCkgbWF0Y2ggPSBZQU1MX1RJTUVTVEFNUF9SRUdFWFAuZXhlYyhkYXRhKTtcblxuICBpZiAobWF0Y2ggPT09IG51bGwpIHRocm93IG5ldyBFcnJvcignRGF0ZSByZXNvbHZlIGVycm9yJyk7XG5cbiAgLy8gbWF0Y2g6IFsxXSB5ZWFyIFsyXSBtb250aCBbM10gZGF5XG5cbiAgeWVhciA9ICsobWF0Y2hbMV0pO1xuICBtb250aCA9ICsobWF0Y2hbMl0pIC0gMTsgLy8gSlMgbW9udGggc3RhcnRzIHdpdGggMFxuICBkYXkgPSArKG1hdGNoWzNdKTtcblxuICBpZiAoIW1hdGNoWzRdKSB7IC8vIG5vIGhvdXJcbiAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSkpO1xuICB9XG5cbiAgLy8gbWF0Y2g6IFs0XSBob3VyIFs1XSBtaW51dGUgWzZdIHNlY29uZCBbN10gZnJhY3Rpb25cblxuICBob3VyID0gKyhtYXRjaFs0XSk7XG4gIG1pbnV0ZSA9ICsobWF0Y2hbNV0pO1xuICBzZWNvbmQgPSArKG1hdGNoWzZdKTtcblxuICBpZiAobWF0Y2hbN10pIHtcbiAgICBmcmFjdGlvbiA9IG1hdGNoWzddLnNsaWNlKDAsIDMpO1xuICAgIHdoaWxlIChmcmFjdGlvbi5sZW5ndGggPCAzKSB7IC8vIG1pbGxpLXNlY29uZHNcbiAgICAgIGZyYWN0aW9uICs9ICcwJztcbiAgICB9XG4gICAgZnJhY3Rpb24gPSArZnJhY3Rpb247XG4gIH1cblxuICAvLyBtYXRjaDogWzhdIHR6IFs5XSB0el9zaWduIFsxMF0gdHpfaG91ciBbMTFdIHR6X21pbnV0ZVxuXG4gIGlmIChtYXRjaFs5XSkge1xuICAgIHR6X2hvdXIgPSArKG1hdGNoWzEwXSk7XG4gICAgdHpfbWludXRlID0gKyhtYXRjaFsxMV0gfHwgMCk7XG4gICAgZGVsdGEgPSAodHpfaG91ciAqIDYwICsgdHpfbWludXRlKSAqIDYwMDAwOyAvLyBkZWx0YSBpbiBtaWxpLXNlY29uZHNcbiAgICBpZiAobWF0Y2hbOV0gPT09ICctJykgZGVsdGEgPSAtZGVsdGE7XG4gIH1cblxuICBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIGZyYWN0aW9uKSk7XG5cbiAgaWYgKGRlbHRhKSBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgLSBkZWx0YSk7XG5cbiAgcmV0dXJuIGRhdGU7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudFlhbWxUaW1lc3RhbXAob2JqZWN0IC8qLCBzdHlsZSovKSB7XG4gIHJldHVybiBvYmplY3QudG9JU09TdHJpbmcoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6dGltZXN0YW1wJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxUaW1lc3RhbXAsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbFRpbWVzdGFtcCxcbiAgaW5zdGFuY2VPZjogRGF0ZSxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRZYW1sVGltZXN0YW1wXG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbE1lcmdlKGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEgPT09ICc8PCcgfHwgZGF0YSA9PT0gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6bWVyZ2UnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbE1lcmdlXG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSovXG5cbnZhciBOb2RlQnVmZmVyO1xuXG50cnkge1xuICAvLyBBIHRyaWNrIGZvciBicm93c2VyaWZpZWQgdmVyc2lvbiwgdG8gbm90IGluY2x1ZGUgYEJ1ZmZlcmAgc2hpbVxuICB2YXIgX3JlcXVpcmUgPSByZXF1aXJlO1xuICBOb2RlQnVmZmVyID0gX3JlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbn0gY2F0Y2ggKF9fKSB7fVxuXG52YXIgVHlwZSAgICAgICA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuXG4vLyBbIDY0LCA2NSwgNjYgXSAtPiBbIHBhZGRpbmcsIENSLCBMRiBdXG52YXIgQkFTRTY0X01BUCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVxcblxccic7XG5cblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxCaW5hcnkoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBjb2RlLCBpZHgsIGJpdGxlbiA9IDAsIG1heCA9IGRhdGEubGVuZ3RoLCBtYXAgPSBCQVNFNjRfTUFQO1xuXG4gIC8vIENvbnZlcnQgb25lIGJ5IG9uZS5cbiAgZm9yIChpZHggPSAwOyBpZHggPCBtYXg7IGlkeCsrKSB7XG4gICAgY29kZSA9IG1hcC5pbmRleE9mKGRhdGEuY2hhckF0KGlkeCkpO1xuXG4gICAgLy8gU2tpcCBDUi9MRlxuICAgIGlmIChjb2RlID4gNjQpIGNvbnRpbnVlO1xuXG4gICAgLy8gRmFpbCBvbiBpbGxlZ2FsIGNoYXJhY3RlcnNcbiAgICBpZiAoY29kZSA8IDApIHJldHVybiBmYWxzZTtcblxuICAgIGJpdGxlbiArPSA2O1xuICB9XG5cbiAgLy8gSWYgdGhlcmUgYXJlIGFueSBiaXRzIGxlZnQsIHNvdXJjZSB3YXMgY29ycnVwdGVkXG4gIHJldHVybiAoYml0bGVuICUgOCkgPT09IDA7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxCaW5hcnkoZGF0YSkge1xuICB2YXIgaWR4LCB0YWlsYml0cyxcbiAgICAgIGlucHV0ID0gZGF0YS5yZXBsYWNlKC9bXFxyXFxuPV0vZywgJycpLCAvLyByZW1vdmUgQ1IvTEYgJiBwYWRkaW5nIHRvIHNpbXBsaWZ5IHNjYW5cbiAgICAgIG1heCA9IGlucHV0Lmxlbmd0aCxcbiAgICAgIG1hcCA9IEJBU0U2NF9NQVAsXG4gICAgICBiaXRzID0gMCxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIC8vIENvbGxlY3QgYnkgNio0IGJpdHMgKDMgYnl0ZXMpXG5cbiAgZm9yIChpZHggPSAwOyBpZHggPCBtYXg7IGlkeCsrKSB7XG4gICAgaWYgKChpZHggJSA0ID09PSAwKSAmJiBpZHgpIHtcbiAgICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDE2KSAmIDB4RkYpO1xuICAgICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gOCkgJiAweEZGKTtcbiAgICAgIHJlc3VsdC5wdXNoKGJpdHMgJiAweEZGKTtcbiAgICB9XG5cbiAgICBiaXRzID0gKGJpdHMgPDwgNikgfCBtYXAuaW5kZXhPZihpbnB1dC5jaGFyQXQoaWR4KSk7XG4gIH1cblxuICAvLyBEdW1wIHRhaWxcblxuICB0YWlsYml0cyA9IChtYXggJSA0KSAqIDY7XG5cbiAgaWYgKHRhaWxiaXRzID09PSAwKSB7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gMTYpICYgMHhGRik7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gOCkgJiAweEZGKTtcbiAgICByZXN1bHQucHVzaChiaXRzICYgMHhGRik7XG4gIH0gZWxzZSBpZiAodGFpbGJpdHMgPT09IDE4KSB7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gMTApICYgMHhGRik7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gMikgJiAweEZGKTtcbiAgfSBlbHNlIGlmICh0YWlsYml0cyA9PT0gMTIpIHtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiA0KSAmIDB4RkYpO1xuICB9XG5cbiAgLy8gV3JhcCBpbnRvIEJ1ZmZlciBmb3IgTm9kZUpTIGFuZCBsZWF2ZSBBcnJheSBmb3IgYnJvd3NlclxuICBpZiAoTm9kZUJ1ZmZlcikge1xuICAgIC8vIFN1cHBvcnQgbm9kZSA2LisgQnVmZmVyIEFQSSB3aGVuIGF2YWlsYWJsZVxuICAgIHJldHVybiBOb2RlQnVmZmVyLmZyb20gPyBOb2RlQnVmZmVyLmZyb20ocmVzdWx0KSA6IG5ldyBOb2RlQnVmZmVyKHJlc3VsdCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRZYW1sQmluYXJ5KG9iamVjdCAvKiwgc3R5bGUqLykge1xuICB2YXIgcmVzdWx0ID0gJycsIGJpdHMgPSAwLCBpZHgsIHRhaWwsXG4gICAgICBtYXggPSBvYmplY3QubGVuZ3RoLFxuICAgICAgbWFwID0gQkFTRTY0X01BUDtcblxuICAvLyBDb252ZXJ0IGV2ZXJ5IHRocmVlIGJ5dGVzIHRvIDQgQVNDSUkgY2hhcmFjdGVycy5cblxuICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspIHtcbiAgICBpZiAoKGlkeCAlIDMgPT09IDApICYmIGlkeCkge1xuICAgICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxOCkgJiAweDNGXTtcbiAgICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMTIpICYgMHgzRl07XG4gICAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDYpICYgMHgzRl07XG4gICAgICByZXN1bHQgKz0gbWFwW2JpdHMgJiAweDNGXTtcbiAgICB9XG5cbiAgICBiaXRzID0gKGJpdHMgPDwgOCkgKyBvYmplY3RbaWR4XTtcbiAgfVxuXG4gIC8vIER1bXAgdGFpbFxuXG4gIHRhaWwgPSBtYXggJSAzO1xuXG4gIGlmICh0YWlsID09PSAwKSB7XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxOCkgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDEyKSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gNikgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwW2JpdHMgJiAweDNGXTtcbiAgfSBlbHNlIGlmICh0YWlsID09PSAyKSB7XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxMCkgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDQpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA8PCAyKSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbNjRdO1xuICB9IGVsc2UgaWYgKHRhaWwgPT09IDEpIHtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDIpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA8PCA0KSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbNjRdO1xuICAgIHJlc3VsdCArPSBtYXBbNjRdO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNCaW5hcnkob2JqZWN0KSB7XG4gIHJldHVybiBOb2RlQnVmZmVyICYmIE5vZGVCdWZmZXIuaXNCdWZmZXIob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6YmluYXJ5Jywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxCaW5hcnksXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEJpbmFyeSxcbiAgcHJlZGljYXRlOiBpc0JpbmFyeSxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRZYW1sQmluYXJ5XG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfdG9TdHJpbmcgICAgICAgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbE9tYXAoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG5cbiAgdmFyIG9iamVjdEtleXMgPSBbXSwgaW5kZXgsIGxlbmd0aCwgcGFpciwgcGFpcktleSwgcGFpckhhc0tleSxcbiAgICAgIG9iamVjdCA9IGRhdGE7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgcGFpciA9IG9iamVjdFtpbmRleF07XG4gICAgcGFpckhhc0tleSA9IGZhbHNlO1xuXG4gICAgaWYgKF90b1N0cmluZy5jYWxsKHBhaXIpICE9PSAnW29iamVjdCBPYmplY3RdJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChwYWlyS2V5IGluIHBhaXIpIHtcbiAgICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChwYWlyLCBwYWlyS2V5KSkge1xuICAgICAgICBpZiAoIXBhaXJIYXNLZXkpIHBhaXJIYXNLZXkgPSB0cnVlO1xuICAgICAgICBlbHNlIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXBhaXJIYXNLZXkpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChvYmplY3RLZXlzLmluZGV4T2YocGFpcktleSkgPT09IC0xKSBvYmplY3RLZXlzLnB1c2gocGFpcktleSk7XG4gICAgZWxzZSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbE9tYXAoZGF0YSkge1xuICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6b21hcCcsIHtcbiAga2luZDogJ3NlcXVlbmNlJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxPbWFwLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxPbWFwXG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgX3RvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxQYWlycyhkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIgaW5kZXgsIGxlbmd0aCwgcGFpciwga2V5cywgcmVzdWx0LFxuICAgICAgb2JqZWN0ID0gZGF0YTtcblxuICByZXN1bHQgPSBuZXcgQXJyYXkob2JqZWN0Lmxlbmd0aCk7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgcGFpciA9IG9iamVjdFtpbmRleF07XG5cbiAgICBpZiAoX3RvU3RyaW5nLmNhbGwocGFpcikgIT09ICdbb2JqZWN0IE9iamVjdF0nKSByZXR1cm4gZmFsc2U7XG5cbiAgICBrZXlzID0gT2JqZWN0LmtleXMocGFpcik7XG5cbiAgICBpZiAoa2V5cy5sZW5ndGggIT09IDEpIHJldHVybiBmYWxzZTtcblxuICAgIHJlc3VsdFtpbmRleF0gPSBbIGtleXNbMF0sIHBhaXJba2V5c1swXV0gXTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sUGFpcnMoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuXG4gIHZhciBpbmRleCwgbGVuZ3RoLCBwYWlyLCBrZXlzLCByZXN1bHQsXG4gICAgICBvYmplY3QgPSBkYXRhO1xuXG4gIHJlc3VsdCA9IG5ldyBBcnJheShvYmplY3QubGVuZ3RoKTtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBwYWlyID0gb2JqZWN0W2luZGV4XTtcblxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhwYWlyKTtcblxuICAgIHJlc3VsdFtpbmRleF0gPSBbIGtleXNbMF0sIHBhaXJba2V5c1swXV0gXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOnBhaXJzJywge1xuICBraW5kOiAnc2VxdWVuY2UnLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbFBhaXJzLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxQYWlyc1xufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sU2V0KGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIHZhciBrZXksIG9iamVjdCA9IGRhdGE7XG5cbiAgZm9yIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkge1xuICAgICAgaWYgKG9iamVjdFtrZXldICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxTZXQoZGF0YSkge1xuICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiB7fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6c2V0Jywge1xuICBraW5kOiAnbWFwcGluZycsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sU2V0LFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxTZXRcbn0pO1xuIiwgIi8vIEpTLVlBTUwncyBkZWZhdWx0IHNjaGVtYSBmb3IgYHNhZmVMb2FkYCBmdW5jdGlvbi5cbi8vIEl0IGlzIG5vdCBkZXNjcmliZWQgaW4gdGhlIFlBTUwgc3BlY2lmaWNhdGlvbi5cbi8vXG4vLyBUaGlzIHNjaGVtYSBpcyBiYXNlZCBvbiBzdGFuZGFyZCBZQU1MJ3MgQ29yZSBzY2hlbWEgYW5kIGluY2x1ZGVzIG1vc3Qgb2Zcbi8vIGV4dHJhIHR5cGVzIGRlc2NyaWJlZCBhdCBZQU1MIHRhZyByZXBvc2l0b3J5LiAoaHR0cDovL3lhbWwub3JnL3R5cGUvKVxuXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgU2NoZW1hID0gcmVxdWlyZSgnLi4vc2NoZW1hJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hKHtcbiAgaW5jbHVkZTogW1xuICAgIHJlcXVpcmUoJy4vY29yZScpXG4gIF0sXG4gIGltcGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS90aW1lc3RhbXAnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL21lcmdlJylcbiAgXSxcbiAgZXhwbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL2JpbmFyeScpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvb21hcCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvcGFpcnMnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL3NldCcpXG4gIF1cbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi8uLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVKYXZhc2NyaXB0VW5kZWZpbmVkKCkge1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0SmF2YXNjcmlwdFVuZGVmaW5lZCgpIHtcbiAgLyplc2xpbnQtZGlzYWJsZSBuby11bmRlZmluZWQqL1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRKYXZhc2NyaXB0VW5kZWZpbmVkKCkge1xuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ3VuZGVmaW5lZCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmpzL3VuZGVmaW5lZCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVKYXZhc2NyaXB0VW5kZWZpbmVkLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdEphdmFzY3JpcHRVbmRlZmluZWQsXG4gIHByZWRpY2F0ZTogaXNVbmRlZmluZWQsXG4gIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdFVuZGVmaW5lZFxufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uLy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZUphdmFzY3JpcHRSZWdFeHAoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICB2YXIgcmVnZXhwID0gZGF0YSxcbiAgICAgIHRhaWwgICA9IC9cXC8oW2dpbV0qKSQvLmV4ZWMoZGF0YSksXG4gICAgICBtb2RpZmllcnMgPSAnJztcblxuICAvLyBpZiByZWdleHAgc3RhcnRzIHdpdGggJy8nIGl0IGNhbiBoYXZlIG1vZGlmaWVycyBhbmQgbXVzdCBiZSBwcm9wZXJseSBjbG9zZWRcbiAgLy8gYC9mb28vZ2ltYCAtIG1vZGlmaWVycyB0YWlsIGNhbiBiZSBtYXhpbXVtIDMgY2hhcnNcbiAgaWYgKHJlZ2V4cFswXSA9PT0gJy8nKSB7XG4gICAgaWYgKHRhaWwpIG1vZGlmaWVycyA9IHRhaWxbMV07XG5cbiAgICBpZiAobW9kaWZpZXJzLmxlbmd0aCA+IDMpIHJldHVybiBmYWxzZTtcbiAgICAvLyBpZiBleHByZXNzaW9uIHN0YXJ0cyB3aXRoIC8sIGlzIHNob3VsZCBiZSBwcm9wZXJseSB0ZXJtaW5hdGVkXG4gICAgaWYgKHJlZ2V4cFtyZWdleHAubGVuZ3RoIC0gbW9kaWZpZXJzLmxlbmd0aCAtIDFdICE9PSAnLycpIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0UmVnRXhwKGRhdGEpIHtcbiAgdmFyIHJlZ2V4cCA9IGRhdGEsXG4gICAgICB0YWlsICAgPSAvXFwvKFtnaW1dKikkLy5leGVjKGRhdGEpLFxuICAgICAgbW9kaWZpZXJzID0gJyc7XG5cbiAgLy8gYC9mb28vZ2ltYCAtIHRhaWwgY2FuIGJlIG1heGltdW0gNCBjaGFyc1xuICBpZiAocmVnZXhwWzBdID09PSAnLycpIHtcbiAgICBpZiAodGFpbCkgbW9kaWZpZXJzID0gdGFpbFsxXTtcbiAgICByZWdleHAgPSByZWdleHAuc2xpY2UoMSwgcmVnZXhwLmxlbmd0aCAtIG1vZGlmaWVycy5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVnRXhwKHJlZ2V4cCwgbW9kaWZpZXJzKTtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50SmF2YXNjcmlwdFJlZ0V4cChvYmplY3QgLyosIHN0eWxlKi8pIHtcbiAgdmFyIHJlc3VsdCA9ICcvJyArIG9iamVjdC5zb3VyY2UgKyAnLyc7XG5cbiAgaWYgKG9iamVjdC5nbG9iYWwpIHJlc3VsdCArPSAnZyc7XG4gIGlmIChvYmplY3QubXVsdGlsaW5lKSByZXN1bHQgKz0gJ20nO1xuICBpZiAob2JqZWN0Lmlnbm9yZUNhc2UpIHJlc3VsdCArPSAnaSc7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNSZWdFeHAob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmpzL3JlZ2V4cCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVKYXZhc2NyaXB0UmVnRXhwLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdEphdmFzY3JpcHRSZWdFeHAsXG4gIHByZWRpY2F0ZTogaXNSZWdFeHAsXG4gIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdFJlZ0V4cFxufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZXNwcmltYTtcblxuLy8gQnJvd3NlcmlmaWVkIHZlcnNpb24gZG9lcyBub3QgaGF2ZSBlc3ByaW1hXG4vL1xuLy8gMS4gRm9yIG5vZGUuanMganVzdCByZXF1aXJlIG1vZHVsZSBhcyBkZXBzXG4vLyAyLiBGb3IgYnJvd3NlciB0cnkgdG8gcmVxdWlyZSBtdWR1bGUgdmlhIGV4dGVybmFsIEFNRCBzeXN0ZW0uXG4vLyAgICBJZiBub3QgZm91bmQgLSB0cnkgdG8gZmFsbGJhY2sgdG8gd2luZG93LmVzcHJpbWEuIElmIG5vdFxuLy8gICAgZm91bmQgdG9vIC0gdGhlbiBmYWlsIHRvIHBhcnNlLlxuLy9cbnRyeSB7XG4gIC8vIHdvcmthcm91bmQgdG8gZXhjbHVkZSBwYWNrYWdlIGZyb20gYnJvd3NlcmlmeSBsaXN0LlxuICB2YXIgX3JlcXVpcmUgPSByZXF1aXJlO1xuICBlc3ByaW1hID0gX3JlcXVpcmUoJ2VzcHJpbWEnKTtcbn0gY2F0Y2ggKF8pIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tcmVkZWNsYXJlICovXG4gIC8qIGdsb2JhbCB3aW5kb3cgKi9cbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSBlc3ByaW1hID0gd2luZG93LmVzcHJpbWE7XG59XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlSmF2YXNjcmlwdEZ1bmN0aW9uKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICB0cnkge1xuICAgIHZhciBzb3VyY2UgPSAnKCcgKyBkYXRhICsgJyknLFxuICAgICAgICBhc3QgICAgPSBlc3ByaW1hLnBhcnNlKHNvdXJjZSwgeyByYW5nZTogdHJ1ZSB9KTtcblxuICAgIGlmIChhc3QudHlwZSAgICAgICAgICAgICAgICAgICAgIT09ICdQcm9ncmFtJyAgICAgICAgICAgICB8fFxuICAgICAgICBhc3QuYm9keS5sZW5ndGggICAgICAgICAgICAgIT09IDEgICAgICAgICAgICAgICAgICAgICB8fFxuICAgICAgICBhc3QuYm9keVswXS50eXBlICAgICAgICAgICAgIT09ICdFeHByZXNzaW9uU3RhdGVtZW50JyB8fFxuICAgICAgICAoYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi50eXBlICE9PSAnQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24nICYmXG4gICAgICAgICAgYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi50eXBlICE9PSAnRnVuY3Rpb25FeHByZXNzaW9uJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdEphdmFzY3JpcHRGdW5jdGlvbihkYXRhKSB7XG4gIC8qanNsaW50IGV2aWw6dHJ1ZSovXG5cbiAgdmFyIHNvdXJjZSA9ICcoJyArIGRhdGEgKyAnKScsXG4gICAgICBhc3QgICAgPSBlc3ByaW1hLnBhcnNlKHNvdXJjZSwgeyByYW5nZTogdHJ1ZSB9KSxcbiAgICAgIHBhcmFtcyA9IFtdLFxuICAgICAgYm9keTtcblxuICBpZiAoYXN0LnR5cGUgICAgICAgICAgICAgICAgICAgICE9PSAnUHJvZ3JhbScgICAgICAgICAgICAgfHxcbiAgICAgIGFzdC5ib2R5Lmxlbmd0aCAgICAgICAgICAgICAhPT0gMSAgICAgICAgICAgICAgICAgICAgIHx8XG4gICAgICBhc3QuYm9keVswXS50eXBlICAgICAgICAgICAgIT09ICdFeHByZXNzaW9uU3RhdGVtZW50JyB8fFxuICAgICAgKGFzdC5ib2R5WzBdLmV4cHJlc3Npb24udHlwZSAhPT0gJ0Fycm93RnVuY3Rpb25FeHByZXNzaW9uJyAmJlxuICAgICAgICBhc3QuYm9keVswXS5leHByZXNzaW9uLnR5cGUgIT09ICdGdW5jdGlvbkV4cHJlc3Npb24nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHJlc29sdmUgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24ucGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgcGFyYW1zLnB1c2gocGFyYW0ubmFtZSk7XG4gIH0pO1xuXG4gIGJvZHkgPSBhc3QuYm9keVswXS5leHByZXNzaW9uLmJvZHkucmFuZ2U7XG5cbiAgLy8gRXNwcmltYSdzIHJhbmdlcyBpbmNsdWRlIHRoZSBmaXJzdCAneycgYW5kIHRoZSBsYXN0ICd9JyBjaGFyYWN0ZXJzIG9uXG4gIC8vIGZ1bmN0aW9uIGV4cHJlc3Npb25zLiBTbyBjdXQgdGhlbSBvdXQuXG4gIGlmIChhc3QuYm9keVswXS5leHByZXNzaW9uLmJvZHkudHlwZSA9PT0gJ0Jsb2NrU3RhdGVtZW50Jykge1xuICAgIC8qZXNsaW50LWRpc2FibGUgbm8tbmV3LWZ1bmMqL1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb24ocGFyYW1zLCBzb3VyY2Uuc2xpY2UoYm9keVswXSArIDEsIGJvZHlbMV0gLSAxKSk7XG4gIH1cbiAgLy8gRVM2IGFycm93IGZ1bmN0aW9ucyBjYW4gb21pdCB0aGUgQmxvY2tTdGF0ZW1lbnQuIEluIHRoYXQgY2FzZSwganVzdCByZXR1cm5cbiAgLy8gdGhlIGJvZHkuXG4gIC8qZXNsaW50LWRpc2FibGUgbm8tbmV3LWZ1bmMqL1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uKHBhcmFtcywgJ3JldHVybiAnICsgc291cmNlLnNsaWNlKGJvZHlbMF0sIGJvZHlbMV0pKTtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50SmF2YXNjcmlwdEZ1bmN0aW9uKG9iamVjdCAvKiwgc3R5bGUqLykge1xuICByZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24ob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6anMvZnVuY3Rpb24nLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlSmF2YXNjcmlwdEZ1bmN0aW9uLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdEphdmFzY3JpcHRGdW5jdGlvbixcbiAgcHJlZGljYXRlOiBpc0Z1bmN0aW9uLFxuICByZXByZXNlbnQ6IHJlcHJlc2VudEphdmFzY3JpcHRGdW5jdGlvblxufSk7XG4iLCAiLy8gSlMtWUFNTCdzIGRlZmF1bHQgc2NoZW1hIGZvciBgbG9hZGAgZnVuY3Rpb24uXG4vLyBJdCBpcyBub3QgZGVzY3JpYmVkIGluIHRoZSBZQU1MIHNwZWNpZmljYXRpb24uXG4vL1xuLy8gVGhpcyBzY2hlbWEgaXMgYmFzZWQgb24gSlMtWUFNTCdzIGRlZmF1bHQgc2FmZSBzY2hlbWEgYW5kIGluY2x1ZGVzXG4vLyBKYXZhU2NyaXB0LXNwZWNpZmljIHR5cGVzOiAhIWpzL3VuZGVmaW5lZCwgISFqcy9yZWdleHAgYW5kICEhanMvZnVuY3Rpb24uXG4vL1xuLy8gQWxzbyB0aGlzIHNjaGVtYSBpcyB1c2VkIGFzIGRlZmF1bHQgYmFzZSBzY2hlbWEgYXQgYFNjaGVtYS5jcmVhdGVgIGZ1bmN0aW9uLlxuXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgU2NoZW1hID0gcmVxdWlyZSgnLi4vc2NoZW1hJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBTY2hlbWEuREVGQVVMVCA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9kZWZhdWx0X3NhZmUnKVxuICBdLFxuICBleHBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvanMvdW5kZWZpbmVkJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9qcy9yZWdleHAnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2pzL2Z1bmN0aW9uJylcbiAgXVxufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG4vKmVzbGludC1kaXNhYmxlIG1heC1sZW4sbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuXG52YXIgY29tbW9uICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG52YXIgWUFNTEV4Y2VwdGlvbiAgICAgICA9IHJlcXVpcmUoJy4vZXhjZXB0aW9uJyk7XG52YXIgTWFyayAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vbWFyaycpO1xudmFyIERFRkFVTFRfU0FGRV9TQ0hFTUEgPSByZXF1aXJlKCcuL3NjaGVtYS9kZWZhdWx0X3NhZmUnKTtcbnZhciBERUZBVUxUX0ZVTExfU0NIRU1BID0gcmVxdWlyZSgnLi9zY2hlbWEvZGVmYXVsdF9mdWxsJyk7XG5cblxudmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cblxudmFyIENPTlRFWFRfRkxPV19JTiAgID0gMTtcbnZhciBDT05URVhUX0ZMT1dfT1VUICA9IDI7XG52YXIgQ09OVEVYVF9CTE9DS19JTiAgPSAzO1xudmFyIENPTlRFWFRfQkxPQ0tfT1VUID0gNDtcblxuXG52YXIgQ0hPTVBJTkdfQ0xJUCAgPSAxO1xudmFyIENIT01QSU5HX1NUUklQID0gMjtcbnZhciBDSE9NUElOR19LRUVQICA9IDM7XG5cblxudmFyIFBBVFRFUk5fTk9OX1BSSU5UQUJMRSAgICAgICAgID0gL1tcXHgwMC1cXHgwOFxceDBCXFx4MENcXHgwRS1cXHgxRlxceDdGLVxceDg0XFx4ODYtXFx4OUZcXHVGRkZFXFx1RkZGRl18W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0vO1xudmFyIFBBVFRFUk5fTk9OX0FTQ0lJX0xJTkVfQlJFQUtTID0gL1tcXHg4NVxcdTIwMjhcXHUyMDI5XS87XG52YXIgUEFUVEVSTl9GTE9XX0lORElDQVRPUlMgICAgICAgPSAvWyxcXFtcXF1cXHtcXH1dLztcbnZhciBQQVRURVJOX1RBR19IQU5ETEUgICAgICAgICAgICA9IC9eKD86IXwhIXwhW2EtelxcLV0rISkkL2k7XG52YXIgUEFUVEVSTl9UQUdfVVJJICAgICAgICAgICAgICAgPSAvXig/OiF8W14sXFxbXFxdXFx7XFx9XSkoPzolWzAtOWEtZl17Mn18WzAtOWEtelxcLSM7XFwvXFw/OkAmPVxcK1xcJCxfXFwuIX5cXConXFwoXFwpXFxbXFxdXSkqJC9pO1xuXG5cbmZ1bmN0aW9uIF9jbGFzcyhvYmopIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopOyB9XG5cbmZ1bmN0aW9uIGlzX0VPTChjKSB7XG4gIHJldHVybiAoYyA9PT0gMHgwQS8qIExGICovKSB8fCAoYyA9PT0gMHgwRC8qIENSICovKTtcbn1cblxuZnVuY3Rpb24gaXNfV0hJVEVfU1BBQ0UoYykge1xuICByZXR1cm4gKGMgPT09IDB4MDkvKiBUYWIgKi8pIHx8IChjID09PSAweDIwLyogU3BhY2UgKi8pO1xufVxuXG5mdW5jdGlvbiBpc19XU19PUl9FT0woYykge1xuICByZXR1cm4gKGMgPT09IDB4MDkvKiBUYWIgKi8pIHx8XG4gICAgICAgICAoYyA9PT0gMHgyMC8qIFNwYWNlICovKSB8fFxuICAgICAgICAgKGMgPT09IDB4MEEvKiBMRiAqLykgfHxcbiAgICAgICAgIChjID09PSAweDBELyogQ1IgKi8pO1xufVxuXG5mdW5jdGlvbiBpc19GTE9XX0lORElDQVRPUihjKSB7XG4gIHJldHVybiBjID09PSAweDJDLyogLCAqLyB8fFxuICAgICAgICAgYyA9PT0gMHg1Qi8qIFsgKi8gfHxcbiAgICAgICAgIGMgPT09IDB4NUQvKiBdICovIHx8XG4gICAgICAgICBjID09PSAweDdCLyogeyAqLyB8fFxuICAgICAgICAgYyA9PT0gMHg3RC8qIH0gKi87XG59XG5cbmZ1bmN0aW9uIGZyb21IZXhDb2RlKGMpIHtcbiAgdmFyIGxjO1xuXG4gIGlmICgoMHgzMC8qIDAgKi8gPD0gYykgJiYgKGMgPD0gMHgzOS8qIDkgKi8pKSB7XG4gICAgcmV0dXJuIGMgLSAweDMwO1xuICB9XG5cbiAgLyplc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlKi9cbiAgbGMgPSBjIHwgMHgyMDtcblxuICBpZiAoKDB4NjEvKiBhICovIDw9IGxjKSAmJiAobGMgPD0gMHg2Ni8qIGYgKi8pKSB7XG4gICAgcmV0dXJuIGxjIC0gMHg2MSArIDEwO1xuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVkSGV4TGVuKGMpIHtcbiAgaWYgKGMgPT09IDB4NzgvKiB4ICovKSB7IHJldHVybiAyOyB9XG4gIGlmIChjID09PSAweDc1LyogdSAqLykgeyByZXR1cm4gNDsgfVxuICBpZiAoYyA9PT0gMHg1NS8qIFUgKi8pIHsgcmV0dXJuIDg7IH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGZyb21EZWNpbWFsQ29kZShjKSB7XG4gIGlmICgoMHgzMC8qIDAgKi8gPD0gYykgJiYgKGMgPD0gMHgzOS8qIDkgKi8pKSB7XG4gICAgcmV0dXJuIGMgLSAweDMwO1xuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBzaW1wbGVFc2NhcGVTZXF1ZW5jZShjKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIGluZGVudCAqL1xuICByZXR1cm4gKGMgPT09IDB4MzAvKiAwICovKSA/ICdcXHgwMCcgOlxuICAgICAgICAoYyA9PT0gMHg2MS8qIGEgKi8pID8gJ1xceDA3JyA6XG4gICAgICAgIChjID09PSAweDYyLyogYiAqLykgPyAnXFx4MDgnIDpcbiAgICAgICAgKGMgPT09IDB4NzQvKiB0ICovKSA/ICdcXHgwOScgOlxuICAgICAgICAoYyA9PT0gMHgwOS8qIFRhYiAqLykgPyAnXFx4MDknIDpcbiAgICAgICAgKGMgPT09IDB4NkUvKiBuICovKSA/ICdcXHgwQScgOlxuICAgICAgICAoYyA9PT0gMHg3Ni8qIHYgKi8pID8gJ1xceDBCJyA6XG4gICAgICAgIChjID09PSAweDY2LyogZiAqLykgPyAnXFx4MEMnIDpcbiAgICAgICAgKGMgPT09IDB4NzIvKiByICovKSA/ICdcXHgwRCcgOlxuICAgICAgICAoYyA9PT0gMHg2NS8qIGUgKi8pID8gJ1xceDFCJyA6XG4gICAgICAgIChjID09PSAweDIwLyogU3BhY2UgKi8pID8gJyAnIDpcbiAgICAgICAgKGMgPT09IDB4MjIvKiBcIiAqLykgPyAnXFx4MjInIDpcbiAgICAgICAgKGMgPT09IDB4MkYvKiAvICovKSA/ICcvJyA6XG4gICAgICAgIChjID09PSAweDVDLyogXFwgKi8pID8gJ1xceDVDJyA6XG4gICAgICAgIChjID09PSAweDRFLyogTiAqLykgPyAnXFx4ODUnIDpcbiAgICAgICAgKGMgPT09IDB4NUYvKiBfICovKSA/ICdcXHhBMCcgOlxuICAgICAgICAoYyA9PT0gMHg0Qy8qIEwgKi8pID8gJ1xcdTIwMjgnIDpcbiAgICAgICAgKGMgPT09IDB4NTAvKiBQICovKSA/ICdcXHUyMDI5JyA6ICcnO1xufVxuXG5mdW5jdGlvbiBjaGFyRnJvbUNvZGVwb2ludChjKSB7XG4gIGlmIChjIDw9IDB4RkZGRikge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICB9XG4gIC8vIEVuY29kZSBVVEYtMTYgc3Vycm9nYXRlIHBhaXJcbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTE2I0NvZGVfcG9pbnRzX1UuMkIwMTAwMDBfdG9fVS4yQjEwRkZGRlxuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAoKGMgLSAweDAxMDAwMCkgPj4gMTApICsgMHhEODAwLFxuICAgICgoYyAtIDB4MDEwMDAwKSAmIDB4MDNGRikgKyAweERDMDBcbiAgKTtcbn1cblxudmFyIHNpbXBsZUVzY2FwZUNoZWNrID0gbmV3IEFycmF5KDI1Nik7IC8vIGludGVnZXIsIGZvciBmYXN0IGFjY2Vzc1xudmFyIHNpbXBsZUVzY2FwZU1hcCA9IG5ldyBBcnJheSgyNTYpO1xuZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuICBzaW1wbGVFc2NhcGVDaGVja1tpXSA9IHNpbXBsZUVzY2FwZVNlcXVlbmNlKGkpID8gMSA6IDA7XG4gIHNpbXBsZUVzY2FwZU1hcFtpXSA9IHNpbXBsZUVzY2FwZVNlcXVlbmNlKGkpO1xufVxuXG5cbmZ1bmN0aW9uIFN0YXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHRoaXMuaW5wdXQgPSBpbnB1dDtcblxuICB0aGlzLmZpbGVuYW1lICA9IG9wdGlvbnNbJ2ZpbGVuYW1lJ10gIHx8IG51bGw7XG4gIHRoaXMuc2NoZW1hICAgID0gb3B0aW9uc1snc2NoZW1hJ10gICAgfHwgREVGQVVMVF9GVUxMX1NDSEVNQTtcbiAgdGhpcy5vbldhcm5pbmcgPSBvcHRpb25zWydvbldhcm5pbmcnXSB8fCBudWxsO1xuICB0aGlzLmxlZ2FjeSAgICA9IG9wdGlvbnNbJ2xlZ2FjeSddICAgIHx8IGZhbHNlO1xuICB0aGlzLmpzb24gICAgICA9IG9wdGlvbnNbJ2pzb24nXSAgICAgIHx8IGZhbHNlO1xuICB0aGlzLmxpc3RlbmVyICA9IG9wdGlvbnNbJ2xpc3RlbmVyJ10gIHx8IG51bGw7XG5cbiAgdGhpcy5pbXBsaWNpdFR5cGVzID0gdGhpcy5zY2hlbWEuY29tcGlsZWRJbXBsaWNpdDtcbiAgdGhpcy50eXBlTWFwICAgICAgID0gdGhpcy5zY2hlbWEuY29tcGlsZWRUeXBlTWFwO1xuXG4gIHRoaXMubGVuZ3RoICAgICA9IGlucHV0Lmxlbmd0aDtcbiAgdGhpcy5wb3NpdGlvbiAgID0gMDtcbiAgdGhpcy5saW5lICAgICAgID0gMDtcbiAgdGhpcy5saW5lU3RhcnQgID0gMDtcbiAgdGhpcy5saW5lSW5kZW50ID0gMDtcblxuICB0aGlzLmRvY3VtZW50cyA9IFtdO1xuXG4gIC8qXG4gIHRoaXMudmVyc2lvbjtcbiAgdGhpcy5jaGVja0xpbmVCcmVha3M7XG4gIHRoaXMudGFnTWFwO1xuICB0aGlzLmFuY2hvck1hcDtcbiAgdGhpcy50YWc7XG4gIHRoaXMuYW5jaG9yO1xuICB0aGlzLmtpbmQ7XG4gIHRoaXMucmVzdWx0OyovXG5cbn1cblxuXG5mdW5jdGlvbiBnZW5lcmF0ZUVycm9yKHN0YXRlLCBtZXNzYWdlKSB7XG4gIHJldHVybiBuZXcgWUFNTEV4Y2VwdGlvbihcbiAgICBtZXNzYWdlLFxuICAgIG5ldyBNYXJrKHN0YXRlLmZpbGVuYW1lLCBzdGF0ZS5pbnB1dCwgc3RhdGUucG9zaXRpb24sIHN0YXRlLmxpbmUsIChzdGF0ZS5wb3NpdGlvbiAtIHN0YXRlLmxpbmVTdGFydCkpKTtcbn1cblxuZnVuY3Rpb24gdGhyb3dFcnJvcihzdGF0ZSwgbWVzc2FnZSkge1xuICB0aHJvdyBnZW5lcmF0ZUVycm9yKHN0YXRlLCBtZXNzYWdlKTtcbn1cblxuZnVuY3Rpb24gdGhyb3dXYXJuaW5nKHN0YXRlLCBtZXNzYWdlKSB7XG4gIGlmIChzdGF0ZS5vbldhcm5pbmcpIHtcbiAgICBzdGF0ZS5vbldhcm5pbmcuY2FsbChudWxsLCBnZW5lcmF0ZUVycm9yKHN0YXRlLCBtZXNzYWdlKSk7XG4gIH1cbn1cblxuXG52YXIgZGlyZWN0aXZlSGFuZGxlcnMgPSB7XG5cbiAgWUFNTDogZnVuY3Rpb24gaGFuZGxlWWFtbERpcmVjdGl2ZShzdGF0ZSwgbmFtZSwgYXJncykge1xuXG4gICAgdmFyIG1hdGNoLCBtYWpvciwgbWlub3I7XG5cbiAgICBpZiAoc3RhdGUudmVyc2lvbiAhPT0gbnVsbCkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2R1cGxpY2F0aW9uIG9mICVZQU1MIGRpcmVjdGl2ZScpO1xuICAgIH1cblxuICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ1lBTUwgZGlyZWN0aXZlIGFjY2VwdHMgZXhhY3RseSBvbmUgYXJndW1lbnQnKTtcbiAgICB9XG5cbiAgICBtYXRjaCA9IC9eKFswLTldKylcXC4oWzAtOV0rKSQvLmV4ZWMoYXJnc1swXSk7XG5cbiAgICBpZiAobWF0Y2ggPT09IG51bGwpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdpbGwtZm9ybWVkIGFyZ3VtZW50IG9mIHRoZSBZQU1MIGRpcmVjdGl2ZScpO1xuICAgIH1cblxuICAgIG1ham9yID0gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcbiAgICBtaW5vciA9IHBhcnNlSW50KG1hdGNoWzJdLCAxMCk7XG5cbiAgICBpZiAobWFqb3IgIT09IDEpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmFjY2VwdGFibGUgWUFNTCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCcpO1xuICAgIH1cblxuICAgIHN0YXRlLnZlcnNpb24gPSBhcmdzWzBdO1xuICAgIHN0YXRlLmNoZWNrTGluZUJyZWFrcyA9IChtaW5vciA8IDIpO1xuXG4gICAgaWYgKG1pbm9yICE9PSAxICYmIG1pbm9yICE9PSAyKSB7XG4gICAgICB0aHJvd1dhcm5pbmcoc3RhdGUsICd1bnN1cHBvcnRlZCBZQU1MIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50Jyk7XG4gICAgfVxuICB9LFxuXG4gIFRBRzogZnVuY3Rpb24gaGFuZGxlVGFnRGlyZWN0aXZlKHN0YXRlLCBuYW1lLCBhcmdzKSB7XG5cbiAgICB2YXIgaGFuZGxlLCBwcmVmaXg7XG5cbiAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdUQUcgZGlyZWN0aXZlIGFjY2VwdHMgZXhhY3RseSB0d28gYXJndW1lbnRzJyk7XG4gICAgfVxuXG4gICAgaGFuZGxlID0gYXJnc1swXTtcbiAgICBwcmVmaXggPSBhcmdzWzFdO1xuXG4gICAgaWYgKCFQQVRURVJOX1RBR19IQU5ETEUudGVzdChoYW5kbGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaWxsLWZvcm1lZCB0YWcgaGFuZGxlIChmaXJzdCBhcmd1bWVudCkgb2YgdGhlIFRBRyBkaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUudGFnTWFwLCBoYW5kbGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGhlcmUgaXMgYSBwcmV2aW91c2x5IGRlY2xhcmVkIHN1ZmZpeCBmb3IgXCInICsgaGFuZGxlICsgJ1wiIHRhZyBoYW5kbGUnKTtcbiAgICB9XG5cbiAgICBpZiAoIVBBVFRFUk5fVEFHX1VSSS50ZXN0KHByZWZpeCkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdpbGwtZm9ybWVkIHRhZyBwcmVmaXggKHNlY29uZCBhcmd1bWVudCkgb2YgdGhlIFRBRyBkaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBzdGF0ZS50YWdNYXBbaGFuZGxlXSA9IHByZWZpeDtcbiAgfVxufTtcblxuXG5mdW5jdGlvbiBjYXB0dXJlU2VnbWVudChzdGF0ZSwgc3RhcnQsIGVuZCwgY2hlY2tKc29uKSB7XG4gIHZhciBfcG9zaXRpb24sIF9sZW5ndGgsIF9jaGFyYWN0ZXIsIF9yZXN1bHQ7XG5cbiAgaWYgKHN0YXJ0IDwgZW5kKSB7XG4gICAgX3Jlc3VsdCA9IHN0YXRlLmlucHV0LnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gICAgaWYgKGNoZWNrSnNvbikge1xuICAgICAgZm9yIChfcG9zaXRpb24gPSAwLCBfbGVuZ3RoID0gX3Jlc3VsdC5sZW5ndGg7IF9wb3NpdGlvbiA8IF9sZW5ndGg7IF9wb3NpdGlvbiArPSAxKSB7XG4gICAgICAgIF9jaGFyYWN0ZXIgPSBfcmVzdWx0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTtcbiAgICAgICAgaWYgKCEoX2NoYXJhY3RlciA9PT0gMHgwOSB8fFxuICAgICAgICAgICAgICAoMHgyMCA8PSBfY2hhcmFjdGVyICYmIF9jaGFyYWN0ZXIgPD0gMHgxMEZGRkYpKSkge1xuICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdleHBlY3RlZCB2YWxpZCBKU09OIGNoYXJhY3RlcicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChQQVRURVJOX05PTl9QUklOVEFCTEUudGVzdChfcmVzdWx0KSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RoZSBzdHJlYW0gY29udGFpbnMgbm9uLXByaW50YWJsZSBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuXG4gICAgc3RhdGUucmVzdWx0ICs9IF9yZXN1bHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWVyZ2VNYXBwaW5ncyhzdGF0ZSwgZGVzdGluYXRpb24sIHNvdXJjZSwgb3ZlcnJpZGFibGVLZXlzKSB7XG4gIHZhciBzb3VyY2VLZXlzLCBrZXksIGluZGV4LCBxdWFudGl0eTtcblxuICBpZiAoIWNvbW1vbi5pc09iamVjdChzb3VyY2UpKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2Nhbm5vdCBtZXJnZSBtYXBwaW5nczsgdGhlIHByb3ZpZGVkIHNvdXJjZSBvYmplY3QgaXMgdW5hY2NlcHRhYmxlJyk7XG4gIH1cblxuICBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcblxuICBmb3IgKGluZGV4ID0gMCwgcXVhbnRpdHkgPSBzb3VyY2VLZXlzLmxlbmd0aDsgaW5kZXggPCBxdWFudGl0eTsgaW5kZXggKz0gMSkge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaW5kZXhdO1xuXG4gICAgaWYgKCFfaGFzT3duUHJvcGVydHkuY2FsbChkZXN0aW5hdGlvbiwga2V5KSkge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgb3ZlcnJpZGFibGVLZXlzW2tleV0gPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlLCBzdGFydExpbmUsIHN0YXJ0UG9zKSB7XG4gIHZhciBpbmRleCwgcXVhbnRpdHk7XG5cbiAgLy8gVGhlIG91dHB1dCBpcyBhIHBsYWluIG9iamVjdCBoZXJlLCBzbyBrZXlzIGNhbiBvbmx5IGJlIHN0cmluZ3MuXG4gIC8vIFdlIG5lZWQgdG8gY29udmVydCBrZXlOb2RlIHRvIGEgc3RyaW5nLCBidXQgZG9pbmcgc28gY2FuIGhhbmcgdGhlIHByb2Nlc3NcbiAgLy8gKGRlZXBseSBuZXN0ZWQgYXJyYXlzIHRoYXQgZXhwbG9kZSBleHBvbmVudGlhbGx5IHVzaW5nIGFsaWFzZXMpLlxuICBpZiAoQXJyYXkuaXNBcnJheShrZXlOb2RlKSkge1xuICAgIGtleU5vZGUgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChrZXlOb2RlKTtcblxuICAgIGZvciAoaW5kZXggPSAwLCBxdWFudGl0eSA9IGtleU5vZGUubGVuZ3RoOyBpbmRleCA8IHF1YW50aXR5OyBpbmRleCArPSAxKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXlOb2RlW2luZGV4XSkpIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ25lc3RlZCBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGtleXMnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBrZXlOb2RlID09PSAnb2JqZWN0JyAmJiBfY2xhc3Moa2V5Tm9kZVtpbmRleF0pID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgICBrZXlOb2RlW2luZGV4XSA9ICdbb2JqZWN0IE9iamVjdF0nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEF2b2lkIGNvZGUgZXhlY3V0aW9uIGluIGxvYWQoKSB2aWEgdG9TdHJpbmcgcHJvcGVydHlcbiAgLy8gKHN0aWxsIHVzZSBpdHMgb3duIHRvU3RyaW5nIGZvciBhcnJheXMsIHRpbWVzdGFtcHMsXG4gIC8vIGFuZCB3aGF0ZXZlciB1c2VyIHNjaGVtYSBleHRlbnNpb25zIGhhcHBlbiB0byBoYXZlIEBAdG9TdHJpbmdUYWcpXG4gIGlmICh0eXBlb2Yga2V5Tm9kZSA9PT0gJ29iamVjdCcgJiYgX2NsYXNzKGtleU5vZGUpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgIGtleU5vZGUgPSAnW29iamVjdCBPYmplY3RdJztcbiAgfVxuXG5cbiAga2V5Tm9kZSA9IFN0cmluZyhrZXlOb2RlKTtcblxuICBpZiAoX3Jlc3VsdCA9PT0gbnVsbCkge1xuICAgIF9yZXN1bHQgPSB7fTtcbiAgfVxuXG4gIGlmIChrZXlUYWcgPT09ICd0YWc6eWFtbC5vcmcsMjAwMjptZXJnZScpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZU5vZGUpKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMCwgcXVhbnRpdHkgPSB2YWx1ZU5vZGUubGVuZ3RoOyBpbmRleCA8IHF1YW50aXR5OyBpbmRleCArPSAxKSB7XG4gICAgICAgIG1lcmdlTWFwcGluZ3Moc3RhdGUsIF9yZXN1bHQsIHZhbHVlTm9kZVtpbmRleF0sIG92ZXJyaWRhYmxlS2V5cyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lcmdlTWFwcGluZ3Moc3RhdGUsIF9yZXN1bHQsIHZhbHVlTm9kZSwgb3ZlcnJpZGFibGVLZXlzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFzdGF0ZS5qc29uICYmXG4gICAgICAgICFfaGFzT3duUHJvcGVydHkuY2FsbChvdmVycmlkYWJsZUtleXMsIGtleU5vZGUpICYmXG4gICAgICAgIF9oYXNPd25Qcm9wZXJ0eS5jYWxsKF9yZXN1bHQsIGtleU5vZGUpKSB7XG4gICAgICBzdGF0ZS5saW5lID0gc3RhcnRMaW5lIHx8IHN0YXRlLmxpbmU7XG4gICAgICBzdGF0ZS5wb3NpdGlvbiA9IHN0YXJ0UG9zIHx8IHN0YXRlLnBvc2l0aW9uO1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2R1cGxpY2F0ZWQgbWFwcGluZyBrZXknKTtcbiAgICB9XG4gICAgX3Jlc3VsdFtrZXlOb2RlXSA9IHZhbHVlTm9kZTtcbiAgICBkZWxldGUgb3ZlcnJpZGFibGVLZXlzW2tleU5vZGVdO1xuICB9XG5cbiAgcmV0dXJuIF9yZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlYWRMaW5lQnJlYWsoc3RhdGUpIHtcbiAgdmFyIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoID09PSAweDBBLyogTEYgKi8pIHtcbiAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICB9IGVsc2UgaWYgKGNoID09PSAweDBELyogQ1IgKi8pIHtcbiAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgIGlmIChzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSA9PT0gMHgwQS8qIExGICovKSB7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYSBsaW5lIGJyZWFrIGlzIGV4cGVjdGVkJyk7XG4gIH1cblxuICBzdGF0ZS5saW5lICs9IDE7XG4gIHN0YXRlLmxpbmVTdGFydCA9IHN0YXRlLnBvc2l0aW9uO1xufVxuXG5mdW5jdGlvbiBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBhbGxvd0NvbW1lbnRzLCBjaGVja0luZGVudCkge1xuICB2YXIgbGluZUJyZWFrcyA9IDAsXG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoYWxsb3dDb21tZW50cyAmJiBjaCA9PT0gMHgyMy8qICMgKi8pIHtcbiAgICAgIGRvIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfSB3aGlsZSAoY2ggIT09IDB4MEEvKiBMRiAqLyAmJiBjaCAhPT0gMHgwRC8qIENSICovICYmIGNoICE9PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgcmVhZExpbmVCcmVhayhzdGF0ZSk7XG5cbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgICBsaW5lQnJlYWtzKys7XG4gICAgICBzdGF0ZS5saW5lSW5kZW50ID0gMDtcblxuICAgICAgd2hpbGUgKGNoID09PSAweDIwLyogU3BhY2UgKi8pIHtcbiAgICAgICAgc3RhdGUubGluZUluZGVudCsrO1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjaGVja0luZGVudCAhPT0gLTEgJiYgbGluZUJyZWFrcyAhPT0gMCAmJiBzdGF0ZS5saW5lSW5kZW50IDwgY2hlY2tJbmRlbnQpIHtcbiAgICB0aHJvd1dhcm5pbmcoc3RhdGUsICdkZWZpY2llbnQgaW5kZW50YXRpb24nKTtcbiAgfVxuXG4gIHJldHVybiBsaW5lQnJlYWtzO1xufVxuXG5mdW5jdGlvbiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpIHtcbiAgdmFyIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbik7XG5cbiAgLy8gQ29uZGl0aW9uIHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgaXMgdGVzdGVkXG4gIC8vIGluIHBhcmVudCBvbiBlYWNoIGNhbGwsIGZvciBlZmZpY2llbmN5LiBObyBuZWVkcyB0byB0ZXN0IGhlcmUgYWdhaW4uXG4gIGlmICgoY2ggPT09IDB4MkQvKiAtICovIHx8IGNoID09PSAweDJFLyogLiAqLykgJiZcbiAgICAgIGNoID09PSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbiArIDEpICYmXG4gICAgICBjaCA9PT0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChfcG9zaXRpb24gKyAyKSkge1xuXG4gICAgX3Bvc2l0aW9uICs9IDM7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTtcblxuICAgIGlmIChjaCA9PT0gMCB8fCBpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIGNvdW50KSB7XG4gIGlmIChjb3VudCA9PT0gMSkge1xuICAgIHN0YXRlLnJlc3VsdCArPSAnICc7XG4gIH0gZWxzZSBpZiAoY291bnQgPiAxKSB7XG4gICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGNvdW50IC0gMSk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiByZWFkUGxhaW5TY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQsIHdpdGhpbkZsb3dDb2xsZWN0aW9uKSB7XG4gIHZhciBwcmVjZWRpbmcsXG4gICAgICBmb2xsb3dpbmcsXG4gICAgICBjYXB0dXJlU3RhcnQsXG4gICAgICBjYXB0dXJlRW5kLFxuICAgICAgaGFzUGVuZGluZ0NvbnRlbnQsXG4gICAgICBfbGluZSxcbiAgICAgIF9saW5lU3RhcnQsXG4gICAgICBfbGluZUluZGVudCxcbiAgICAgIF9raW5kID0gc3RhdGUua2luZCxcbiAgICAgIF9yZXN1bHQgPSBzdGF0ZS5yZXN1bHQsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChpc19XU19PUl9FT0woY2gpICAgICAgfHxcbiAgICAgIGlzX0ZMT1dfSU5ESUNBVE9SKGNoKSB8fFxuICAgICAgY2ggPT09IDB4MjMvKiAjICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyNi8qICYgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDJBLyogKiAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjEvKiAhICovICAgIHx8XG4gICAgICBjaCA9PT0gMHg3Qy8qIHwgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDNFLyogPiAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjcvKiAnICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyMi8qIFwiICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyNS8qICUgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDQwLyogQCAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4NjAvKiBgICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGNoID09PSAweDNGLyogPyAqLyB8fCBjaCA9PT0gMHgyRC8qIC0gKi8pIHtcbiAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICBpZiAoaXNfV1NfT1JfRU9MKGZvbGxvd2luZykgfHxcbiAgICAgICAgd2l0aGluRmxvd0NvbGxlY3Rpb24gJiYgaXNfRkxPV19JTkRJQ0FUT1IoZm9sbG93aW5nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG4gIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgaGFzUGVuZGluZ0NvbnRlbnQgPSBmYWxzZTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBpZiAoY2ggPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSB8fFxuICAgICAgICAgIHdpdGhpbkZsb3dDb2xsZWN0aW9uICYmIGlzX0ZMT1dfSU5ESUNBVE9SKGZvbGxvd2luZykpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKGNoID09PSAweDIzLyogIyAqLykge1xuICAgICAgcHJlY2VkaW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiAtIDEpO1xuXG4gICAgICBpZiAoaXNfV1NfT1JfRU9MKHByZWNlZGluZykpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHx8XG4gICAgICAgICAgICAgICB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihjaCkpIHtcbiAgICAgIGJyZWFrO1xuXG4gICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBfbGluZSA9IHN0YXRlLmxpbmU7XG4gICAgICBfbGluZVN0YXJ0ID0gc3RhdGUubGluZVN0YXJ0O1xuICAgICAgX2xpbmVJbmRlbnQgPSBzdGF0ZS5saW5lSW5kZW50O1xuICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIC0xKTtcblxuICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPj0gbm9kZUluZGVudCkge1xuICAgICAgICBoYXNQZW5kaW5nQ29udGVudCA9IHRydWU7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucG9zaXRpb24gPSBjYXB0dXJlRW5kO1xuICAgICAgICBzdGF0ZS5saW5lID0gX2xpbmU7XG4gICAgICAgIHN0YXRlLmxpbmVTdGFydCA9IF9saW5lU3RhcnQ7XG4gICAgICAgIHN0YXRlLmxpbmVJbmRlbnQgPSBfbGluZUluZGVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc1BlbmRpbmdDb250ZW50KSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCBmYWxzZSk7XG4gICAgICB3cml0ZUZvbGRlZExpbmVzKHN0YXRlLCBzdGF0ZS5saW5lIC0gX2xpbmUpO1xuICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICAgICAgaGFzUGVuZGluZ0NvbnRlbnQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uICsgMTtcbiAgICB9XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIH1cblxuICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCBmYWxzZSk7XG5cbiAgaWYgKHN0YXRlLnJlc3VsdCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9IF9raW5kO1xuICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0O1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlYWRTaW5nbGVRdW90ZWRTY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIGNoLFxuICAgICAgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDI3LyogJyAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG4gIHN0YXRlLnBvc2l0aW9uKys7XG4gIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICB3aGlsZSAoKGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikpICE9PSAwKSB7XG4gICAgaWYgKGNoID09PSAweDI3LyogJyAqLykge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIHRydWUpO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICBpZiAoY2ggPT09IDB4MjcvKiAnICovKSB7XG4gICAgICAgIGNhcHR1cmVTdGFydCA9IHN0YXRlLnBvc2l0aW9uO1xuICAgICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgICBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgdHJ1ZSk7XG4gICAgICB3cml0ZUZvbGRlZExpbmVzKHN0YXRlLCBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBmYWxzZSwgbm9kZUluZGVudCkpO1xuICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgZG9jdW1lbnQgd2l0aGluIGEgc2luZ2xlIHF1b3RlZCBzY2FsYXInKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIHNpbmdsZSBxdW90ZWQgc2NhbGFyJyk7XG59XG5cbmZ1bmN0aW9uIHJlYWREb3VibGVRdW90ZWRTY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIGNhcHR1cmVTdGFydCxcbiAgICAgIGNhcHR1cmVFbmQsXG4gICAgICBoZXhMZW5ndGgsXG4gICAgICBoZXhSZXN1bHQsXG4gICAgICB0bXAsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyMi8qIFwiICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9ICdzY2FsYXInO1xuICBzdGF0ZS5yZXN1bHQgPSAnJztcbiAgc3RhdGUucG9zaXRpb24rKztcbiAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIHdoaWxlICgoY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSkgIT09IDApIHtcbiAgICBpZiAoY2ggPT09IDB4MjIvKiBcIiAqLykge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIHRydWUpO1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgfSBlbHNlIGlmIChjaCA9PT0gMHg1Qy8qIFxcICovKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgIGlmIChpc19FT0woY2gpKSB7XG4gICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCBub2RlSW5kZW50KTtcblxuICAgICAgICAvLyBUT0RPOiByZXdvcmsgdG8gaW5saW5lIGZuIHdpdGggbm8gdHlwZSBjYXN0P1xuICAgICAgfSBlbHNlIGlmIChjaCA8IDI1NiAmJiBzaW1wbGVFc2NhcGVDaGVja1tjaF0pIHtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IHNpbXBsZUVzY2FwZU1hcFtjaF07XG4gICAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG5cbiAgICAgIH0gZWxzZSBpZiAoKHRtcCA9IGVzY2FwZWRIZXhMZW4oY2gpKSA+IDApIHtcbiAgICAgICAgaGV4TGVuZ3RoID0gdG1wO1xuICAgICAgICBoZXhSZXN1bHQgPSAwO1xuXG4gICAgICAgIGZvciAoOyBoZXhMZW5ndGggPiAwOyBoZXhMZW5ndGgtLSkge1xuICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICAgICAgICAgIGlmICgodG1wID0gZnJvbUhleENvZGUoY2gpKSA+PSAwKSB7XG4gICAgICAgICAgICBoZXhSZXN1bHQgPSAoaGV4UmVzdWx0IDw8IDQpICsgdG1wO1xuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdleHBlY3RlZCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY2hhckZyb21Db2RlcG9pbnQoaGV4UmVzdWx0KTtcblxuICAgICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5rbm93biBlc2NhcGUgc2VxdWVuY2UnKTtcbiAgICAgIH1cblxuICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCB0cnVlKTtcbiAgICAgIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCBub2RlSW5kZW50KSk7XG4gICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB9IGVsc2UgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBkb2N1bWVudCB3aXRoaW4gYSBkb3VibGUgcXVvdGVkIHNjYWxhcicpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gICAgfVxuICB9XG5cbiAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgZG91YmxlIHF1b3RlZCBzY2FsYXInKTtcbn1cblxuZnVuY3Rpb24gcmVhZEZsb3dDb2xsZWN0aW9uKHN0YXRlLCBub2RlSW5kZW50KSB7XG4gIHZhciByZWFkTmV4dCA9IHRydWUsXG4gICAgICBfbGluZSxcbiAgICAgIF90YWcgICAgID0gc3RhdGUudGFnLFxuICAgICAgX3Jlc3VsdCxcbiAgICAgIF9hbmNob3IgID0gc3RhdGUuYW5jaG9yLFxuICAgICAgZm9sbG93aW5nLFxuICAgICAgdGVybWluYXRvcixcbiAgICAgIGlzUGFpcixcbiAgICAgIGlzRXhwbGljaXRQYWlyLFxuICAgICAgaXNNYXBwaW5nLFxuICAgICAgb3ZlcnJpZGFibGVLZXlzID0ge30sXG4gICAgICBrZXlOb2RlLFxuICAgICAga2V5VGFnLFxuICAgICAgdmFsdWVOb2RlLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggPT09IDB4NUIvKiBbICovKSB7XG4gICAgdGVybWluYXRvciA9IDB4NUQ7LyogXSAqL1xuICAgIGlzTWFwcGluZyA9IGZhbHNlO1xuICAgIF9yZXN1bHQgPSBbXTtcbiAgfSBlbHNlIGlmIChjaCA9PT0gMHg3Qi8qIHsgKi8pIHtcbiAgICB0ZXJtaW5hdG9yID0gMHg3RDsvKiB9ICovXG4gICAgaXNNYXBwaW5nID0gdHJ1ZTtcbiAgICBfcmVzdWx0ID0ge307XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gX3Jlc3VsdDtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoY2ggPT09IHRlcm1pbmF0b3IpIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjtcbiAgICAgIHN0YXRlLmtpbmQgPSBpc01hcHBpbmcgPyAnbWFwcGluZycgOiAnc2VxdWVuY2UnO1xuICAgICAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIXJlYWROZXh0KSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbWlzc2VkIGNvbW1hIGJldHdlZW4gZmxvdyBjb2xsZWN0aW9uIGVudHJpZXMnKTtcbiAgICB9XG5cbiAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDtcbiAgICBpc1BhaXIgPSBpc0V4cGxpY2l0UGFpciA9IGZhbHNlO1xuXG4gICAgaWYgKGNoID09PSAweDNGLyogPyAqLykge1xuICAgICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpO1xuXG4gICAgICBpZiAoaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHtcbiAgICAgICAgaXNQYWlyID0gaXNFeHBsaWNpdFBhaXIgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfbGluZSA9IHN0YXRlLmxpbmU7XG4gICAgY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfRkxPV19JTiwgZmFsc2UsIHRydWUpO1xuICAgIGtleVRhZyA9IHN0YXRlLnRhZztcbiAgICBrZXlOb2RlID0gc3RhdGUucmVzdWx0O1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmICgoaXNFeHBsaWNpdFBhaXIgfHwgc3RhdGUubGluZSA9PT0gX2xpbmUpICYmIGNoID09PSAweDNBLyogOiAqLykge1xuICAgICAgaXNQYWlyID0gdHJ1ZTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuICAgICAgY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfRkxPV19JTiwgZmFsc2UsIHRydWUpO1xuICAgICAgdmFsdWVOb2RlID0gc3RhdGUucmVzdWx0O1xuICAgIH1cblxuICAgIGlmIChpc01hcHBpbmcpIHtcbiAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUpO1xuICAgIH0gZWxzZSBpZiAoaXNQYWlyKSB7XG4gICAgICBfcmVzdWx0LnB1c2goc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgbnVsbCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfcmVzdWx0LnB1c2goa2V5Tm9kZSk7XG4gICAgfVxuXG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKGNoID09PSAweDJDLyogLCAqLykge1xuICAgICAgcmVhZE5leHQgPSB0cnVlO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWFkTmV4dCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIGZsb3cgY29sbGVjdGlvbicpO1xufVxuXG5mdW5jdGlvbiByZWFkQmxvY2tTY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIGNhcHR1cmVTdGFydCxcbiAgICAgIGZvbGRpbmcsXG4gICAgICBjaG9tcGluZyAgICAgICA9IENIT01QSU5HX0NMSVAsXG4gICAgICBkaWRSZWFkQ29udGVudCA9IGZhbHNlLFxuICAgICAgZGV0ZWN0ZWRJbmRlbnQgPSBmYWxzZSxcbiAgICAgIHRleHRJbmRlbnQgICAgID0gbm9kZUluZGVudCxcbiAgICAgIGVtcHR5TGluZXMgICAgID0gMCxcbiAgICAgIGF0TW9yZUluZGVudGVkID0gZmFsc2UsXG4gICAgICB0bXAsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCA9PT0gMHg3Qy8qIHwgKi8pIHtcbiAgICBmb2xkaW5nID0gZmFsc2U7XG4gIH0gZWxzZSBpZiAoY2ggPT09IDB4M0UvKiA+ICovKSB7XG4gICAgZm9sZGluZyA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9ICdzY2FsYXInO1xuICBzdGF0ZS5yZXN1bHQgPSAnJztcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoY2ggPT09IDB4MkIvKiArICovIHx8IGNoID09PSAweDJELyogLSAqLykge1xuICAgICAgaWYgKENIT01QSU5HX0NMSVAgPT09IGNob21waW5nKSB7XG4gICAgICAgIGNob21waW5nID0gKGNoID09PSAweDJCLyogKyAqLykgPyBDSE9NUElOR19LRUVQIDogQ0hPTVBJTkdfU1RSSVA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAncmVwZWF0IG9mIGEgY2hvbXBpbmcgbW9kZSBpZGVudGlmaWVyJyk7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKCh0bXAgPSBmcm9tRGVjaW1hbENvZGUoY2gpKSA+PSAwKSB7XG4gICAgICBpZiAodG1wID09PSAwKSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdiYWQgZXhwbGljaXQgaW5kZW50YXRpb24gd2lkdGggb2YgYSBibG9jayBzY2FsYXI7IGl0IGNhbm5vdCBiZSBsZXNzIHRoYW4gb25lJyk7XG4gICAgICB9IGVsc2UgaWYgKCFkZXRlY3RlZEluZGVudCkge1xuICAgICAgICB0ZXh0SW5kZW50ID0gbm9kZUluZGVudCArIHRtcCAtIDE7XG4gICAgICAgIGRldGVjdGVkSW5kZW50ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdyZXBlYXQgb2YgYW4gaW5kZW50YXRpb24gd2lkdGggaWRlbnRpZmllcicpO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICBkbyB7IGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsgfVxuICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpO1xuXG4gICAgaWYgKGNoID09PSAweDIzLyogIyAqLykge1xuICAgICAgZG8geyBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7IH1cbiAgICAgIHdoaWxlICghaXNfRU9MKGNoKSAmJiAoY2ggIT09IDApKTtcbiAgICB9XG4gIH1cblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICByZWFkTGluZUJyZWFrKHN0YXRlKTtcbiAgICBzdGF0ZS5saW5lSW5kZW50ID0gMDtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICB3aGlsZSAoKCFkZXRlY3RlZEluZGVudCB8fCBzdGF0ZS5saW5lSW5kZW50IDwgdGV4dEluZGVudCkgJiZcbiAgICAgICAgICAgKGNoID09PSAweDIwLyogU3BhY2UgKi8pKSB7XG4gICAgICBzdGF0ZS5saW5lSW5kZW50Kys7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKCFkZXRlY3RlZEluZGVudCAmJiBzdGF0ZS5saW5lSW5kZW50ID4gdGV4dEluZGVudCkge1xuICAgICAgdGV4dEluZGVudCA9IHN0YXRlLmxpbmVJbmRlbnQ7XG4gICAgfVxuXG4gICAgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIGVtcHR5TGluZXMrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEVuZCBvZiB0aGUgc2NhbGFyLlxuICAgIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgdGV4dEluZGVudCkge1xuXG4gICAgICAvLyBQZXJmb3JtIHRoZSBjaG9tcGluZy5cbiAgICAgIGlmIChjaG9tcGluZyA9PT0gQ0hPTVBJTkdfS0VFUCkge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZGlkUmVhZENvbnRlbnQgPyAxICsgZW1wdHlMaW5lcyA6IGVtcHR5TGluZXMpO1xuICAgICAgfSBlbHNlIGlmIChjaG9tcGluZyA9PT0gQ0hPTVBJTkdfQ0xJUCkge1xuICAgICAgICBpZiAoZGlkUmVhZENvbnRlbnQpIHsgLy8gaS5lLiBvbmx5IGlmIHRoZSBzY2FsYXIgaXMgbm90IGVtcHR5LlxuICAgICAgICAgIHN0YXRlLnJlc3VsdCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCcmVhayB0aGlzIGB3aGlsZWAgY3ljbGUgYW5kIGdvIHRvIHRoZSBmdW5jaXRvbidzIGVwaWxvZ3VlLlxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gRm9sZGVkIHN0eWxlOiB1c2UgZmFuY3kgcnVsZXMgdG8gaGFuZGxlIGxpbmUgYnJlYWtzLlxuICAgIGlmIChmb2xkaW5nKSB7XG5cbiAgICAgIC8vIExpbmVzIHN0YXJ0aW5nIHdpdGggd2hpdGUgc3BhY2UgY2hhcmFjdGVycyAobW9yZS1pbmRlbnRlZCBsaW5lcykgYXJlIG5vdCBmb2xkZWQuXG4gICAgICBpZiAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgICAgIGF0TW9yZUluZGVudGVkID0gdHJ1ZTtcbiAgICAgICAgLy8gZXhjZXB0IGZvciB0aGUgZmlyc3QgY29udGVudCBsaW5lIChjZi4gRXhhbXBsZSA4LjEpXG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBkaWRSZWFkQ29udGVudCA/IDEgKyBlbXB0eUxpbmVzIDogZW1wdHlMaW5lcyk7XG5cbiAgICAgIC8vIEVuZCBvZiBtb3JlLWluZGVudGVkIGJsb2NrLlxuICAgICAgfSBlbHNlIGlmIChhdE1vcmVJbmRlbnRlZCkge1xuICAgICAgICBhdE1vcmVJbmRlbnRlZCA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyArIDEpO1xuXG4gICAgICAvLyBKdXN0IG9uZSBsaW5lIGJyZWFrIC0gcGVyY2VpdmUgYXMgdGhlIHNhbWUgbGluZS5cbiAgICAgIH0gZWxzZSBpZiAoZW1wdHlMaW5lcyA9PT0gMCkge1xuICAgICAgICBpZiAoZGlkUmVhZENvbnRlbnQpIHsgLy8gaS5lLiBvbmx5IGlmIHdlIGhhdmUgYWxyZWFkeSByZWFkIHNvbWUgc2NhbGFyIGNvbnRlbnQuXG4gICAgICAgICAgc3RhdGUucmVzdWx0ICs9ICcgJztcbiAgICAgICAgfVxuXG4gICAgICAvLyBTZXZlcmFsIGxpbmUgYnJlYWtzIC0gcGVyY2VpdmUgYXMgZGlmZmVyZW50IGxpbmVzLlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMpO1xuICAgICAgfVxuXG4gICAgLy8gTGl0ZXJhbCBzdHlsZToganVzdCBhZGQgZXhhY3QgbnVtYmVyIG9mIGxpbmUgYnJlYWtzIGJldHdlZW4gY29udGVudCBsaW5lcy5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gS2VlcCBhbGwgbGluZSBicmVha3MgZXhjZXB0IHRoZSBoZWFkZXIgbGluZSBicmVhay5cbiAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBkaWRSZWFkQ29udGVudCA/IDEgKyBlbXB0eUxpbmVzIDogZW1wdHlMaW5lcyk7XG4gICAgfVxuXG4gICAgZGlkUmVhZENvbnRlbnQgPSB0cnVlO1xuICAgIGRldGVjdGVkSW5kZW50ID0gdHJ1ZTtcbiAgICBlbXB0eUxpbmVzID0gMDtcbiAgICBjYXB0dXJlU3RhcnQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIHdoaWxlICghaXNfRU9MKGNoKSAmJiAoY2ggIT09IDApKSB7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIGZhbHNlKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZWFkQmxvY2tTZXF1ZW5jZShzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgX2xpbmUsXG4gICAgICBfdGFnICAgICAgPSBzdGF0ZS50YWcsXG4gICAgICBfYW5jaG9yICAgPSBzdGF0ZS5hbmNob3IsXG4gICAgICBfcmVzdWx0ICAgPSBbXSxcbiAgICAgIGZvbGxvd2luZyxcbiAgICAgIGRldGVjdGVkICA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gX3Jlc3VsdDtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG5cbiAgICBpZiAoY2ggIT09IDB4MkQvKiAtICovKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICBpZiAoIWlzX1dTX09SX0VPTChmb2xsb3dpbmcpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBkZXRlY3RlZCA9IHRydWU7XG4gICAgc3RhdGUucG9zaXRpb24rKztcblxuICAgIGlmIChza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSkpIHtcbiAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50IDw9IG5vZGVJbmRlbnQpIHtcbiAgICAgICAgX3Jlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfbGluZSA9IHN0YXRlLmxpbmU7XG4gICAgY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfQkxPQ0tfSU4sIGZhbHNlLCB0cnVlKTtcbiAgICBfcmVzdWx0LnB1c2goc3RhdGUucmVzdWx0KTtcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKChzdGF0ZS5saW5lID09PSBfbGluZSB8fCBzdGF0ZS5saW5lSW5kZW50ID4gbm9kZUluZGVudCkgJiYgKGNoICE9PSAwKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2JhZCBpbmRlbnRhdGlvbiBvZiBhIHNlcXVlbmNlIGVudHJ5Jyk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgbm9kZUluZGVudCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRldGVjdGVkKSB7XG4gICAgc3RhdGUudGFnID0gX3RhZztcbiAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgIHN0YXRlLmtpbmQgPSAnc2VxdWVuY2UnO1xuICAgIHN0YXRlLnJlc3VsdCA9IF9yZXN1bHQ7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZWFkQmxvY2tNYXBwaW5nKHN0YXRlLCBub2RlSW5kZW50LCBmbG93SW5kZW50KSB7XG4gIHZhciBmb2xsb3dpbmcsXG4gICAgICBhbGxvd0NvbXBhY3QsXG4gICAgICBfbGluZSxcbiAgICAgIF9wb3MsXG4gICAgICBfdGFnICAgICAgICAgID0gc3RhdGUudGFnLFxuICAgICAgX2FuY2hvciAgICAgICA9IHN0YXRlLmFuY2hvcixcbiAgICAgIF9yZXN1bHQgICAgICAgPSB7fSxcbiAgICAgIG92ZXJyaWRhYmxlS2V5cyA9IHt9LFxuICAgICAga2V5VGFnICAgICAgICA9IG51bGwsXG4gICAgICBrZXlOb2RlICAgICAgID0gbnVsbCxcbiAgICAgIHZhbHVlTm9kZSAgICAgPSBudWxsLFxuICAgICAgYXRFeHBsaWNpdEtleSA9IGZhbHNlLFxuICAgICAgZGV0ZWN0ZWQgICAgICA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gX3Jlc3VsdDtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpO1xuICAgIF9saW5lID0gc3RhdGUubGluZTsgLy8gU2F2ZSB0aGUgY3VycmVudCBsaW5lLlxuICAgIF9wb3MgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIC8vXG4gICAgLy8gRXhwbGljaXQgbm90YXRpb24gY2FzZS4gVGhlcmUgYXJlIHR3byBzZXBhcmF0ZSBibG9ja3M6XG4gICAgLy8gZmlyc3QgZm9yIHRoZSBrZXkgKGRlbm90ZWQgYnkgXCI/XCIpIGFuZCBzZWNvbmQgZm9yIHRoZSB2YWx1ZSAoZGVub3RlZCBieSBcIjpcIilcbiAgICAvL1xuICAgIGlmICgoY2ggPT09IDB4M0YvKiA/ICovIHx8IGNoID09PSAweDNBLyogOiAqLykgJiYgaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHtcblxuICAgICAgaWYgKGNoID09PSAweDNGLyogPyAqLykge1xuICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTtcbiAgICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRldGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgYXRFeHBsaWNpdEtleSA9IHRydWU7XG4gICAgICAgIGFsbG93Q29tcGFjdCA9IHRydWU7XG5cbiAgICAgIH0gZWxzZSBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAvLyBpLmUuIDB4M0EvKiA6ICovID09PSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGV4cGxpY2l0IGtleS5cbiAgICAgICAgYXRFeHBsaWNpdEtleSA9IGZhbHNlO1xuICAgICAgICBhbGxvd0NvbXBhY3QgPSB0cnVlO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaW5jb21wbGV0ZSBleHBsaWNpdCBtYXBwaW5nIHBhaXI7IGEga2V5IG5vZGUgaXMgbWlzc2VkOyBvciBmb2xsb3dlZCBieSBhIG5vbi10YWJ1bGF0ZWQgZW1wdHkgbGluZScpO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5wb3NpdGlvbiArPSAxO1xuICAgICAgY2ggPSBmb2xsb3dpbmc7XG5cbiAgICAvL1xuICAgIC8vIEltcGxpY2l0IG5vdGF0aW9uIGNhc2UuIEZsb3ctc3R5bGUgbm9kZSBhcyB0aGUga2V5IGZpcnN0LCB0aGVuIFwiOlwiLCBhbmQgdGhlIHZhbHVlLlxuICAgIC8vXG4gICAgfSBlbHNlIGlmIChjb21wb3NlTm9kZShzdGF0ZSwgZmxvd0luZGVudCwgQ09OVEVYVF9GTE9XX09VVCwgZmFsc2UsIHRydWUpKSB7XG5cbiAgICAgIGlmIChzdGF0ZS5saW5lID09PSBfbGluZSkge1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2ggPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICAgICAgaWYgKCFpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYSB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBleHBlY3RlZCBhZnRlciB0aGUga2V5LXZhbHVlIHNlcGFyYXRvciB3aXRoaW4gYSBibG9jayBtYXBwaW5nJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGF0RXhwbGljaXRLZXkpIHtcbiAgICAgICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTtcbiAgICAgICAgICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRldGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICBhdEV4cGxpY2l0S2V5ID0gZmFsc2U7XG4gICAgICAgICAgYWxsb3dDb21wYWN0ID0gZmFsc2U7XG4gICAgICAgICAga2V5VGFnID0gc3RhdGUudGFnO1xuICAgICAgICAgIGtleU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG5cbiAgICAgICAgfSBlbHNlIGlmIChkZXRlY3RlZCkge1xuICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdjYW4gbm90IHJlYWQgYW4gaW1wbGljaXQgbWFwcGluZyBwYWlyOyBhIGNvbG9uIGlzIG1pc3NlZCcpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGUudGFnID0gX3RhZztcbiAgICAgICAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBLZWVwIHRoZSByZXN1bHQgb2YgYGNvbXBvc2VOb2RlYC5cbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2UgaWYgKGRldGVjdGVkKSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdjYW4gbm90IHJlYWQgYSBibG9jayBtYXBwaW5nIGVudHJ5OyBhIG11bHRpbGluZSBrZXkgbWF5IG5vdCBiZSBhbiBpbXBsaWNpdCBrZXknKTtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUudGFnID0gX3RhZztcbiAgICAgICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjtcbiAgICAgICAgcmV0dXJuIHRydWU7IC8vIEtlZXAgdGhlIHJlc3VsdCBvZiBgY29tcG9zZU5vZGVgLlxuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrOyAvLyBSZWFkaW5nIGlzIGRvbmUuIEdvIHRvIHRoZSBlcGlsb2d1ZS5cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIENvbW1vbiByZWFkaW5nIGNvZGUgZm9yIGJvdGggZXhwbGljaXQgYW5kIGltcGxpY2l0IG5vdGF0aW9ucy5cbiAgICAvL1xuICAgIGlmIChzdGF0ZS5saW5lID09PSBfbGluZSB8fCBzdGF0ZS5saW5lSW5kZW50ID4gbm9kZUluZGVudCkge1xuICAgICAgaWYgKGNvbXBvc2VOb2RlKHN0YXRlLCBub2RlSW5kZW50LCBDT05URVhUX0JMT0NLX09VVCwgdHJ1ZSwgYWxsb3dDb21wYWN0KSkge1xuICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAgIGtleU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWVOb2RlID0gc3RhdGUucmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghYXRFeHBsaWNpdEtleSkge1xuICAgICAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlLCBfbGluZSwgX3Bvcyk7XG4gICAgICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gbm9kZUluZGVudCAmJiAoY2ggIT09IDApKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYmFkIGluZGVudGF0aW9uIG9mIGEgbWFwcGluZyBlbnRyeScpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IG5vZGVJbmRlbnQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vXG4gIC8vIEVwaWxvZ3VlLlxuICAvL1xuXG4gIC8vIFNwZWNpYWwgY2FzZTogbGFzdCBtYXBwaW5nJ3Mgbm9kZSBjb250YWlucyBvbmx5IHRoZSBrZXkgaW4gZXhwbGljaXQgbm90YXRpb24uXG4gIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIG51bGwpO1xuICB9XG5cbiAgLy8gRXhwb3NlIHRoZSByZXN1bHRpbmcgbWFwcGluZy5cbiAgaWYgKGRldGVjdGVkKSB7XG4gICAgc3RhdGUudGFnID0gX3RhZztcbiAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgIHN0YXRlLmtpbmQgPSAnbWFwcGluZyc7XG4gICAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBkZXRlY3RlZDtcbn1cblxuZnVuY3Rpb24gcmVhZFRhZ1Byb3BlcnR5KHN0YXRlKSB7XG4gIHZhciBfcG9zaXRpb24sXG4gICAgICBpc1ZlcmJhdGltID0gZmFsc2UsXG4gICAgICBpc05hbWVkICAgID0gZmFsc2UsXG4gICAgICB0YWdIYW5kbGUsXG4gICAgICB0YWdOYW1lLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggIT09IDB4MjEvKiAhICovKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbCkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdkdXBsaWNhdGlvbiBvZiBhIHRhZyBwcm9wZXJ0eScpO1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCA9PT0gMHgzQy8qIDwgKi8pIHtcbiAgICBpc1ZlcmJhdGltID0gdHJ1ZTtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgfSBlbHNlIGlmIChjaCA9PT0gMHgyMS8qICEgKi8pIHtcbiAgICBpc05hbWVkID0gdHJ1ZTtcbiAgICB0YWdIYW5kbGUgPSAnISEnO1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICB9IGVsc2Uge1xuICAgIHRhZ0hhbmRsZSA9ICchJztcbiAgfVxuXG4gIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIGlmIChpc1ZlcmJhdGltKSB7XG4gICAgZG8geyBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7IH1cbiAgICB3aGlsZSAoY2ggIT09IDAgJiYgY2ggIT09IDB4M0UvKiA+ICovKTtcblxuICAgIGlmIChzdGF0ZS5wb3NpdGlvbiA8IHN0YXRlLmxlbmd0aCkge1xuICAgICAgdGFnTmFtZSA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSB2ZXJiYXRpbSB0YWcnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpKSB7XG5cbiAgICAgIGlmIChjaCA9PT0gMHgyMS8qICEgKi8pIHtcbiAgICAgICAgaWYgKCFpc05hbWVkKSB7XG4gICAgICAgICAgdGFnSGFuZGxlID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uIC0gMSwgc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgICAgICAgIGlmICghUEFUVEVSTl9UQUdfSEFORExFLnRlc3QodGFnSGFuZGxlKSkge1xuICAgICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ25hbWVkIHRhZyBoYW5kbGUgY2Fubm90IGNvbnRhaW4gc3VjaCBjaGFyYWN0ZXJzJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaXNOYW1lZCA9IHRydWU7XG4gICAgICAgICAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb24gKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd0YWcgc3VmZml4IGNhbm5vdCBjb250YWluIGV4Y2xhbWF0aW9uIG1hcmtzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIHRhZ05hbWUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmIChQQVRURVJOX0ZMT1dfSU5ESUNBVE9SUy50ZXN0KHRhZ05hbWUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGFnIHN1ZmZpeCBjYW5ub3QgY29udGFpbiBmbG93IGluZGljYXRvciBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRhZ05hbWUgJiYgIVBBVFRFUk5fVEFHX1VSSS50ZXN0KHRhZ05hbWUpKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RhZyBuYW1lIGNhbm5vdCBjb250YWluIHN1Y2ggY2hhcmFjdGVyczogJyArIHRhZ05hbWUpO1xuICB9XG5cbiAgaWYgKGlzVmVyYmF0aW0pIHtcbiAgICBzdGF0ZS50YWcgPSB0YWdOYW1lO1xuXG4gIH0gZWxzZSBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUudGFnTWFwLCB0YWdIYW5kbGUpKSB7XG4gICAgc3RhdGUudGFnID0gc3RhdGUudGFnTWFwW3RhZ0hhbmRsZV0gKyB0YWdOYW1lO1xuXG4gIH0gZWxzZSBpZiAodGFnSGFuZGxlID09PSAnIScpIHtcbiAgICBzdGF0ZS50YWcgPSAnIScgKyB0YWdOYW1lO1xuXG4gIH0gZWxzZSBpZiAodGFnSGFuZGxlID09PSAnISEnKSB7XG4gICAgc3RhdGUudGFnID0gJ3RhZzp5YW1sLm9yZywyMDAyOicgKyB0YWdOYW1lO1xuXG4gIH0gZWxzZSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZGVjbGFyZWQgdGFnIGhhbmRsZSBcIicgKyB0YWdIYW5kbGUgKyAnXCInKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZWFkQW5jaG9yUHJvcGVydHkoc3RhdGUpIHtcbiAgdmFyIF9wb3NpdGlvbixcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDI2LyogJiAqLykgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZHVwbGljYXRpb24gb2YgYW4gYW5jaG9yIHByb3BlcnR5Jyk7XG4gIH1cblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSAmJiAhaXNfRkxPV19JTkRJQ0FUT1IoY2gpKSB7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICB9XG5cbiAgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBfcG9zaXRpb24pIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbmFtZSBvZiBhbiBhbmNob3Igbm9kZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNoYXJhY3RlcicpO1xuICB9XG5cbiAgc3RhdGUuYW5jaG9yID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZWFkQWxpYXMoc3RhdGUpIHtcbiAgdmFyIF9wb3NpdGlvbiwgYWxpYXMsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyQS8qICogKi8pIHJldHVybiBmYWxzZTtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSAmJiAhaXNfRkxPV19JTkRJQ0FUT1IoY2gpKSB7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICB9XG5cbiAgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBfcG9zaXRpb24pIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbmFtZSBvZiBhbiBhbGlhcyBub2RlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyJyk7XG4gIH1cblxuICBhbGlhcyA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmICghX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUuYW5jaG9yTWFwLCBhbGlhcykpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5pZGVudGlmaWVkIGFsaWFzIFwiJyArIGFsaWFzICsgJ1wiJyk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bHQgPSBzdGF0ZS5hbmNob3JNYXBbYWxpYXNdO1xuICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb21wb3NlTm9kZShzdGF0ZSwgcGFyZW50SW5kZW50LCBub2RlQ29udGV4dCwgYWxsb3dUb1NlZWssIGFsbG93Q29tcGFjdCkge1xuICB2YXIgYWxsb3dCbG9ja1N0eWxlcyxcbiAgICAgIGFsbG93QmxvY2tTY2FsYXJzLFxuICAgICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zLFxuICAgICAgaW5kZW50U3RhdHVzID0gMSwgLy8gMTogdGhpcz5wYXJlbnQsIDA6IHRoaXM9cGFyZW50LCAtMTogdGhpczxwYXJlbnRcbiAgICAgIGF0TmV3TGluZSAgPSBmYWxzZSxcbiAgICAgIGhhc0NvbnRlbnQgPSBmYWxzZSxcbiAgICAgIHR5cGVJbmRleCxcbiAgICAgIHR5cGVRdWFudGl0eSxcbiAgICAgIHR5cGUsXG4gICAgICBmbG93SW5kZW50LFxuICAgICAgYmxvY2tJbmRlbnQ7XG5cbiAgaWYgKHN0YXRlLmxpc3RlbmVyICE9PSBudWxsKSB7XG4gICAgc3RhdGUubGlzdGVuZXIoJ29wZW4nLCBzdGF0ZSk7XG4gIH1cblxuICBzdGF0ZS50YWcgICAgPSBudWxsO1xuICBzdGF0ZS5hbmNob3IgPSBudWxsO1xuICBzdGF0ZS5raW5kICAgPSBudWxsO1xuICBzdGF0ZS5yZXN1bHQgPSBudWxsO1xuXG4gIGFsbG93QmxvY2tTdHlsZXMgPSBhbGxvd0Jsb2NrU2NhbGFycyA9IGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9XG4gICAgQ09OVEVYVF9CTE9DS19PVVQgPT09IG5vZGVDb250ZXh0IHx8XG4gICAgQ09OVEVYVF9CTE9DS19JTiAgPT09IG5vZGVDb250ZXh0O1xuXG4gIGlmIChhbGxvd1RvU2Vlaykge1xuICAgIGlmIChza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSkpIHtcbiAgICAgIGF0TmV3TGluZSA9IHRydWU7XG5cbiAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gcGFyZW50SW5kZW50KSB7XG4gICAgICAgIGluZGVudFN0YXR1cyA9IDE7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IHBhcmVudEluZGVudCkge1xuICAgICAgICBpbmRlbnRTdGF0dXMgPSAwO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgcGFyZW50SW5kZW50KSB7XG4gICAgICAgIGluZGVudFN0YXR1cyA9IC0xO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChpbmRlbnRTdGF0dXMgPT09IDEpIHtcbiAgICB3aGlsZSAocmVhZFRhZ1Byb3BlcnR5KHN0YXRlKSB8fCByZWFkQW5jaG9yUHJvcGVydHkoc3RhdGUpKSB7XG4gICAgICBpZiAoc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpKSB7XG4gICAgICAgIGF0TmV3TGluZSA9IHRydWU7XG4gICAgICAgIGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IGFsbG93QmxvY2tTdHlsZXM7XG5cbiAgICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAxO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IHBhcmVudEluZGVudCkge1xuICAgICAgICAgIGluZGVudFN0YXR1cyA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IHBhcmVudEluZGVudCkge1xuICAgICAgICAgIGluZGVudFN0YXR1cyA9IC0xO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoYWxsb3dCbG9ja0NvbGxlY3Rpb25zKSB7XG4gICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zID0gYXROZXdMaW5lIHx8IGFsbG93Q29tcGFjdDtcbiAgfVxuXG4gIGlmIChpbmRlbnRTdGF0dXMgPT09IDEgfHwgQ09OVEVYVF9CTE9DS19PVVQgPT09IG5vZGVDb250ZXh0KSB7XG4gICAgaWYgKENPTlRFWFRfRkxPV19JTiA9PT0gbm9kZUNvbnRleHQgfHwgQ09OVEVYVF9GTE9XX09VVCA9PT0gbm9kZUNvbnRleHQpIHtcbiAgICAgIGZsb3dJbmRlbnQgPSBwYXJlbnRJbmRlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZsb3dJbmRlbnQgPSBwYXJlbnRJbmRlbnQgKyAxO1xuICAgIH1cblxuICAgIGJsb2NrSW5kZW50ID0gc3RhdGUucG9zaXRpb24gLSBzdGF0ZS5saW5lU3RhcnQ7XG5cbiAgICBpZiAoaW5kZW50U3RhdHVzID09PSAxKSB7XG4gICAgICBpZiAoYWxsb3dCbG9ja0NvbGxlY3Rpb25zICYmXG4gICAgICAgICAgKHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBibG9ja0luZGVudCkgfHxcbiAgICAgICAgICAgcmVhZEJsb2NrTWFwcGluZyhzdGF0ZSwgYmxvY2tJbmRlbnQsIGZsb3dJbmRlbnQpKSB8fFxuICAgICAgICAgIHJlYWRGbG93Q29sbGVjdGlvbihzdGF0ZSwgZmxvd0luZGVudCkpIHtcbiAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKGFsbG93QmxvY2tTY2FsYXJzICYmIHJlYWRCbG9ja1NjYWxhcihzdGF0ZSwgZmxvd0luZGVudCkpIHx8XG4gICAgICAgICAgICByZWFkU2luZ2xlUXVvdGVkU2NhbGFyKHN0YXRlLCBmbG93SW5kZW50KSB8fFxuICAgICAgICAgICAgcmVhZERvdWJsZVF1b3RlZFNjYWxhcihzdGF0ZSwgZmxvd0luZGVudCkpIHtcbiAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlYWRBbGlhcyhzdGF0ZSkpIHtcbiAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChzdGF0ZS50YWcgIT09IG51bGwgfHwgc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYWxpYXMgbm9kZSBzaG91bGQgbm90IGhhdmUgYW55IHByb3BlcnRpZXMnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWFkUGxhaW5TY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQsIENPTlRFWFRfRkxPV19JTiA9PT0gbm9kZUNvbnRleHQpKSB7XG4gICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoc3RhdGUudGFnID09PSBudWxsKSB7XG4gICAgICAgICAgICBzdGF0ZS50YWcgPSAnPyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgICAgICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gc3RhdGUucmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpbmRlbnRTdGF0dXMgPT09IDApIHtcbiAgICAgIC8vIFNwZWNpYWwgY2FzZTogYmxvY2sgc2VxdWVuY2VzIGFyZSBhbGxvd2VkIHRvIGhhdmUgc2FtZSBpbmRlbnRhdGlvbiBsZXZlbCBhcyB0aGUgcGFyZW50LlxuICAgICAgLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyNzk5Nzg0XG4gICAgICBoYXNDb250ZW50ID0gYWxsb3dCbG9ja0NvbGxlY3Rpb25zICYmIHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBibG9ja0luZGVudCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbCAmJiBzdGF0ZS50YWcgIT09ICchJykge1xuICAgIGlmIChzdGF0ZS50YWcgPT09ICc/Jykge1xuICAgICAgLy8gSW1wbGljaXQgcmVzb2x2aW5nIGlzIG5vdCBhbGxvd2VkIGZvciBub24tc2NhbGFyIHR5cGVzLCBhbmQgJz8nXG4gICAgICAvLyBub24tc3BlY2lmaWMgdGFnIGlzIG9ubHkgYXV0b21hdGljYWxseSBhc3NpZ25lZCB0byBwbGFpbiBzY2FsYXJzLlxuICAgICAgLy9cbiAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byBjaGVjayBraW5kIGNvbmZvcm1pdHkgaW4gY2FzZSB1c2VyIGV4cGxpY2l0bHkgYXNzaWducyAnPydcbiAgICAgIC8vIHRhZywgZm9yIGV4YW1wbGUgbGlrZSB0aGlzOiBcIiE8Pz4gWzBdXCJcbiAgICAgIC8vXG4gICAgICBpZiAoc3RhdGUucmVzdWx0ICE9PSBudWxsICYmIHN0YXRlLmtpbmQgIT09ICdzY2FsYXInKSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmFjY2VwdGFibGUgbm9kZSBraW5kIGZvciAhPD8+IHRhZzsgaXQgc2hvdWxkIGJlIFwic2NhbGFyXCIsIG5vdCBcIicgKyBzdGF0ZS5raW5kICsgJ1wiJyk7XG4gICAgICB9XG5cbiAgICAgIGZvciAodHlwZUluZGV4ID0gMCwgdHlwZVF1YW50aXR5ID0gc3RhdGUuaW1wbGljaXRUeXBlcy5sZW5ndGg7IHR5cGVJbmRleCA8IHR5cGVRdWFudGl0eTsgdHlwZUluZGV4ICs9IDEpIHtcbiAgICAgICAgdHlwZSA9IHN0YXRlLmltcGxpY2l0VHlwZXNbdHlwZUluZGV4XTtcblxuICAgICAgICBpZiAodHlwZS5yZXNvbHZlKHN0YXRlLnJlc3VsdCkpIHsgLy8gYHN0YXRlLnJlc3VsdGAgdXBkYXRlZCBpbiByZXNvbHZlciBpZiBtYXRjaGVkXG4gICAgICAgICAgc3RhdGUucmVzdWx0ID0gdHlwZS5jb25zdHJ1Y3Qoc3RhdGUucmVzdWx0KTtcbiAgICAgICAgICBzdGF0ZS50YWcgPSB0eXBlLnRhZztcbiAgICAgICAgICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IHN0YXRlLnJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXRlLnR5cGVNYXBbc3RhdGUua2luZCB8fCAnZmFsbGJhY2snXSwgc3RhdGUudGFnKSkge1xuICAgICAgdHlwZSA9IHN0YXRlLnR5cGVNYXBbc3RhdGUua2luZCB8fCAnZmFsbGJhY2snXVtzdGF0ZS50YWddO1xuXG4gICAgICBpZiAoc3RhdGUucmVzdWx0ICE9PSBudWxsICYmIHR5cGUua2luZCAhPT0gc3RhdGUua2luZCkge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5hY2NlcHRhYmxlIG5vZGUga2luZCBmb3IgITwnICsgc3RhdGUudGFnICsgJz4gdGFnOyBpdCBzaG91bGQgYmUgXCInICsgdHlwZS5raW5kICsgJ1wiLCBub3QgXCInICsgc3RhdGUua2luZCArICdcIicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXR5cGUucmVzb2x2ZShzdGF0ZS5yZXN1bHQpKSB7IC8vIGBzdGF0ZS5yZXN1bHRgIHVwZGF0ZWQgaW4gcmVzb2x2ZXIgaWYgbWF0Y2hlZFxuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnY2Fubm90IHJlc29sdmUgYSBub2RlIHdpdGggITwnICsgc3RhdGUudGFnICsgJz4gZXhwbGljaXQgdGFnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgPSB0eXBlLmNvbnN0cnVjdChzdGF0ZS5yZXN1bHQpO1xuICAgICAgICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3Vua25vd24gdGFnICE8JyArIHN0YXRlLnRhZyArICc+Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLmxpc3RlbmVyICE9PSBudWxsKSB7XG4gICAgc3RhdGUubGlzdGVuZXIoJ2Nsb3NlJywgc3RhdGUpO1xuICB9XG4gIHJldHVybiBzdGF0ZS50YWcgIT09IG51bGwgfHwgIHN0YXRlLmFuY2hvciAhPT0gbnVsbCB8fCBoYXNDb250ZW50O1xufVxuXG5mdW5jdGlvbiByZWFkRG9jdW1lbnQoc3RhdGUpIHtcbiAgdmFyIGRvY3VtZW50U3RhcnQgPSBzdGF0ZS5wb3NpdGlvbixcbiAgICAgIF9wb3NpdGlvbixcbiAgICAgIGRpcmVjdGl2ZU5hbWUsXG4gICAgICBkaXJlY3RpdmVBcmdzLFxuICAgICAgaGFzRGlyZWN0aXZlcyA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgc3RhdGUudmVyc2lvbiA9IG51bGw7XG4gIHN0YXRlLmNoZWNrTGluZUJyZWFrcyA9IHN0YXRlLmxlZ2FjeTtcbiAgc3RhdGUudGFnTWFwID0ge307XG4gIHN0YXRlLmFuY2hvck1hcCA9IHt9O1xuXG4gIHdoaWxlICgoY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSkgIT09IDApIHtcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiAwIHx8IGNoICE9PSAweDI1LyogJSAqLykge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaGFzRGlyZWN0aXZlcyA9IHRydWU7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgZGlyZWN0aXZlTmFtZSA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuICAgIGRpcmVjdGl2ZUFyZ3MgPSBbXTtcblxuICAgIGlmIChkaXJlY3RpdmVOYW1lLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdkaXJlY3RpdmUgbmFtZSBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gb25lIGNoYXJhY3RlciBpbiBsZW5ndGgnKTtcbiAgICB9XG5cbiAgICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ggPT09IDB4MjMvKiAjICovKSB7XG4gICAgICAgIGRvIHsgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOyB9XG4gICAgICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfRU9MKGNoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNfRU9MKGNoKSkgYnJlYWs7XG5cbiAgICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkpIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICBkaXJlY3RpdmVBcmdzLnB1c2goc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbikpO1xuICAgIH1cblxuICAgIGlmIChjaCAhPT0gMCkgcmVhZExpbmVCcmVhayhzdGF0ZSk7XG5cbiAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoZGlyZWN0aXZlSGFuZGxlcnMsIGRpcmVjdGl2ZU5hbWUpKSB7XG4gICAgICBkaXJlY3RpdmVIYW5kbGVyc1tkaXJlY3RpdmVOYW1lXShzdGF0ZSwgZGlyZWN0aXZlTmFtZSwgZGlyZWN0aXZlQXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93V2FybmluZyhzdGF0ZSwgJ3Vua25vd24gZG9jdW1lbnQgZGlyZWN0aXZlIFwiJyArIGRpcmVjdGl2ZU5hbWUgKyAnXCInKTtcbiAgICB9XG4gIH1cblxuICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IDAgJiZcbiAgICAgIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pICAgICA9PT0gMHgyRC8qIC0gKi8gJiZcbiAgICAgIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKSA9PT0gMHgyRC8qIC0gKi8gJiZcbiAgICAgIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAyKSA9PT0gMHgyRC8qIC0gKi8pIHtcbiAgICBzdGF0ZS5wb3NpdGlvbiArPSAzO1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICB9IGVsc2UgaWYgKGhhc0RpcmVjdGl2ZXMpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZGlyZWN0aXZlcyBlbmQgbWFyayBpcyBleHBlY3RlZCcpO1xuICB9XG5cbiAgY29tcG9zZU5vZGUoc3RhdGUsIHN0YXRlLmxpbmVJbmRlbnQgLSAxLCBDT05URVhUX0JMT0NLX09VVCwgZmFsc2UsIHRydWUpO1xuICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgaWYgKHN0YXRlLmNoZWNrTGluZUJyZWFrcyAmJlxuICAgICAgUEFUVEVSTl9OT05fQVNDSUlfTElORV9CUkVBS1MudGVzdChzdGF0ZS5pbnB1dC5zbGljZShkb2N1bWVudFN0YXJ0LCBzdGF0ZS5wb3NpdGlvbikpKSB7XG4gICAgdGhyb3dXYXJuaW5nKHN0YXRlLCAnbm9uLUFTQ0lJIGxpbmUgYnJlYWtzIGFyZSBpbnRlcnByZXRlZCBhcyBjb250ZW50Jyk7XG4gIH1cblxuICBzdGF0ZS5kb2N1bWVudHMucHVzaChzdGF0ZS5yZXN1bHQpO1xuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHtcblxuICAgIGlmIChzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSA9PT0gMHgyRS8qIC4gKi8pIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uICs9IDM7XG4gICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA8IChzdGF0ZS5sZW5ndGggLSAxKSkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdlbmQgb2YgdGhlIHN0cmVhbSBvciBhIGRvY3VtZW50IHNlcGFyYXRvciBpcyBleHBlY3RlZCcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpIHtcbiAgaW5wdXQgPSBTdHJpbmcoaW5wdXQpO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICBpZiAoaW5wdXQubGVuZ3RoICE9PSAwKSB7XG5cbiAgICAvLyBBZGQgdGFpbGluZyBgXFxuYCBpZiBub3QgZXhpc3RzXG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQoaW5wdXQubGVuZ3RoIC0gMSkgIT09IDB4MEEvKiBMRiAqLyAmJlxuICAgICAgICBpbnB1dC5jaGFyQ29kZUF0KGlucHV0Lmxlbmd0aCAtIDEpICE9PSAweDBELyogQ1IgKi8pIHtcbiAgICAgIGlucHV0ICs9ICdcXG4nO1xuICAgIH1cblxuICAgIC8vIFN0cmlwIEJPTVxuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcbiAgICAgIGlucHV0ID0gaW5wdXQuc2xpY2UoMSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHN0YXRlID0gbmV3IFN0YXRlKGlucHV0LCBvcHRpb25zKTtcblxuICB2YXIgbnVsbHBvcyA9IGlucHV0LmluZGV4T2YoJ1xcMCcpO1xuXG4gIGlmIChudWxscG9zICE9PSAtMSkge1xuICAgIHN0YXRlLnBvc2l0aW9uID0gbnVsbHBvcztcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbnVsbCBieXRlIGlzIG5vdCBhbGxvd2VkIGluIGlucHV0Jyk7XG4gIH1cblxuICAvLyBVc2UgMCBhcyBzdHJpbmcgdGVybWluYXRvci4gVGhhdCBzaWduaWZpY2FudGx5IHNpbXBsaWZpZXMgYm91bmRzIGNoZWNrLlxuICBzdGF0ZS5pbnB1dCArPSAnXFwwJztcblxuICB3aGlsZSAoc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikgPT09IDB4MjAvKiBTcGFjZSAqLykge1xuICAgIHN0YXRlLmxpbmVJbmRlbnQgKz0gMTtcbiAgICBzdGF0ZS5wb3NpdGlvbiArPSAxO1xuICB9XG5cbiAgd2hpbGUgKHN0YXRlLnBvc2l0aW9uIDwgKHN0YXRlLmxlbmd0aCAtIDEpKSB7XG4gICAgcmVhZERvY3VtZW50KHN0YXRlKTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZS5kb2N1bWVudHM7XG59XG5cblxuZnVuY3Rpb24gbG9hZEFsbChpbnB1dCwgaXRlcmF0b3IsIG9wdGlvbnMpIHtcbiAgaWYgKGl0ZXJhdG9yICE9PSBudWxsICYmIHR5cGVvZiBpdGVyYXRvciA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9wdGlvbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgb3B0aW9ucyA9IGl0ZXJhdG9yO1xuICAgIGl0ZXJhdG9yID0gbnVsbDtcbiAgfVxuXG4gIHZhciBkb2N1bWVudHMgPSBsb2FkRG9jdW1lbnRzKGlucHV0LCBvcHRpb25zKTtcblxuICBpZiAodHlwZW9mIGl0ZXJhdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50cztcbiAgfVxuXG4gIGZvciAodmFyIGluZGV4ID0gMCwgbGVuZ3RoID0gZG9jdW1lbnRzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBpdGVyYXRvcihkb2N1bWVudHNbaW5kZXhdKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGxvYWQoaW5wdXQsIG9wdGlvbnMpIHtcbiAgdmFyIGRvY3VtZW50cyA9IGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpO1xuXG4gIGlmIChkb2N1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgLyplc2xpbnQtZGlzYWJsZSBuby11bmRlZmluZWQqL1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gZWxzZSBpZiAoZG9jdW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBkb2N1bWVudHNbMF07XG4gIH1cbiAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ2V4cGVjdGVkIGEgc2luZ2xlIGRvY3VtZW50IGluIHRoZSBzdHJlYW0sIGJ1dCBmb3VuZCBtb3JlJyk7XG59XG5cblxuZnVuY3Rpb24gc2FmZUxvYWRBbGwoaW5wdXQsIGl0ZXJhdG9yLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgaXRlcmF0b3IgPT09ICdvYmplY3QnICYmIGl0ZXJhdG9yICE9PSBudWxsICYmIHR5cGVvZiBvcHRpb25zID09PSAndW5kZWZpbmVkJykge1xuICAgIG9wdGlvbnMgPSBpdGVyYXRvcjtcbiAgICBpdGVyYXRvciA9IG51bGw7XG4gIH1cblxuICByZXR1cm4gbG9hZEFsbChpbnB1dCwgaXRlcmF0b3IsIGNvbW1vbi5leHRlbmQoeyBzY2hlbWE6IERFRkFVTFRfU0FGRV9TQ0hFTUEgfSwgb3B0aW9ucykpO1xufVxuXG5cbmZ1bmN0aW9uIHNhZmVMb2FkKGlucHV0LCBvcHRpb25zKSB7XG4gIHJldHVybiBsb2FkKGlucHV0LCBjb21tb24uZXh0ZW5kKHsgc2NoZW1hOiBERUZBVUxUX1NBRkVfU0NIRU1BIH0sIG9wdGlvbnMpKTtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cy5sb2FkQWxsICAgICA9IGxvYWRBbGw7XG5tb2R1bGUuZXhwb3J0cy5sb2FkICAgICAgICA9IGxvYWQ7XG5tb2R1bGUuZXhwb3J0cy5zYWZlTG9hZEFsbCA9IHNhZmVMb2FkQWxsO1xubW9kdWxlLmV4cG9ydHMuc2FmZUxvYWQgICAgPSBzYWZlTG9hZDtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuXG52YXIgY29tbW9uICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG52YXIgWUFNTEV4Y2VwdGlvbiAgICAgICA9IHJlcXVpcmUoJy4vZXhjZXB0aW9uJyk7XG52YXIgREVGQVVMVF9GVUxMX1NDSEVNQSA9IHJlcXVpcmUoJy4vc2NoZW1hL2RlZmF1bHRfZnVsbCcpO1xudmFyIERFRkFVTFRfU0FGRV9TQ0hFTUEgPSByZXF1aXJlKCcuL3NjaGVtYS9kZWZhdWx0X3NhZmUnKTtcblxudmFyIF90b1N0cmluZyAgICAgICA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIENIQVJfVEFCICAgICAgICAgICAgICAgICAgPSAweDA5OyAvKiBUYWIgKi9cbnZhciBDSEFSX0xJTkVfRkVFRCAgICAgICAgICAgID0gMHgwQTsgLyogTEYgKi9cbnZhciBDSEFSX0NBUlJJQUdFX1JFVFVSTiAgICAgID0gMHgwRDsgLyogQ1IgKi9cbnZhciBDSEFSX1NQQUNFICAgICAgICAgICAgICAgID0gMHgyMDsgLyogU3BhY2UgKi9cbnZhciBDSEFSX0VYQ0xBTUFUSU9OICAgICAgICAgID0gMHgyMTsgLyogISAqL1xudmFyIENIQVJfRE9VQkxFX1FVT1RFICAgICAgICAgPSAweDIyOyAvKiBcIiAqL1xudmFyIENIQVJfU0hBUlAgICAgICAgICAgICAgICAgPSAweDIzOyAvKiAjICovXG52YXIgQ0hBUl9QRVJDRU5UICAgICAgICAgICAgICA9IDB4MjU7IC8qICUgKi9cbnZhciBDSEFSX0FNUEVSU0FORCAgICAgICAgICAgID0gMHgyNjsgLyogJiAqL1xudmFyIENIQVJfU0lOR0xFX1FVT1RFICAgICAgICAgPSAweDI3OyAvKiAnICovXG52YXIgQ0hBUl9BU1RFUklTSyAgICAgICAgICAgICA9IDB4MkE7IC8qICogKi9cbnZhciBDSEFSX0NPTU1BICAgICAgICAgICAgICAgID0gMHgyQzsgLyogLCAqL1xudmFyIENIQVJfTUlOVVMgICAgICAgICAgICAgICAgPSAweDJEOyAvKiAtICovXG52YXIgQ0hBUl9DT0xPTiAgICAgICAgICAgICAgICA9IDB4M0E7IC8qIDogKi9cbnZhciBDSEFSX0VRVUFMUyAgICAgICAgICAgICAgID0gMHgzRDsgLyogPSAqL1xudmFyIENIQVJfR1JFQVRFUl9USEFOICAgICAgICAgPSAweDNFOyAvKiA+ICovXG52YXIgQ0hBUl9RVUVTVElPTiAgICAgICAgICAgICA9IDB4M0Y7IC8qID8gKi9cbnZhciBDSEFSX0NPTU1FUkNJQUxfQVQgICAgICAgID0gMHg0MDsgLyogQCAqL1xudmFyIENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVCAgPSAweDVCOyAvKiBbICovXG52YXIgQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVCA9IDB4NUQ7IC8qIF0gKi9cbnZhciBDSEFSX0dSQVZFX0FDQ0VOVCAgICAgICAgID0gMHg2MDsgLyogYCAqL1xudmFyIENIQVJfTEVGVF9DVVJMWV9CUkFDS0VUICAgPSAweDdCOyAvKiB7ICovXG52YXIgQ0hBUl9WRVJUSUNBTF9MSU5FICAgICAgICA9IDB4N0M7IC8qIHwgKi9cbnZhciBDSEFSX1JJR0hUX0NVUkxZX0JSQUNLRVQgID0gMHg3RDsgLyogfSAqL1xuXG52YXIgRVNDQVBFX1NFUVVFTkNFUyA9IHt9O1xuXG5FU0NBUEVfU0VRVUVOQ0VTWzB4MDBdICAgPSAnXFxcXDAnO1xuRVNDQVBFX1NFUVVFTkNFU1sweDA3XSAgID0gJ1xcXFxhJztcbkVTQ0FQRV9TRVFVRU5DRVNbMHgwOF0gICA9ICdcXFxcYic7XG5FU0NBUEVfU0VRVUVOQ0VTWzB4MDldICAgPSAnXFxcXHQnO1xuRVNDQVBFX1NFUVVFTkNFU1sweDBBXSAgID0gJ1xcXFxuJztcbkVTQ0FQRV9TRVFVRU5DRVNbMHgwQl0gICA9ICdcXFxcdic7XG5FU0NBUEVfU0VRVUVOQ0VTWzB4MENdICAgPSAnXFxcXGYnO1xuRVNDQVBFX1NFUVVFTkNFU1sweDBEXSAgID0gJ1xcXFxyJztcbkVTQ0FQRV9TRVFVRU5DRVNbMHgxQl0gICA9ICdcXFxcZSc7XG5FU0NBUEVfU0VRVUVOQ0VTWzB4MjJdICAgPSAnXFxcXFwiJztcbkVTQ0FQRV9TRVFVRU5DRVNbMHg1Q10gICA9ICdcXFxcXFxcXCc7XG5FU0NBUEVfU0VRVUVOQ0VTWzB4ODVdICAgPSAnXFxcXE4nO1xuRVNDQVBFX1NFUVVFTkNFU1sweEEwXSAgID0gJ1xcXFxfJztcbkVTQ0FQRV9TRVFVRU5DRVNbMHgyMDI4XSA9ICdcXFxcTCc7XG5FU0NBUEVfU0VRVUVOQ0VTWzB4MjAyOV0gPSAnXFxcXFAnO1xuXG52YXIgREVQUkVDQVRFRF9CT09MRUFOU19TWU5UQVggPSBbXG4gICd5JywgJ1knLCAneWVzJywgJ1llcycsICdZRVMnLCAnb24nLCAnT24nLCAnT04nLFxuICAnbicsICdOJywgJ25vJywgJ05vJywgJ05PJywgJ29mZicsICdPZmYnLCAnT0ZGJ1xuXTtcblxuZnVuY3Rpb24gY29tcGlsZVN0eWxlTWFwKHNjaGVtYSwgbWFwKSB7XG4gIHZhciByZXN1bHQsIGtleXMsIGluZGV4LCBsZW5ndGgsIHRhZywgc3R5bGUsIHR5cGU7XG5cbiAgaWYgKG1hcCA9PT0gbnVsbCkgcmV0dXJuIHt9O1xuXG4gIHJlc3VsdCA9IHt9O1xuICBrZXlzID0gT2JqZWN0LmtleXMobWFwKTtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgdGFnID0ga2V5c1tpbmRleF07XG4gICAgc3R5bGUgPSBTdHJpbmcobWFwW3RhZ10pO1xuXG4gICAgaWYgKHRhZy5zbGljZSgwLCAyKSA9PT0gJyEhJykge1xuICAgICAgdGFnID0gJ3RhZzp5YW1sLm9yZywyMDAyOicgKyB0YWcuc2xpY2UoMik7XG4gICAgfVxuICAgIHR5cGUgPSBzY2hlbWEuY29tcGlsZWRUeXBlTWFwWydmYWxsYmFjayddW3RhZ107XG5cbiAgICBpZiAodHlwZSAmJiBfaGFzT3duUHJvcGVydHkuY2FsbCh0eXBlLnN0eWxlQWxpYXNlcywgc3R5bGUpKSB7XG4gICAgICBzdHlsZSA9IHR5cGUuc3R5bGVBbGlhc2VzW3N0eWxlXTtcbiAgICB9XG5cbiAgICByZXN1bHRbdGFnXSA9IHN0eWxlO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZW5jb2RlSGV4KGNoYXJhY3Rlcikge1xuICB2YXIgc3RyaW5nLCBoYW5kbGUsIGxlbmd0aDtcblxuICBzdHJpbmcgPSBjaGFyYWN0ZXIudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG5cbiAgaWYgKGNoYXJhY3RlciA8PSAweEZGKSB7XG4gICAgaGFuZGxlID0gJ3gnO1xuICAgIGxlbmd0aCA9IDI7XG4gIH0gZWxzZSBpZiAoY2hhcmFjdGVyIDw9IDB4RkZGRikge1xuICAgIGhhbmRsZSA9ICd1JztcbiAgICBsZW5ndGggPSA0O1xuICB9IGVsc2UgaWYgKGNoYXJhY3RlciA8PSAweEZGRkZGRkZGKSB7XG4gICAgaGFuZGxlID0gJ1UnO1xuICAgIGxlbmd0aCA9IDg7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ2NvZGUgcG9pbnQgd2l0aGluIGEgc3RyaW5nIG1heSBub3QgYmUgZ3JlYXRlciB0aGFuIDB4RkZGRkZGRkYnKTtcbiAgfVxuXG4gIHJldHVybiAnXFxcXCcgKyBoYW5kbGUgKyBjb21tb24ucmVwZWF0KCcwJywgbGVuZ3RoIC0gc3RyaW5nLmxlbmd0aCkgKyBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIFN0YXRlKG9wdGlvbnMpIHtcbiAgdGhpcy5zY2hlbWEgICAgICAgID0gb3B0aW9uc1snc2NoZW1hJ10gfHwgREVGQVVMVF9GVUxMX1NDSEVNQTtcbiAgdGhpcy5pbmRlbnQgICAgICAgID0gTWF0aC5tYXgoMSwgKG9wdGlvbnNbJ2luZGVudCddIHx8IDIpKTtcbiAgdGhpcy5ub0FycmF5SW5kZW50ID0gb3B0aW9uc1snbm9BcnJheUluZGVudCddIHx8IGZhbHNlO1xuICB0aGlzLnNraXBJbnZhbGlkICAgPSBvcHRpb25zWydza2lwSW52YWxpZCddIHx8IGZhbHNlO1xuICB0aGlzLmZsb3dMZXZlbCAgICAgPSAoY29tbW9uLmlzTm90aGluZyhvcHRpb25zWydmbG93TGV2ZWwnXSkgPyAtMSA6IG9wdGlvbnNbJ2Zsb3dMZXZlbCddKTtcbiAgdGhpcy5zdHlsZU1hcCAgICAgID0gY29tcGlsZVN0eWxlTWFwKHRoaXMuc2NoZW1hLCBvcHRpb25zWydzdHlsZXMnXSB8fCBudWxsKTtcbiAgdGhpcy5zb3J0S2V5cyAgICAgID0gb3B0aW9uc1snc29ydEtleXMnXSB8fCBmYWxzZTtcbiAgdGhpcy5saW5lV2lkdGggICAgID0gb3B0aW9uc1snbGluZVdpZHRoJ10gfHwgODA7XG4gIHRoaXMubm9SZWZzICAgICAgICA9IG9wdGlvbnNbJ25vUmVmcyddIHx8IGZhbHNlO1xuICB0aGlzLm5vQ29tcGF0TW9kZSAgPSBvcHRpb25zWydub0NvbXBhdE1vZGUnXSB8fCBmYWxzZTtcbiAgdGhpcy5jb25kZW5zZUZsb3cgID0gb3B0aW9uc1snY29uZGVuc2VGbG93J10gfHwgZmFsc2U7XG5cbiAgdGhpcy5pbXBsaWNpdFR5cGVzID0gdGhpcy5zY2hlbWEuY29tcGlsZWRJbXBsaWNpdDtcbiAgdGhpcy5leHBsaWNpdFR5cGVzID0gdGhpcy5zY2hlbWEuY29tcGlsZWRFeHBsaWNpdDtcblxuICB0aGlzLnRhZyA9IG51bGw7XG4gIHRoaXMucmVzdWx0ID0gJyc7XG5cbiAgdGhpcy5kdXBsaWNhdGVzID0gW107XG4gIHRoaXMudXNlZER1cGxpY2F0ZXMgPSBudWxsO1xufVxuXG4vLyBJbmRlbnRzIGV2ZXJ5IGxpbmUgaW4gYSBzdHJpbmcuIEVtcHR5IGxpbmVzIChcXG4gb25seSkgYXJlIG5vdCBpbmRlbnRlZC5cbmZ1bmN0aW9uIGluZGVudFN0cmluZyhzdHJpbmcsIHNwYWNlcykge1xuICB2YXIgaW5kID0gY29tbW9uLnJlcGVhdCgnICcsIHNwYWNlcyksXG4gICAgICBwb3NpdGlvbiA9IDAsXG4gICAgICBuZXh0ID0gLTEsXG4gICAgICByZXN1bHQgPSAnJyxcbiAgICAgIGxpbmUsXG4gICAgICBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuXG4gIHdoaWxlIChwb3NpdGlvbiA8IGxlbmd0aCkge1xuICAgIG5leHQgPSBzdHJpbmcuaW5kZXhPZignXFxuJywgcG9zaXRpb24pO1xuICAgIGlmIChuZXh0ID09PSAtMSkge1xuICAgICAgbGluZSA9IHN0cmluZy5zbGljZShwb3NpdGlvbik7XG4gICAgICBwb3NpdGlvbiA9IGxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZSA9IHN0cmluZy5zbGljZShwb3NpdGlvbiwgbmV4dCArIDEpO1xuICAgICAgcG9zaXRpb24gPSBuZXh0ICsgMTtcbiAgICB9XG5cbiAgICBpZiAobGluZS5sZW5ndGggJiYgbGluZSAhPT0gJ1xcbicpIHJlc3VsdCArPSBpbmQ7XG5cbiAgICByZXN1bHQgKz0gbGluZTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTmV4dExpbmUoc3RhdGUsIGxldmVsKSB7XG4gIHJldHVybiAnXFxuJyArIGNvbW1vbi5yZXBlYXQoJyAnLCBzdGF0ZS5pbmRlbnQgKiBsZXZlbCk7XG59XG5cbmZ1bmN0aW9uIHRlc3RJbXBsaWNpdFJlc29sdmluZyhzdGF0ZSwgc3RyKSB7XG4gIHZhciBpbmRleCwgbGVuZ3RoLCB0eXBlO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBzdGF0ZS5pbXBsaWNpdFR5cGVzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICB0eXBlID0gc3RhdGUuaW1wbGljaXRUeXBlc1tpbmRleF07XG5cbiAgICBpZiAodHlwZS5yZXNvbHZlKHN0cikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLy8gWzMzXSBzLXdoaXRlIDo6PSBzLXNwYWNlIHwgcy10YWJcbmZ1bmN0aW9uIGlzV2hpdGVzcGFjZShjKSB7XG4gIHJldHVybiBjID09PSBDSEFSX1NQQUNFIHx8IGMgPT09IENIQVJfVEFCO1xufVxuXG4vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBjYW4gYmUgcHJpbnRlZCB3aXRob3V0IGVzY2FwaW5nLlxuLy8gRnJvbSBZQU1MIDEuMjogXCJhbnkgYWxsb3dlZCBjaGFyYWN0ZXJzIGtub3duIHRvIGJlIG5vbi1wcmludGFibGVcbi8vIHNob3VsZCBhbHNvIGJlIGVzY2FwZWQuIFtIb3dldmVyLF0gVGhpcyBpc25cdTIwMTl0IG1hbmRhdG9yeVwiXG4vLyBEZXJpdmVkIGZyb20gbmItY2hhciAtIFxcdCAtICN4ODUgLSAjeEEwIC0gI3gyMDI4IC0gI3gyMDI5LlxuZnVuY3Rpb24gaXNQcmludGFibGUoYykge1xuICByZXR1cm4gICgweDAwMDIwIDw9IGMgJiYgYyA8PSAweDAwMDA3RSlcbiAgICAgIHx8ICgoMHgwMDBBMSA8PSBjICYmIGMgPD0gMHgwMEQ3RkYpICYmIGMgIT09IDB4MjAyOCAmJiBjICE9PSAweDIwMjkpXG4gICAgICB8fCAoKDB4MEUwMDAgPD0gYyAmJiBjIDw9IDB4MDBGRkZEKSAmJiBjICE9PSAweEZFRkYgLyogQk9NICovKVxuICAgICAgfHwgICgweDEwMDAwIDw9IGMgJiYgYyA8PSAweDEwRkZGRik7XG59XG5cbi8vIFszNF0gbnMtY2hhciA6Oj0gbmItY2hhciAtIHMtd2hpdGVcbi8vIFsyN10gbmItY2hhciA6Oj0gYy1wcmludGFibGUgLSBiLWNoYXIgLSBjLWJ5dGUtb3JkZXItbWFya1xuLy8gWzI2XSBiLWNoYXIgIDo6PSBiLWxpbmUtZmVlZCB8IGItY2FycmlhZ2UtcmV0dXJuXG4vLyBbMjRdIGItbGluZS1mZWVkICAgICAgIDo6PSAgICAgI3hBICAgIC8qIExGICovXG4vLyBbMjVdIGItY2FycmlhZ2UtcmV0dXJuIDo6PSAgICAgI3hEICAgIC8qIENSICovXG4vLyBbM10gIGMtYnl0ZS1vcmRlci1tYXJrIDo6PSAgICAgI3hGRUZGXG5mdW5jdGlvbiBpc05zQ2hhcihjKSB7XG4gIHJldHVybiBpc1ByaW50YWJsZShjKSAmJiAhaXNXaGl0ZXNwYWNlKGMpXG4gICAgLy8gYnl0ZS1vcmRlci1tYXJrXG4gICAgJiYgYyAhPT0gMHhGRUZGXG4gICAgLy8gYi1jaGFyXG4gICAgJiYgYyAhPT0gQ0hBUl9DQVJSSUFHRV9SRVRVUk5cbiAgICAmJiBjICE9PSBDSEFSX0xJTkVfRkVFRDtcbn1cblxuLy8gU2ltcGxpZmllZCB0ZXN0IGZvciB2YWx1ZXMgYWxsb3dlZCBhZnRlciB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHBsYWluIHN0eWxlLlxuZnVuY3Rpb24gaXNQbGFpblNhZmUoYywgcHJldikge1xuICAvLyBVc2VzIGEgc3Vic2V0IG9mIG5iLWNoYXIgLSBjLWZsb3ctaW5kaWNhdG9yIC0gXCI6XCIgLSBcIiNcIlxuICAvLyB3aGVyZSBuYi1jaGFyIDo6PSBjLXByaW50YWJsZSAtIGItY2hhciAtIGMtYnl0ZS1vcmRlci1tYXJrLlxuICByZXR1cm4gaXNQcmludGFibGUoYykgJiYgYyAhPT0gMHhGRUZGXG4gICAgLy8gLSBjLWZsb3ctaW5kaWNhdG9yXG4gICAgJiYgYyAhPT0gQ0hBUl9DT01NQVxuICAgICYmIGMgIT09IENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVFxuICAgICYmIGMgIT09IENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVRcbiAgICAmJiBjICE9PSBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0tFVFxuICAgICYmIGMgIT09IENIQVJfUklHSFRfQ1VSTFlfQlJBQ0tFVFxuICAgIC8vIC0gXCI6XCIgLSBcIiNcIlxuICAgIC8vIC8qIEFuIG5zLWNoYXIgcHJlY2VkaW5nICovIFwiI1wiXG4gICAgJiYgYyAhPT0gQ0hBUl9DT0xPTlxuICAgICYmICgoYyAhPT0gQ0hBUl9TSEFSUCkgfHwgKHByZXYgJiYgaXNOc0NoYXIocHJldikpKTtcbn1cblxuLy8gU2ltcGxpZmllZCB0ZXN0IGZvciB2YWx1ZXMgYWxsb3dlZCBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHBsYWluIHN0eWxlLlxuZnVuY3Rpb24gaXNQbGFpblNhZmVGaXJzdChjKSB7XG4gIC8vIFVzZXMgYSBzdWJzZXQgb2YgbnMtY2hhciAtIGMtaW5kaWNhdG9yXG4gIC8vIHdoZXJlIG5zLWNoYXIgPSBuYi1jaGFyIC0gcy13aGl0ZS5cbiAgcmV0dXJuIGlzUHJpbnRhYmxlKGMpICYmIGMgIT09IDB4RkVGRlxuICAgICYmICFpc1doaXRlc3BhY2UoYykgLy8gLSBzLXdoaXRlXG4gICAgLy8gLSAoYy1pbmRpY2F0b3IgOjo9XG4gICAgLy8gXHUyMDFDLVx1MjAxRCB8IFx1MjAxQz9cdTIwMUQgfCBcdTIwMUM6XHUyMDFEIHwgXHUyMDFDLFx1MjAxRCB8IFx1MjAxQ1tcdTIwMUQgfCBcdTIwMUNdXHUyMDFEIHwgXHUyMDFDe1x1MjAxRCB8IFx1MjAxQ31cdTIwMURcbiAgICAmJiBjICE9PSBDSEFSX01JTlVTXG4gICAgJiYgYyAhPT0gQ0hBUl9RVUVTVElPTlxuICAgICYmIGMgIT09IENIQVJfQ09MT05cbiAgICAmJiBjICE9PSBDSEFSX0NPTU1BXG4gICAgJiYgYyAhPT0gQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUXG4gICAgJiYgYyAhPT0gQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVFxuICAgICYmIGMgIT09IENIQVJfTEVGVF9DVVJMWV9CUkFDS0VUXG4gICAgJiYgYyAhPT0gQ0hBUl9SSUdIVF9DVVJMWV9CUkFDS0VUXG4gICAgLy8gfCBcdTIwMUMjXHUyMDFEIHwgXHUyMDFDJlx1MjAxRCB8IFx1MjAxQypcdTIwMUQgfCBcdTIwMUMhXHUyMDFEIHwgXHUyMDFDfFx1MjAxRCB8IFx1MjAxQz1cdTIwMUQgfCBcdTIwMUM+XHUyMDFEIHwgXHUyMDFDJ1x1MjAxRCB8IFx1MjAxQ1wiXHUyMDFEXG4gICAgJiYgYyAhPT0gQ0hBUl9TSEFSUFxuICAgICYmIGMgIT09IENIQVJfQU1QRVJTQU5EXG4gICAgJiYgYyAhPT0gQ0hBUl9BU1RFUklTS1xuICAgICYmIGMgIT09IENIQVJfRVhDTEFNQVRJT05cbiAgICAmJiBjICE9PSBDSEFSX1ZFUlRJQ0FMX0xJTkVcbiAgICAmJiBjICE9PSBDSEFSX0VRVUFMU1xuICAgICYmIGMgIT09IENIQVJfR1JFQVRFUl9USEFOXG4gICAgJiYgYyAhPT0gQ0hBUl9TSU5HTEVfUVVPVEVcbiAgICAmJiBjICE9PSBDSEFSX0RPVUJMRV9RVU9URVxuICAgIC8vIHwgXHUyMDFDJVx1MjAxRCB8IFx1MjAxQ0BcdTIwMUQgfCBcdTIwMUNgXHUyMDFEKVxuICAgICYmIGMgIT09IENIQVJfUEVSQ0VOVFxuICAgICYmIGMgIT09IENIQVJfQ09NTUVSQ0lBTF9BVFxuICAgICYmIGMgIT09IENIQVJfR1JBVkVfQUNDRU5UO1xufVxuXG4vLyBEZXRlcm1pbmVzIHdoZXRoZXIgYmxvY2sgaW5kZW50YXRpb24gaW5kaWNhdG9yIGlzIHJlcXVpcmVkLlxuZnVuY3Rpb24gbmVlZEluZGVudEluZGljYXRvcihzdHJpbmcpIHtcbiAgdmFyIGxlYWRpbmdTcGFjZVJlID0gL15cXG4qIC87XG4gIHJldHVybiBsZWFkaW5nU3BhY2VSZS50ZXN0KHN0cmluZyk7XG59XG5cbnZhciBTVFlMRV9QTEFJTiAgID0gMSxcbiAgICBTVFlMRV9TSU5HTEUgID0gMixcbiAgICBTVFlMRV9MSVRFUkFMID0gMyxcbiAgICBTVFlMRV9GT0xERUQgID0gNCxcbiAgICBTVFlMRV9ET1VCTEUgID0gNTtcblxuLy8gRGV0ZXJtaW5lcyB3aGljaCBzY2FsYXIgc3R5bGVzIGFyZSBwb3NzaWJsZSBhbmQgcmV0dXJucyB0aGUgcHJlZmVycmVkIHN0eWxlLlxuLy8gbGluZVdpZHRoID0gLTEgPT4gbm8gbGltaXQuXG4vLyBQcmUtY29uZGl0aW9uczogc3RyLmxlbmd0aCA+IDAuXG4vLyBQb3N0LWNvbmRpdGlvbnM6XG4vLyAgICBTVFlMRV9QTEFJTiBvciBTVFlMRV9TSU5HTEUgPT4gbm8gXFxuIGFyZSBpbiB0aGUgc3RyaW5nLlxuLy8gICAgU1RZTEVfTElURVJBTCA9PiBubyBsaW5lcyBhcmUgc3VpdGFibGUgZm9yIGZvbGRpbmcgKG9yIGxpbmVXaWR0aCBpcyAtMSkuXG4vLyAgICBTVFlMRV9GT0xERUQgPT4gYSBsaW5lID4gbGluZVdpZHRoIGFuZCBjYW4gYmUgZm9sZGVkIChhbmQgbGluZVdpZHRoICE9IC0xKS5cbmZ1bmN0aW9uIGNob29zZVNjYWxhclN0eWxlKHN0cmluZywgc2luZ2xlTGluZU9ubHksIGluZGVudFBlckxldmVsLCBsaW5lV2lkdGgsIHRlc3RBbWJpZ3VvdXNUeXBlKSB7XG4gIHZhciBpO1xuICB2YXIgY2hhciwgcHJldl9jaGFyO1xuICB2YXIgaGFzTGluZUJyZWFrID0gZmFsc2U7XG4gIHZhciBoYXNGb2xkYWJsZUxpbmUgPSBmYWxzZTsgLy8gb25seSBjaGVja2VkIGlmIHNob3VsZFRyYWNrV2lkdGhcbiAgdmFyIHNob3VsZFRyYWNrV2lkdGggPSBsaW5lV2lkdGggIT09IC0xO1xuICB2YXIgcHJldmlvdXNMaW5lQnJlYWsgPSAtMTsgLy8gY291bnQgdGhlIGZpcnN0IGxpbmUgY29ycmVjdGx5XG4gIHZhciBwbGFpbiA9IGlzUGxhaW5TYWZlRmlyc3Qoc3RyaW5nLmNoYXJDb2RlQXQoMCkpXG4gICAgICAgICAgJiYgIWlzV2hpdGVzcGFjZShzdHJpbmcuY2hhckNvZGVBdChzdHJpbmcubGVuZ3RoIC0gMSkpO1xuXG4gIGlmIChzaW5nbGVMaW5lT25seSkge1xuICAgIC8vIENhc2U6IG5vIGJsb2NrIHN0eWxlcy5cbiAgICAvLyBDaGVjayBmb3IgZGlzYWxsb3dlZCBjaGFyYWN0ZXJzIHRvIHJ1bGUgb3V0IHBsYWluIGFuZCBzaW5nbGUuXG4gICAgZm9yIChpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgY2hhciA9IHN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICAgICAgaWYgKCFpc1ByaW50YWJsZShjaGFyKSkge1xuICAgICAgICByZXR1cm4gU1RZTEVfRE9VQkxFO1xuICAgICAgfVxuICAgICAgcHJldl9jaGFyID0gaSA+IDAgPyBzdHJpbmcuY2hhckNvZGVBdChpIC0gMSkgOiBudWxsO1xuICAgICAgcGxhaW4gPSBwbGFpbiAmJiBpc1BsYWluU2FmZShjaGFyLCBwcmV2X2NoYXIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBDYXNlOiBibG9jayBzdHlsZXMgcGVybWl0dGVkLlxuICAgIGZvciAoaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoYXIgPSBzdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgICAgIGlmIChjaGFyID09PSBDSEFSX0xJTkVfRkVFRCkge1xuICAgICAgICBoYXNMaW5lQnJlYWsgPSB0cnVlO1xuICAgICAgICAvLyBDaGVjayBpZiBhbnkgbGluZSBjYW4gYmUgZm9sZGVkLlxuICAgICAgICBpZiAoc2hvdWxkVHJhY2tXaWR0aCkge1xuICAgICAgICAgIGhhc0ZvbGRhYmxlTGluZSA9IGhhc0ZvbGRhYmxlTGluZSB8fFxuICAgICAgICAgICAgLy8gRm9sZGFibGUgbGluZSA9IHRvbyBsb25nLCBhbmQgbm90IG1vcmUtaW5kZW50ZWQuXG4gICAgICAgICAgICAoaSAtIHByZXZpb3VzTGluZUJyZWFrIC0gMSA+IGxpbmVXaWR0aCAmJlxuICAgICAgICAgICAgIHN0cmluZ1twcmV2aW91c0xpbmVCcmVhayArIDFdICE9PSAnICcpO1xuICAgICAgICAgIHByZXZpb3VzTGluZUJyZWFrID0gaTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghaXNQcmludGFibGUoY2hhcikpIHtcbiAgICAgICAgcmV0dXJuIFNUWUxFX0RPVUJMRTtcbiAgICAgIH1cbiAgICAgIHByZXZfY2hhciA9IGkgPiAwID8gc3RyaW5nLmNoYXJDb2RlQXQoaSAtIDEpIDogbnVsbDtcbiAgICAgIHBsYWluID0gcGxhaW4gJiYgaXNQbGFpblNhZmUoY2hhciwgcHJldl9jaGFyKTtcbiAgICB9XG4gICAgLy8gaW4gY2FzZSB0aGUgZW5kIGlzIG1pc3NpbmcgYSBcXG5cbiAgICBoYXNGb2xkYWJsZUxpbmUgPSBoYXNGb2xkYWJsZUxpbmUgfHwgKHNob3VsZFRyYWNrV2lkdGggJiZcbiAgICAgIChpIC0gcHJldmlvdXNMaW5lQnJlYWsgLSAxID4gbGluZVdpZHRoICYmXG4gICAgICAgc3RyaW5nW3ByZXZpb3VzTGluZUJyZWFrICsgMV0gIT09ICcgJykpO1xuICB9XG4gIC8vIEFsdGhvdWdoIGV2ZXJ5IHN0eWxlIGNhbiByZXByZXNlbnQgXFxuIHdpdGhvdXQgZXNjYXBpbmcsIHByZWZlciBibG9jayBzdHlsZXNcbiAgLy8gZm9yIG11bHRpbGluZSwgc2luY2UgdGhleSdyZSBtb3JlIHJlYWRhYmxlIGFuZCB0aGV5IGRvbid0IGFkZCBlbXB0eSBsaW5lcy5cbiAgLy8gQWxzbyBwcmVmZXIgZm9sZGluZyBhIHN1cGVyLWxvbmcgbGluZS5cbiAgaWYgKCFoYXNMaW5lQnJlYWsgJiYgIWhhc0ZvbGRhYmxlTGluZSkge1xuICAgIC8vIFN0cmluZ3MgaW50ZXJwcmV0YWJsZSBhcyBhbm90aGVyIHR5cGUgaGF2ZSB0byBiZSBxdW90ZWQ7XG4gICAgLy8gZS5nLiB0aGUgc3RyaW5nICd0cnVlJyB2cy4gdGhlIGJvb2xlYW4gdHJ1ZS5cbiAgICByZXR1cm4gcGxhaW4gJiYgIXRlc3RBbWJpZ3VvdXNUeXBlKHN0cmluZylcbiAgICAgID8gU1RZTEVfUExBSU4gOiBTVFlMRV9TSU5HTEU7XG4gIH1cbiAgLy8gRWRnZSBjYXNlOiBibG9jayBpbmRlbnRhdGlvbiBpbmRpY2F0b3IgY2FuIG9ubHkgaGF2ZSBvbmUgZGlnaXQuXG4gIGlmIChpbmRlbnRQZXJMZXZlbCA+IDkgJiYgbmVlZEluZGVudEluZGljYXRvcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIFNUWUxFX0RPVUJMRTtcbiAgfVxuICAvLyBBdCB0aGlzIHBvaW50IHdlIGtub3cgYmxvY2sgc3R5bGVzIGFyZSB2YWxpZC5cbiAgLy8gUHJlZmVyIGxpdGVyYWwgc3R5bGUgdW5sZXNzIHdlIHdhbnQgdG8gZm9sZC5cbiAgcmV0dXJuIGhhc0ZvbGRhYmxlTGluZSA/IFNUWUxFX0ZPTERFRCA6IFNUWUxFX0xJVEVSQUw7XG59XG5cbi8vIE5vdGU6IGxpbmUgYnJlYWtpbmcvZm9sZGluZyBpcyBpbXBsZW1lbnRlZCBmb3Igb25seSB0aGUgZm9sZGVkIHN0eWxlLlxuLy8gTkIuIFdlIGRyb3AgdGhlIGxhc3QgdHJhaWxpbmcgbmV3bGluZSAoaWYgYW55KSBvZiBhIHJldHVybmVkIGJsb2NrIHNjYWxhclxuLy8gIHNpbmNlIHRoZSBkdW1wZXIgYWRkcyBpdHMgb3duIG5ld2xpbmUuIFRoaXMgYWx3YXlzIHdvcmtzOlxuLy8gICAgXHUyMDIyIE5vIGVuZGluZyBuZXdsaW5lID0+IHVuYWZmZWN0ZWQ7IGFscmVhZHkgdXNpbmcgc3RyaXAgXCItXCIgY2hvbXBpbmcuXG4vLyAgICBcdTIwMjIgRW5kaW5nIG5ld2xpbmUgICAgPT4gcmVtb3ZlZCB0aGVuIHJlc3RvcmVkLlxuLy8gIEltcG9ydGFudGx5LCB0aGlzIGtlZXBzIHRoZSBcIitcIiBjaG9tcCBpbmRpY2F0b3IgZnJvbSBnYWluaW5nIGFuIGV4dHJhIGxpbmUuXG5mdW5jdGlvbiB3cml0ZVNjYWxhcihzdGF0ZSwgc3RyaW5nLCBsZXZlbCwgaXNrZXkpIHtcbiAgc3RhdGUuZHVtcCA9IChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHN0cmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBcIicnXCI7XG4gICAgfVxuICAgIGlmICghc3RhdGUubm9Db21wYXRNb2RlICYmXG4gICAgICAgIERFUFJFQ0FURURfQk9PTEVBTlNfU1lOVEFYLmluZGV4T2Yoc3RyaW5nKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBcIidcIiArIHN0cmluZyArIFwiJ1wiO1xuICAgIH1cblxuICAgIHZhciBpbmRlbnQgPSBzdGF0ZS5pbmRlbnQgKiBNYXRoLm1heCgxLCBsZXZlbCk7IC8vIG5vIDAtaW5kZW50IHNjYWxhcnNcbiAgICAvLyBBcyBpbmRlbnRhdGlvbiBnZXRzIGRlZXBlciwgbGV0IHRoZSB3aWR0aCBkZWNyZWFzZSBtb25vdG9uaWNhbGx5XG4gICAgLy8gdG8gdGhlIGxvd2VyIGJvdW5kIG1pbihzdGF0ZS5saW5lV2lkdGgsIDQwKS5cbiAgICAvLyBOb3RlIHRoYXQgdGhpcyBpbXBsaWVzXG4gICAgLy8gIHN0YXRlLmxpbmVXaWR0aCBcdTIyNjQgNDAgKyBzdGF0ZS5pbmRlbnQ6IHdpZHRoIGlzIGZpeGVkIGF0IHRoZSBsb3dlciBib3VuZC5cbiAgICAvLyAgc3RhdGUubGluZVdpZHRoID4gNDAgKyBzdGF0ZS5pbmRlbnQ6IHdpZHRoIGRlY3JlYXNlcyB1bnRpbCB0aGUgbG93ZXIgYm91bmQuXG4gICAgLy8gVGhpcyBiZWhhdmVzIGJldHRlciB0aGFuIGEgY29uc3RhbnQgbWluaW11bSB3aWR0aCB3aGljaCBkaXNhbGxvd3MgbmFycm93ZXIgb3B0aW9ucyxcbiAgICAvLyBvciBhbiBpbmRlbnQgdGhyZXNob2xkIHdoaWNoIGNhdXNlcyB0aGUgd2lkdGggdG8gc3VkZGVubHkgaW5jcmVhc2UuXG4gICAgdmFyIGxpbmVXaWR0aCA9IHN0YXRlLmxpbmVXaWR0aCA9PT0gLTFcbiAgICAgID8gLTEgOiBNYXRoLm1heChNYXRoLm1pbihzdGF0ZS5saW5lV2lkdGgsIDQwKSwgc3RhdGUubGluZVdpZHRoIC0gaW5kZW50KTtcblxuICAgIC8vIFdpdGhvdXQga25vd2luZyBpZiBrZXlzIGFyZSBpbXBsaWNpdC9leHBsaWNpdCwgYXNzdW1lIGltcGxpY2l0IGZvciBzYWZldHkuXG4gICAgdmFyIHNpbmdsZUxpbmVPbmx5ID0gaXNrZXlcbiAgICAgIC8vIE5vIGJsb2NrIHN0eWxlcyBpbiBmbG93IG1vZGUuXG4gICAgICB8fCAoc3RhdGUuZmxvd0xldmVsID4gLTEgJiYgbGV2ZWwgPj0gc3RhdGUuZmxvd0xldmVsKTtcbiAgICBmdW5jdGlvbiB0ZXN0QW1iaWd1aXR5KHN0cmluZykge1xuICAgICAgcmV0dXJuIHRlc3RJbXBsaWNpdFJlc29sdmluZyhzdGF0ZSwgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNob29zZVNjYWxhclN0eWxlKHN0cmluZywgc2luZ2xlTGluZU9ubHksIHN0YXRlLmluZGVudCwgbGluZVdpZHRoLCB0ZXN0QW1iaWd1aXR5KSkge1xuICAgICAgY2FzZSBTVFlMRV9QTEFJTjpcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIGNhc2UgU1RZTEVfU0lOR0xFOlxuICAgICAgICByZXR1cm4gXCInXCIgKyBzdHJpbmcucmVwbGFjZSgvJy9nLCBcIicnXCIpICsgXCInXCI7XG4gICAgICBjYXNlIFNUWUxFX0xJVEVSQUw6XG4gICAgICAgIHJldHVybiAnfCcgKyBibG9ja0hlYWRlcihzdHJpbmcsIHN0YXRlLmluZGVudClcbiAgICAgICAgICArIGRyb3BFbmRpbmdOZXdsaW5lKGluZGVudFN0cmluZyhzdHJpbmcsIGluZGVudCkpO1xuICAgICAgY2FzZSBTVFlMRV9GT0xERUQ6XG4gICAgICAgIHJldHVybiAnPicgKyBibG9ja0hlYWRlcihzdHJpbmcsIHN0YXRlLmluZGVudClcbiAgICAgICAgICArIGRyb3BFbmRpbmdOZXdsaW5lKGluZGVudFN0cmluZyhmb2xkU3RyaW5nKHN0cmluZywgbGluZVdpZHRoKSwgaW5kZW50KSk7XG4gICAgICBjYXNlIFNUWUxFX0RPVUJMRTpcbiAgICAgICAgcmV0dXJuICdcIicgKyBlc2NhcGVTdHJpbmcoc3RyaW5nLCBsaW5lV2lkdGgpICsgJ1wiJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdpbXBvc3NpYmxlIGVycm9yOiBpbnZhbGlkIHNjYWxhciBzdHlsZScpO1xuICAgIH1cbiAgfSgpKTtcbn1cblxuLy8gUHJlLWNvbmRpdGlvbnM6IHN0cmluZyBpcyB2YWxpZCBmb3IgYSBibG9jayBzY2FsYXIsIDEgPD0gaW5kZW50UGVyTGV2ZWwgPD0gOS5cbmZ1bmN0aW9uIGJsb2NrSGVhZGVyKHN0cmluZywgaW5kZW50UGVyTGV2ZWwpIHtcbiAgdmFyIGluZGVudEluZGljYXRvciA9IG5lZWRJbmRlbnRJbmRpY2F0b3Ioc3RyaW5nKSA/IFN0cmluZyhpbmRlbnRQZXJMZXZlbCkgOiAnJztcblxuICAvLyBub3RlIHRoZSBzcGVjaWFsIGNhc2U6IHRoZSBzdHJpbmcgJ1xcbicgY291bnRzIGFzIGEgXCJ0cmFpbGluZ1wiIGVtcHR5IGxpbmUuXG4gIHZhciBjbGlwID0gICAgICAgICAgc3RyaW5nW3N0cmluZy5sZW5ndGggLSAxXSA9PT0gJ1xcbic7XG4gIHZhciBrZWVwID0gY2xpcCAmJiAoc3RyaW5nW3N0cmluZy5sZW5ndGggLSAyXSA9PT0gJ1xcbicgfHwgc3RyaW5nID09PSAnXFxuJyk7XG4gIHZhciBjaG9tcCA9IGtlZXAgPyAnKycgOiAoY2xpcCA/ICcnIDogJy0nKTtcblxuICByZXR1cm4gaW5kZW50SW5kaWNhdG9yICsgY2hvbXAgKyAnXFxuJztcbn1cblxuLy8gKFNlZSB0aGUgbm90ZSBmb3Igd3JpdGVTY2FsYXIuKVxuZnVuY3Rpb24gZHJvcEVuZGluZ05ld2xpbmUoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmdbc3RyaW5nLmxlbmd0aCAtIDFdID09PSAnXFxuJyA/IHN0cmluZy5zbGljZSgwLCAtMSkgOiBzdHJpbmc7XG59XG5cbi8vIE5vdGU6IGEgbG9uZyBsaW5lIHdpdGhvdXQgYSBzdWl0YWJsZSBicmVhayBwb2ludCB3aWxsIGV4Y2VlZCB0aGUgd2lkdGggbGltaXQuXG4vLyBQcmUtY29uZGl0aW9uczogZXZlcnkgY2hhciBpbiBzdHIgaXNQcmludGFibGUsIHN0ci5sZW5ndGggPiAwLCB3aWR0aCA+IDAuXG5mdW5jdGlvbiBmb2xkU3RyaW5nKHN0cmluZywgd2lkdGgpIHtcbiAgLy8gSW4gZm9sZGVkIHN0eWxlLCAkayQgY29uc2VjdXRpdmUgbmV3bGluZXMgb3V0cHV0IGFzICRrKzEkIG5ld2xpbmVzXHUyMDE0XG4gIC8vIHVubGVzcyB0aGV5J3JlIGJlZm9yZSBvciBhZnRlciBhIG1vcmUtaW5kZW50ZWQgbGluZSwgb3IgYXQgdGhlIHZlcnlcbiAgLy8gYmVnaW5uaW5nIG9yIGVuZCwgaW4gd2hpY2ggY2FzZSAkayQgbWFwcyB0byAkayQuXG4gIC8vIFRoZXJlZm9yZSwgcGFyc2UgZWFjaCBjaHVuayBhcyBuZXdsaW5lKHMpIGZvbGxvd2VkIGJ5IGEgY29udGVudCBsaW5lLlxuICB2YXIgbGluZVJlID0gLyhcXG4rKShbXlxcbl0qKS9nO1xuXG4gIC8vIGZpcnN0IGxpbmUgKHBvc3NpYmx5IGFuIGVtcHR5IGxpbmUpXG4gIHZhciByZXN1bHQgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBuZXh0TEYgPSBzdHJpbmcuaW5kZXhPZignXFxuJyk7XG4gICAgbmV4dExGID0gbmV4dExGICE9PSAtMSA/IG5leHRMRiA6IHN0cmluZy5sZW5ndGg7XG4gICAgbGluZVJlLmxhc3RJbmRleCA9IG5leHRMRjtcbiAgICByZXR1cm4gZm9sZExpbmUoc3RyaW5nLnNsaWNlKDAsIG5leHRMRiksIHdpZHRoKTtcbiAgfSgpKTtcbiAgLy8gSWYgd2UgaGF2ZW4ndCByZWFjaGVkIHRoZSBmaXJzdCBjb250ZW50IGxpbmUgeWV0LCBkb24ndCBhZGQgYW4gZXh0cmEgXFxuLlxuICB2YXIgcHJldk1vcmVJbmRlbnRlZCA9IHN0cmluZ1swXSA9PT0gJ1xcbicgfHwgc3RyaW5nWzBdID09PSAnICc7XG4gIHZhciBtb3JlSW5kZW50ZWQ7XG5cbiAgLy8gcmVzdCBvZiB0aGUgbGluZXNcbiAgdmFyIG1hdGNoO1xuICB3aGlsZSAoKG1hdGNoID0gbGluZVJlLmV4ZWMoc3RyaW5nKSkpIHtcbiAgICB2YXIgcHJlZml4ID0gbWF0Y2hbMV0sIGxpbmUgPSBtYXRjaFsyXTtcbiAgICBtb3JlSW5kZW50ZWQgPSAobGluZVswXSA9PT0gJyAnKTtcbiAgICByZXN1bHQgKz0gcHJlZml4XG4gICAgICArICghcHJldk1vcmVJbmRlbnRlZCAmJiAhbW9yZUluZGVudGVkICYmIGxpbmUgIT09ICcnXG4gICAgICAgID8gJ1xcbicgOiAnJylcbiAgICAgICsgZm9sZExpbmUobGluZSwgd2lkdGgpO1xuICAgIHByZXZNb3JlSW5kZW50ZWQgPSBtb3JlSW5kZW50ZWQ7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBHcmVlZHkgbGluZSBicmVha2luZy5cbi8vIFBpY2tzIHRoZSBsb25nZXN0IGxpbmUgdW5kZXIgdGhlIGxpbWl0IGVhY2ggdGltZSxcbi8vIG90aGVyd2lzZSBzZXR0bGVzIGZvciB0aGUgc2hvcnRlc3QgbGluZSBvdmVyIHRoZSBsaW1pdC5cbi8vIE5CLiBNb3JlLWluZGVudGVkIGxpbmVzICpjYW5ub3QqIGJlIGZvbGRlZCwgYXMgdGhhdCB3b3VsZCBhZGQgYW4gZXh0cmEgXFxuLlxuZnVuY3Rpb24gZm9sZExpbmUobGluZSwgd2lkdGgpIHtcbiAgaWYgKGxpbmUgPT09ICcnIHx8IGxpbmVbMF0gPT09ICcgJykgcmV0dXJuIGxpbmU7XG5cbiAgLy8gU2luY2UgYSBtb3JlLWluZGVudGVkIGxpbmUgYWRkcyBhIFxcbiwgYnJlYWtzIGNhbid0IGJlIGZvbGxvd2VkIGJ5IGEgc3BhY2UuXG4gIHZhciBicmVha1JlID0gLyBbXiBdL2c7IC8vIG5vdGU6IHRoZSBtYXRjaCBpbmRleCB3aWxsIGFsd2F5cyBiZSA8PSBsZW5ndGgtMi5cbiAgdmFyIG1hdGNoO1xuICAvLyBzdGFydCBpcyBhbiBpbmNsdXNpdmUgaW5kZXguIGVuZCwgY3VyciwgYW5kIG5leHQgYXJlIGV4Y2x1c2l2ZS5cbiAgdmFyIHN0YXJ0ID0gMCwgZW5kLCBjdXJyID0gMCwgbmV4dCA9IDA7XG4gIHZhciByZXN1bHQgPSAnJztcblxuICAvLyBJbnZhcmlhbnRzOiAwIDw9IHN0YXJ0IDw9IGxlbmd0aC0xLlxuICAvLyAgIDAgPD0gY3VyciA8PSBuZXh0IDw9IG1heCgwLCBsZW5ndGgtMikuIGN1cnIgLSBzdGFydCA8PSB3aWR0aC5cbiAgLy8gSW5zaWRlIHRoZSBsb29wOlxuICAvLyAgIEEgbWF0Y2ggaW1wbGllcyBsZW5ndGggPj0gMiwgc28gY3VyciBhbmQgbmV4dCBhcmUgPD0gbGVuZ3RoLTIuXG4gIHdoaWxlICgobWF0Y2ggPSBicmVha1JlLmV4ZWMobGluZSkpKSB7XG4gICAgbmV4dCA9IG1hdGNoLmluZGV4O1xuICAgIC8vIG1haW50YWluIGludmFyaWFudDogY3VyciAtIHN0YXJ0IDw9IHdpZHRoXG4gICAgaWYgKG5leHQgLSBzdGFydCA+IHdpZHRoKSB7XG4gICAgICBlbmQgPSAoY3VyciA+IHN0YXJ0KSA/IGN1cnIgOiBuZXh0OyAvLyBkZXJpdmUgZW5kIDw9IGxlbmd0aC0yXG4gICAgICByZXN1bHQgKz0gJ1xcbicgKyBsaW5lLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgICAgLy8gc2tpcCB0aGUgc3BhY2UgdGhhdCB3YXMgb3V0cHV0IGFzIFxcblxuICAgICAgc3RhcnQgPSBlbmQgKyAxOyAgICAgICAgICAgICAgICAgICAgLy8gZGVyaXZlIHN0YXJ0IDw9IGxlbmd0aC0xXG4gICAgfVxuICAgIGN1cnIgPSBuZXh0O1xuICB9XG5cbiAgLy8gQnkgdGhlIGludmFyaWFudHMsIHN0YXJ0IDw9IGxlbmd0aC0xLCBzbyB0aGVyZSBpcyBzb21ldGhpbmcgbGVmdCBvdmVyLlxuICAvLyBJdCBpcyBlaXRoZXIgdGhlIHdob2xlIHN0cmluZyBvciBhIHBhcnQgc3RhcnRpbmcgZnJvbSBub24td2hpdGVzcGFjZS5cbiAgcmVzdWx0ICs9ICdcXG4nO1xuICAvLyBJbnNlcnQgYSBicmVhayBpZiB0aGUgcmVtYWluZGVyIGlzIHRvbyBsb25nIGFuZCB0aGVyZSBpcyBhIGJyZWFrIGF2YWlsYWJsZS5cbiAgaWYgKGxpbmUubGVuZ3RoIC0gc3RhcnQgPiB3aWR0aCAmJiBjdXJyID4gc3RhcnQpIHtcbiAgICByZXN1bHQgKz0gbGluZS5zbGljZShzdGFydCwgY3VycikgKyAnXFxuJyArIGxpbmUuc2xpY2UoY3VyciArIDEpO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCArPSBsaW5lLnNsaWNlKHN0YXJ0KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQuc2xpY2UoMSk7IC8vIGRyb3AgZXh0cmEgXFxuIGpvaW5lclxufVxuXG4vLyBFc2NhcGVzIGEgZG91YmxlLXF1b3RlZCBzdHJpbmcuXG5mdW5jdGlvbiBlc2NhcGVTdHJpbmcoc3RyaW5nKSB7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgdmFyIGNoYXIsIG5leHRDaGFyO1xuICB2YXIgZXNjYXBlU2VxO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgY2hhciA9IHN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICAgIC8vIENoZWNrIGZvciBzdXJyb2dhdGUgcGFpcnMgKHJlZmVyZW5jZSBVbmljb2RlIDMuMCBzZWN0aW9uIFwiMy43IFN1cnJvZ2F0ZXNcIikuXG4gICAgaWYgKGNoYXIgPj0gMHhEODAwICYmIGNoYXIgPD0gMHhEQkZGLyogaGlnaCBzdXJyb2dhdGUgKi8pIHtcbiAgICAgIG5leHRDaGFyID0gc3RyaW5nLmNoYXJDb2RlQXQoaSArIDEpO1xuICAgICAgaWYgKG5leHRDaGFyID49IDB4REMwMCAmJiBuZXh0Q2hhciA8PSAweERGRkYvKiBsb3cgc3Vycm9nYXRlICovKSB7XG4gICAgICAgIC8vIENvbWJpbmUgdGhlIHN1cnJvZ2F0ZSBwYWlyIGFuZCBzdG9yZSBpdCBlc2NhcGVkLlxuICAgICAgICByZXN1bHQgKz0gZW5jb2RlSGV4KChjaGFyIC0gMHhEODAwKSAqIDB4NDAwICsgbmV4dENoYXIgLSAweERDMDAgKyAweDEwMDAwKTtcbiAgICAgICAgLy8gQWR2YW5jZSBpbmRleCBvbmUgZXh0cmEgc2luY2Ugd2UgYWxyZWFkeSB1c2VkIHRoYXQgY2hhciBoZXJlLlxuICAgICAgICBpKys7IGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBlc2NhcGVTZXEgPSBFU0NBUEVfU0VRVUVOQ0VTW2NoYXJdO1xuICAgIHJlc3VsdCArPSAhZXNjYXBlU2VxICYmIGlzUHJpbnRhYmxlKGNoYXIpXG4gICAgICA/IHN0cmluZ1tpXVxuICAgICAgOiBlc2NhcGVTZXEgfHwgZW5jb2RlSGV4KGNoYXIpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG93U2VxdWVuY2Uoc3RhdGUsIGxldmVsLCBvYmplY3QpIHtcbiAgdmFyIF9yZXN1bHQgPSAnJyxcbiAgICAgIF90YWcgICAgPSBzdGF0ZS50YWcsXG4gICAgICBpbmRleCxcbiAgICAgIGxlbmd0aDtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAvLyBXcml0ZSBvbmx5IHZhbGlkIGVsZW1lbnRzLlxuICAgIGlmICh3cml0ZU5vZGUoc3RhdGUsIGxldmVsLCBvYmplY3RbaW5kZXhdLCBmYWxzZSwgZmFsc2UpKSB7XG4gICAgICBpZiAoaW5kZXggIT09IDApIF9yZXN1bHQgKz0gJywnICsgKCFzdGF0ZS5jb25kZW5zZUZsb3cgPyAnICcgOiAnJyk7XG4gICAgICBfcmVzdWx0ICs9IHN0YXRlLmR1bXA7XG4gICAgfVxuICB9XG5cbiAgc3RhdGUudGFnID0gX3RhZztcbiAgc3RhdGUuZHVtcCA9ICdbJyArIF9yZXN1bHQgKyAnXSc7XG59XG5cbmZ1bmN0aW9uIHdyaXRlQmxvY2tTZXF1ZW5jZShzdGF0ZSwgbGV2ZWwsIG9iamVjdCwgY29tcGFjdCkge1xuICB2YXIgX3Jlc3VsdCA9ICcnLFxuICAgICAgX3RhZyAgICA9IHN0YXRlLnRhZyxcbiAgICAgIGluZGV4LFxuICAgICAgbGVuZ3RoO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIC8vIFdyaXRlIG9ubHkgdmFsaWQgZWxlbWVudHMuXG4gICAgaWYgKHdyaXRlTm9kZShzdGF0ZSwgbGV2ZWwgKyAxLCBvYmplY3RbaW5kZXhdLCB0cnVlLCB0cnVlKSkge1xuICAgICAgaWYgKCFjb21wYWN0IHx8IGluZGV4ICE9PSAwKSB7XG4gICAgICAgIF9yZXN1bHQgKz0gZ2VuZXJhdGVOZXh0TGluZShzdGF0ZSwgbGV2ZWwpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUuZHVtcCAmJiBDSEFSX0xJTkVfRkVFRCA9PT0gc3RhdGUuZHVtcC5jaGFyQ29kZUF0KDApKSB7XG4gICAgICAgIF9yZXN1bHQgKz0gJy0nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3Jlc3VsdCArPSAnLSAnO1xuICAgICAgfVxuXG4gICAgICBfcmVzdWx0ICs9IHN0YXRlLmR1bXA7XG4gICAgfVxuICB9XG5cbiAgc3RhdGUudGFnID0gX3RhZztcbiAgc3RhdGUuZHVtcCA9IF9yZXN1bHQgfHwgJ1tdJzsgLy8gRW1wdHkgc2VxdWVuY2UgaWYgbm8gdmFsaWQgdmFsdWVzLlxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb3dNYXBwaW5nKHN0YXRlLCBsZXZlbCwgb2JqZWN0KSB7XG4gIHZhciBfcmVzdWx0ICAgICAgID0gJycsXG4gICAgICBfdGFnICAgICAgICAgID0gc3RhdGUudGFnLFxuICAgICAgb2JqZWN0S2V5TGlzdCA9IE9iamVjdC5rZXlzKG9iamVjdCksXG4gICAgICBpbmRleCxcbiAgICAgIGxlbmd0aCxcbiAgICAgIG9iamVjdEtleSxcbiAgICAgIG9iamVjdFZhbHVlLFxuICAgICAgcGFpckJ1ZmZlcjtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0S2V5TGlzdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG5cbiAgICBwYWlyQnVmZmVyID0gJyc7XG4gICAgaWYgKGluZGV4ICE9PSAwKSBwYWlyQnVmZmVyICs9ICcsICc7XG5cbiAgICBpZiAoc3RhdGUuY29uZGVuc2VGbG93KSBwYWlyQnVmZmVyICs9ICdcIic7XG5cbiAgICBvYmplY3RLZXkgPSBvYmplY3RLZXlMaXN0W2luZGV4XTtcbiAgICBvYmplY3RWYWx1ZSA9IG9iamVjdFtvYmplY3RLZXldO1xuXG4gICAgaWYgKCF3cml0ZU5vZGUoc3RhdGUsIGxldmVsLCBvYmplY3RLZXksIGZhbHNlLCBmYWxzZSkpIHtcbiAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIHRoaXMgcGFpciBiZWNhdXNlIG9mIGludmFsaWQga2V5O1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5kdW1wLmxlbmd0aCA+IDEwMjQpIHBhaXJCdWZmZXIgKz0gJz8gJztcblxuICAgIHBhaXJCdWZmZXIgKz0gc3RhdGUuZHVtcCArIChzdGF0ZS5jb25kZW5zZUZsb3cgPyAnXCInIDogJycpICsgJzonICsgKHN0YXRlLmNvbmRlbnNlRmxvdyA/ICcnIDogJyAnKTtcblxuICAgIGlmICghd3JpdGVOb2RlKHN0YXRlLCBsZXZlbCwgb2JqZWN0VmFsdWUsIGZhbHNlLCBmYWxzZSkpIHtcbiAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIHRoaXMgcGFpciBiZWNhdXNlIG9mIGludmFsaWQgdmFsdWUuXG4gICAgfVxuXG4gICAgcGFpckJ1ZmZlciArPSBzdGF0ZS5kdW1wO1xuXG4gICAgLy8gQm90aCBrZXkgYW5kIHZhbHVlIGFyZSB2YWxpZC5cbiAgICBfcmVzdWx0ICs9IHBhaXJCdWZmZXI7XG4gIH1cblxuICBzdGF0ZS50YWcgPSBfdGFnO1xuICBzdGF0ZS5kdW1wID0gJ3snICsgX3Jlc3VsdCArICd9Jztcbn1cblxuZnVuY3Rpb24gd3JpdGVCbG9ja01hcHBpbmcoc3RhdGUsIGxldmVsLCBvYmplY3QsIGNvbXBhY3QpIHtcbiAgdmFyIF9yZXN1bHQgICAgICAgPSAnJyxcbiAgICAgIF90YWcgICAgICAgICAgPSBzdGF0ZS50YWcsXG4gICAgICBvYmplY3RLZXlMaXN0ID0gT2JqZWN0LmtleXMob2JqZWN0KSxcbiAgICAgIGluZGV4LFxuICAgICAgbGVuZ3RoLFxuICAgICAgb2JqZWN0S2V5LFxuICAgICAgb2JqZWN0VmFsdWUsXG4gICAgICBleHBsaWNpdFBhaXIsXG4gICAgICBwYWlyQnVmZmVyO1xuXG4gIC8vIEFsbG93IHNvcnRpbmcga2V5cyBzbyB0aGF0IHRoZSBvdXRwdXQgZmlsZSBpcyBkZXRlcm1pbmlzdGljXG4gIGlmIChzdGF0ZS5zb3J0S2V5cyA9PT0gdHJ1ZSkge1xuICAgIC8vIERlZmF1bHQgc29ydGluZ1xuICAgIG9iamVjdEtleUxpc3Quc29ydCgpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBzdGF0ZS5zb3J0S2V5cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIEN1c3RvbSBzb3J0IGZ1bmN0aW9uXG4gICAgb2JqZWN0S2V5TGlzdC5zb3J0KHN0YXRlLnNvcnRLZXlzKTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5zb3J0S2V5cykge1xuICAgIC8vIFNvbWV0aGluZyBpcyB3cm9uZ1xuICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdzb3J0S2V5cyBtdXN0IGJlIGEgYm9vbGVhbiBvciBhIGZ1bmN0aW9uJyk7XG4gIH1cblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0S2V5TGlzdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgcGFpckJ1ZmZlciA9ICcnO1xuXG4gICAgaWYgKCFjb21wYWN0IHx8IGluZGV4ICE9PSAwKSB7XG4gICAgICBwYWlyQnVmZmVyICs9IGdlbmVyYXRlTmV4dExpbmUoc3RhdGUsIGxldmVsKTtcbiAgICB9XG5cbiAgICBvYmplY3RLZXkgPSBvYmplY3RLZXlMaXN0W2luZGV4XTtcbiAgICBvYmplY3RWYWx1ZSA9IG9iamVjdFtvYmplY3RLZXldO1xuXG4gICAgaWYgKCF3cml0ZU5vZGUoc3RhdGUsIGxldmVsICsgMSwgb2JqZWN0S2V5LCB0cnVlLCB0cnVlLCB0cnVlKSkge1xuICAgICAgY29udGludWU7IC8vIFNraXAgdGhpcyBwYWlyIGJlY2F1c2Ugb2YgaW52YWxpZCBrZXkuXG4gICAgfVxuXG4gICAgZXhwbGljaXRQYWlyID0gKHN0YXRlLnRhZyAhPT0gbnVsbCAmJiBzdGF0ZS50YWcgIT09ICc/JykgfHxcbiAgICAgICAgICAgICAgICAgICAoc3RhdGUuZHVtcCAmJiBzdGF0ZS5kdW1wLmxlbmd0aCA+IDEwMjQpO1xuXG4gICAgaWYgKGV4cGxpY2l0UGFpcikge1xuICAgICAgaWYgKHN0YXRlLmR1bXAgJiYgQ0hBUl9MSU5FX0ZFRUQgPT09IHN0YXRlLmR1bXAuY2hhckNvZGVBdCgwKSkge1xuICAgICAgICBwYWlyQnVmZmVyICs9ICc/JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhaXJCdWZmZXIgKz0gJz8gJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYWlyQnVmZmVyICs9IHN0YXRlLmR1bXA7XG5cbiAgICBpZiAoZXhwbGljaXRQYWlyKSB7XG4gICAgICBwYWlyQnVmZmVyICs9IGdlbmVyYXRlTmV4dExpbmUoc3RhdGUsIGxldmVsKTtcbiAgICB9XG5cbiAgICBpZiAoIXdyaXRlTm9kZShzdGF0ZSwgbGV2ZWwgKyAxLCBvYmplY3RWYWx1ZSwgdHJ1ZSwgZXhwbGljaXRQYWlyKSkge1xuICAgICAgY29udGludWU7IC8vIFNraXAgdGhpcyBwYWlyIGJlY2F1c2Ugb2YgaW52YWxpZCB2YWx1ZS5cbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuZHVtcCAmJiBDSEFSX0xJTkVfRkVFRCA9PT0gc3RhdGUuZHVtcC5jaGFyQ29kZUF0KDApKSB7XG4gICAgICBwYWlyQnVmZmVyICs9ICc6JztcbiAgICB9IGVsc2Uge1xuICAgICAgcGFpckJ1ZmZlciArPSAnOiAnO1xuICAgIH1cblxuICAgIHBhaXJCdWZmZXIgKz0gc3RhdGUuZHVtcDtcblxuICAgIC8vIEJvdGgga2V5IGFuZCB2YWx1ZSBhcmUgdmFsaWQuXG4gICAgX3Jlc3VsdCArPSBwYWlyQnVmZmVyO1xuICB9XG5cbiAgc3RhdGUudGFnID0gX3RhZztcbiAgc3RhdGUuZHVtcCA9IF9yZXN1bHQgfHwgJ3t9JzsgLy8gRW1wdHkgbWFwcGluZyBpZiBubyB2YWxpZCBwYWlycy5cbn1cblxuZnVuY3Rpb24gZGV0ZWN0VHlwZShzdGF0ZSwgb2JqZWN0LCBleHBsaWNpdCkge1xuICB2YXIgX3Jlc3VsdCwgdHlwZUxpc3QsIGluZGV4LCBsZW5ndGgsIHR5cGUsIHN0eWxlO1xuXG4gIHR5cGVMaXN0ID0gZXhwbGljaXQgPyBzdGF0ZS5leHBsaWNpdFR5cGVzIDogc3RhdGUuaW1wbGljaXRUeXBlcztcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gdHlwZUxpc3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIHR5cGUgPSB0eXBlTGlzdFtpbmRleF07XG5cbiAgICBpZiAoKHR5cGUuaW5zdGFuY2VPZiAgfHwgdHlwZS5wcmVkaWNhdGUpICYmXG4gICAgICAgICghdHlwZS5pbnN0YW5jZU9mIHx8ICgodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcpICYmIChvYmplY3QgaW5zdGFuY2VvZiB0eXBlLmluc3RhbmNlT2YpKSkgJiZcbiAgICAgICAgKCF0eXBlLnByZWRpY2F0ZSAgfHwgdHlwZS5wcmVkaWNhdGUob2JqZWN0KSkpIHtcblxuICAgICAgc3RhdGUudGFnID0gZXhwbGljaXQgPyB0eXBlLnRhZyA6ICc/JztcblxuICAgICAgaWYgKHR5cGUucmVwcmVzZW50KSB7XG4gICAgICAgIHN0eWxlID0gc3RhdGUuc3R5bGVNYXBbdHlwZS50YWddIHx8IHR5cGUuZGVmYXVsdFN0eWxlO1xuXG4gICAgICAgIGlmIChfdG9TdHJpbmcuY2FsbCh0eXBlLnJlcHJlc2VudCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXScpIHtcbiAgICAgICAgICBfcmVzdWx0ID0gdHlwZS5yZXByZXNlbnQob2JqZWN0LCBzdHlsZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoX2hhc093blByb3BlcnR5LmNhbGwodHlwZS5yZXByZXNlbnQsIHN0eWxlKSkge1xuICAgICAgICAgIF9yZXN1bHQgPSB0eXBlLnJlcHJlc2VudFtzdHlsZV0ob2JqZWN0LCBzdHlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJyE8JyArIHR5cGUudGFnICsgJz4gdGFnIHJlc29sdmVyIGFjY2VwdHMgbm90IFwiJyArIHN0eWxlICsgJ1wiIHN0eWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZS5kdW1wID0gX3Jlc3VsdDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBTZXJpYWxpemVzIGBvYmplY3RgIGFuZCB3cml0ZXMgaXQgdG8gZ2xvYmFsIGByZXN1bHRgLlxuLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIG9yIGZhbHNlIG9uIGludmFsaWQgb2JqZWN0LlxuLy9cbmZ1bmN0aW9uIHdyaXRlTm9kZShzdGF0ZSwgbGV2ZWwsIG9iamVjdCwgYmxvY2ssIGNvbXBhY3QsIGlza2V5KSB7XG4gIHN0YXRlLnRhZyA9IG51bGw7XG4gIHN0YXRlLmR1bXAgPSBvYmplY3Q7XG5cbiAgaWYgKCFkZXRlY3RUeXBlKHN0YXRlLCBvYmplY3QsIGZhbHNlKSkge1xuICAgIGRldGVjdFR5cGUoc3RhdGUsIG9iamVjdCwgdHJ1ZSk7XG4gIH1cblxuICB2YXIgdHlwZSA9IF90b1N0cmluZy5jYWxsKHN0YXRlLmR1bXApO1xuXG4gIGlmIChibG9jaykge1xuICAgIGJsb2NrID0gKHN0YXRlLmZsb3dMZXZlbCA8IDAgfHwgc3RhdGUuZmxvd0xldmVsID4gbGV2ZWwpO1xuICB9XG5cbiAgdmFyIG9iamVjdE9yQXJyYXkgPSB0eXBlID09PSAnW29iamVjdCBPYmplY3RdJyB8fCB0eXBlID09PSAnW29iamVjdCBBcnJheV0nLFxuICAgICAgZHVwbGljYXRlSW5kZXgsXG4gICAgICBkdXBsaWNhdGU7XG5cbiAgaWYgKG9iamVjdE9yQXJyYXkpIHtcbiAgICBkdXBsaWNhdGVJbmRleCA9IHN0YXRlLmR1cGxpY2F0ZXMuaW5kZXhPZihvYmplY3QpO1xuICAgIGR1cGxpY2F0ZSA9IGR1cGxpY2F0ZUluZGV4ICE9PSAtMTtcbiAgfVxuXG4gIGlmICgoc3RhdGUudGFnICE9PSBudWxsICYmIHN0YXRlLnRhZyAhPT0gJz8nKSB8fCBkdXBsaWNhdGUgfHwgKHN0YXRlLmluZGVudCAhPT0gMiAmJiBsZXZlbCA+IDApKSB7XG4gICAgY29tcGFjdCA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKGR1cGxpY2F0ZSAmJiBzdGF0ZS51c2VkRHVwbGljYXRlc1tkdXBsaWNhdGVJbmRleF0pIHtcbiAgICBzdGF0ZS5kdW1wID0gJypyZWZfJyArIGR1cGxpY2F0ZUluZGV4O1xuICB9IGVsc2Uge1xuICAgIGlmIChvYmplY3RPckFycmF5ICYmIGR1cGxpY2F0ZSAmJiAhc3RhdGUudXNlZER1cGxpY2F0ZXNbZHVwbGljYXRlSW5kZXhdKSB7XG4gICAgICBzdGF0ZS51c2VkRHVwbGljYXRlc1tkdXBsaWNhdGVJbmRleF0gPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIGlmIChibG9jayAmJiAoT2JqZWN0LmtleXMoc3RhdGUuZHVtcCkubGVuZ3RoICE9PSAwKSkge1xuICAgICAgICB3cml0ZUJsb2NrTWFwcGluZyhzdGF0ZSwgbGV2ZWwsIHN0YXRlLmR1bXAsIGNvbXBhY3QpO1xuICAgICAgICBpZiAoZHVwbGljYXRlKSB7XG4gICAgICAgICAgc3RhdGUuZHVtcCA9ICcmcmVmXycgKyBkdXBsaWNhdGVJbmRleCArIHN0YXRlLmR1bXA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdyaXRlRmxvd01hcHBpbmcoc3RhdGUsIGxldmVsLCBzdGF0ZS5kdW1wKTtcbiAgICAgICAgaWYgKGR1cGxpY2F0ZSkge1xuICAgICAgICAgIHN0YXRlLmR1bXAgPSAnJnJlZl8nICsgZHVwbGljYXRlSW5kZXggKyAnICcgKyBzdGF0ZS5kdW1wO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnW29iamVjdCBBcnJheV0nKSB7XG4gICAgICB2YXIgYXJyYXlMZXZlbCA9IChzdGF0ZS5ub0FycmF5SW5kZW50ICYmIChsZXZlbCA+IDApKSA/IGxldmVsIC0gMSA6IGxldmVsO1xuICAgICAgaWYgKGJsb2NrICYmIChzdGF0ZS5kdW1wLmxlbmd0aCAhPT0gMCkpIHtcbiAgICAgICAgd3JpdGVCbG9ja1NlcXVlbmNlKHN0YXRlLCBhcnJheUxldmVsLCBzdGF0ZS5kdW1wLCBjb21wYWN0KTtcbiAgICAgICAgaWYgKGR1cGxpY2F0ZSkge1xuICAgICAgICAgIHN0YXRlLmR1bXAgPSAnJnJlZl8nICsgZHVwbGljYXRlSW5kZXggKyBzdGF0ZS5kdW1wO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3cml0ZUZsb3dTZXF1ZW5jZShzdGF0ZSwgYXJyYXlMZXZlbCwgc3RhdGUuZHVtcCk7XG4gICAgICAgIGlmIChkdXBsaWNhdGUpIHtcbiAgICAgICAgICBzdGF0ZS5kdW1wID0gJyZyZWZfJyArIGR1cGxpY2F0ZUluZGV4ICsgJyAnICsgc3RhdGUuZHVtcDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1tvYmplY3QgU3RyaW5nXScpIHtcbiAgICAgIGlmIChzdGF0ZS50YWcgIT09ICc/Jykge1xuICAgICAgICB3cml0ZVNjYWxhcihzdGF0ZSwgc3RhdGUuZHVtcCwgbGV2ZWwsIGlza2V5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXRlLnNraXBJbnZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbigndW5hY2NlcHRhYmxlIGtpbmQgb2YgYW4gb2JqZWN0IHRvIGR1bXAgJyArIHR5cGUpO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS50YWcgIT09IG51bGwgJiYgc3RhdGUudGFnICE9PSAnPycpIHtcbiAgICAgIHN0YXRlLmR1bXAgPSAnITwnICsgc3RhdGUudGFnICsgJz4gJyArIHN0YXRlLmR1bXA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldER1cGxpY2F0ZVJlZmVyZW5jZXMob2JqZWN0LCBzdGF0ZSkge1xuICB2YXIgb2JqZWN0cyA9IFtdLFxuICAgICAgZHVwbGljYXRlc0luZGV4ZXMgPSBbXSxcbiAgICAgIGluZGV4LFxuICAgICAgbGVuZ3RoO1xuXG4gIGluc3BlY3ROb2RlKG9iamVjdCwgb2JqZWN0cywgZHVwbGljYXRlc0luZGV4ZXMpO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBkdXBsaWNhdGVzSW5kZXhlcy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgc3RhdGUuZHVwbGljYXRlcy5wdXNoKG9iamVjdHNbZHVwbGljYXRlc0luZGV4ZXNbaW5kZXhdXSk7XG4gIH1cbiAgc3RhdGUudXNlZER1cGxpY2F0ZXMgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24gaW5zcGVjdE5vZGUob2JqZWN0LCBvYmplY3RzLCBkdXBsaWNhdGVzSW5kZXhlcykge1xuICB2YXIgb2JqZWN0S2V5TGlzdCxcbiAgICAgIGluZGV4LFxuICAgICAgbGVuZ3RoO1xuXG4gIGlmIChvYmplY3QgIT09IG51bGwgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcpIHtcbiAgICBpbmRleCA9IG9iamVjdHMuaW5kZXhPZihvYmplY3QpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIGlmIChkdXBsaWNhdGVzSW5kZXhlcy5pbmRleE9mKGluZGV4KSA9PT0gLTEpIHtcbiAgICAgICAgZHVwbGljYXRlc0luZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG9iamVjdHMucHVzaChvYmplY3QpO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgIGluc3BlY3ROb2RlKG9iamVjdFtpbmRleF0sIG9iamVjdHMsIGR1cGxpY2F0ZXNJbmRleGVzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqZWN0S2V5TGlzdCA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgICAgICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdEtleUxpc3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgIGluc3BlY3ROb2RlKG9iamVjdFtvYmplY3RLZXlMaXN0W2luZGV4XV0sIG9iamVjdHMsIGR1cGxpY2F0ZXNJbmRleGVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkdW1wKGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIHZhciBzdGF0ZSA9IG5ldyBTdGF0ZShvcHRpb25zKTtcblxuICBpZiAoIXN0YXRlLm5vUmVmcykgZ2V0RHVwbGljYXRlUmVmZXJlbmNlcyhpbnB1dCwgc3RhdGUpO1xuXG4gIGlmICh3cml0ZU5vZGUoc3RhdGUsIDAsIGlucHV0LCB0cnVlLCB0cnVlKSkgcmV0dXJuIHN0YXRlLmR1bXAgKyAnXFxuJztcblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIHNhZmVEdW1wKGlucHV0LCBvcHRpb25zKSB7XG4gIHJldHVybiBkdW1wKGlucHV0LCBjb21tb24uZXh0ZW5kKHsgc2NoZW1hOiBERUZBVUxUX1NBRkVfU0NIRU1BIH0sIG9wdGlvbnMpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMuZHVtcCAgICAgPSBkdW1wO1xubW9kdWxlLmV4cG9ydHMuc2FmZUR1bXAgPSBzYWZlRHVtcDtcbiIsICIndXNlIHN0cmljdCc7XG5cblxudmFyIGxvYWRlciA9IHJlcXVpcmUoJy4vanMteWFtbC9sb2FkZXInKTtcbnZhciBkdW1wZXIgPSByZXF1aXJlKCcuL2pzLXlhbWwvZHVtcGVyJyk7XG5cblxuZnVuY3Rpb24gZGVwcmVjYXRlZChuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGdW5jdGlvbiAnICsgbmFtZSArICcgaXMgZGVwcmVjYXRlZCBhbmQgY2Fubm90IGJlIHVzZWQuJyk7XG4gIH07XG59XG5cblxubW9kdWxlLmV4cG9ydHMuVHlwZSAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC90eXBlJyk7XG5tb2R1bGUuZXhwb3J0cy5TY2hlbWEgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYScpO1xubW9kdWxlLmV4cG9ydHMuRkFJTFNBRkVfU0NIRU1BICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZmFpbHNhZmUnKTtcbm1vZHVsZS5leHBvcnRzLkpTT05fU0NIRU1BICAgICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2pzb24nKTtcbm1vZHVsZS5leHBvcnRzLkNPUkVfU0NIRU1BICAgICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2NvcmUnKTtcbm1vZHVsZS5leHBvcnRzLkRFRkFVTFRfU0FGRV9TQ0hFTUEgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfc2FmZScpO1xubW9kdWxlLmV4cG9ydHMuREVGQVVMVF9GVUxMX1NDSEVNQSA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZGVmYXVsdF9mdWxsJyk7XG5tb2R1bGUuZXhwb3J0cy5sb2FkICAgICAgICAgICAgICAgID0gbG9hZGVyLmxvYWQ7XG5tb2R1bGUuZXhwb3J0cy5sb2FkQWxsICAgICAgICAgICAgID0gbG9hZGVyLmxvYWRBbGw7XG5tb2R1bGUuZXhwb3J0cy5zYWZlTG9hZCAgICAgICAgICAgID0gbG9hZGVyLnNhZmVMb2FkO1xubW9kdWxlLmV4cG9ydHMuc2FmZUxvYWRBbGwgICAgICAgICA9IGxvYWRlci5zYWZlTG9hZEFsbDtcbm1vZHVsZS5leHBvcnRzLmR1bXAgICAgICAgICAgICAgICAgPSBkdW1wZXIuZHVtcDtcbm1vZHVsZS5leHBvcnRzLnNhZmVEdW1wICAgICAgICAgICAgPSBkdW1wZXIuc2FmZUR1bXA7XG5tb2R1bGUuZXhwb3J0cy5ZQU1MRXhjZXB0aW9uICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL2V4Y2VwdGlvbicpO1xuXG4vLyBEZXByZWNhdGVkIHNjaGVtYSBuYW1lcyBmcm9tIEpTLVlBTUwgMi4wLnhcbm1vZHVsZS5leHBvcnRzLk1JTklNQUxfU0NIRU1BID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9mYWlsc2FmZScpO1xubW9kdWxlLmV4cG9ydHMuU0FGRV9TQ0hFTUEgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfc2FmZScpO1xubW9kdWxlLmV4cG9ydHMuREVGQVVMVF9TQ0hFTUEgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfZnVsbCcpO1xuXG4vLyBEZXByZWNhdGVkIGZ1bmN0aW9ucyBmcm9tIEpTLVlBTUwgMS54Lnhcbm1vZHVsZS5leHBvcnRzLnNjYW4gICAgICAgICAgID0gZGVwcmVjYXRlZCgnc2NhbicpO1xubW9kdWxlLmV4cG9ydHMucGFyc2UgICAgICAgICAgPSBkZXByZWNhdGVkKCdwYXJzZScpO1xubW9kdWxlLmV4cG9ydHMuY29tcG9zZSAgICAgICAgPSBkZXByZWNhdGVkKCdjb21wb3NlJyk7XG5tb2R1bGUuZXhwb3J0cy5hZGRDb25zdHJ1Y3RvciA9IGRlcHJlY2F0ZWQoJ2FkZENvbnN0cnVjdG9yJyk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB5YW1sID0gcmVxdWlyZSgnLi9saWIvanMteWFtbC5qcycpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0geWFtbDtcbiIsICJpbXBvcnQgeyB0aW1pbmdTYWZlRXF1YWwgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQge1xuXHRBcHAsXG5cdEVkaXRhYmxlRmlsZVZpZXcsXG5cdHJlcXVlc3RVcmwsXG5cdEVkaXRvcixcblx0TWFya2Rvd25WaWV3LFxuXHRNb2RhbCxcblx0Tm90aWNlLFxuXHRQbHVnaW4sXG5cdFBsdWdpblNldHRpbmdUYWIsXG5cdFNldHRpbmcsXG59IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7YWRkSWNvbnN9ICBmcm9tICdpY29uJztcbmltcG9ydCB7IFVwbG9hZDJOb3Rpb24gfSBmcm9tIFwiVXBsb2FkMk5vdGlvblwiO1xuXG4vLyBSZW1lbWJlciB0byByZW5hbWUgdGhlc2UgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyFcblxuaW50ZXJmYWNlIE15UGx1Z2luU2V0dGluZ3Mge1xuXHRub3Rpb25BUEk6IHN0cmluZztcblx0ZGF0YWJhc2VJRDogc3RyaW5nO1xuXHRwcm94eTogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUX1NFVFRJTkdTOiBNeVBsdWdpblNldHRpbmdzID0ge1xuXHRub3Rpb25BUEk6IFwiXCIsXG5cdGRhdGFiYXNlSUQ6IFwiXCIsXG5cdHByb3h5OiBcIlwiLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTXlQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuXHRzZXR0aW5nczogTXlQbHVnaW5TZXR0aW5ncztcblx0XG5cdGFzeW5jIG9ubG9hZCgpIHtcblx0XHRhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xuXHRcdGFkZEljb25zKCk7XG5cdFx0Ly8gVGhpcyBjcmVhdGVzIGFuIGljb24gaW4gdGhlIGxlZnQgcmliYm9uLlxuXHRcdGNvbnN0IHJpYmJvbkljb25FbCA9IHRoaXMuYWRkUmliYm9uSWNvbihcblx0XHRcdFwibm90aW9uLWxvZ29cIixcblx0XHRcdFwiU2hhcmUgdG8gbm90aW9uXCIsXG5cdFx0XHRhc3luYyAoZXZ0OiBNb3VzZUV2ZW50KSA9PiB7XG5cdFx0XHRcdC8vIENhbGxlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgaWNvbi5cblx0XHRcdFx0dGhpcy51cGxvYWQoKTtcblx0XHRcdH1cblx0XHQpO1xuXHRcdC8vIFBlcmZvcm0gYWRkaXRpb25hbCB0aGluZ3Mgd2l0aCB0aGUgcmliYm9uXG5cdFx0cmliYm9uSWNvbkVsLmFkZENsYXNzKFwibXktcGx1Z2luLXJpYmJvbi1jbGFzc1wiKTtcblxuXHRcdC8vIFRoaXMgYWRkcyBhIHN0YXR1cyBiYXIgaXRlbSB0byB0aGUgYm90dG9tIG9mIHRoZSBhcHAuIERvZXMgbm90IHdvcmsgb24gbW9iaWxlIGFwcHMuXG5cdFx0Y29uc3Qgc3RhdHVzQmFySXRlbUVsID0gdGhpcy5hZGRTdGF0dXNCYXJJdGVtKCk7XG5cdFx0Ly8gc3RhdHVzQmFySXRlbUVsLnNldFRleHQoXCJzaGFyZSB0byBub3Rpb25cIik7XG5cblx0XHR0aGlzLmFkZENvbW1hbmQoe1xuXHRcdFx0aWQ6IFwic2hhcmUtdG8tbm90aW9uXCIsXG5cdFx0XHRuYW1lOiBcInNoYXJlIHRvIG5vdGlvblwiLFxuXHRcdFx0ZWRpdG9yQ2FsbGJhY2s6IGFzeW5jIChlZGl0b3I6IEVkaXRvciwgdmlldzogTWFya2Rvd25WaWV3KSA9PiB7XG5cdFx0XHRcdHRoaXMudXBsb2FkKClcblx0XHRcdH0sXG5cdFx0fSk7XG5cblxuXHRcdC8vIFRoaXMgYWRkcyBhIHNldHRpbmdzIHRhYiBzbyB0aGUgdXNlciBjYW4gY29uZmlndXJlIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgcGx1Z2luXG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBTYW1wbGVTZXR0aW5nVGFiKHRoaXMuYXBwLCB0aGlzKSk7XG5cblx0fVxuXG5cdG9udW5sb2FkKCkge31cblxuXHRhc3luYyB1cGxvYWQoKXtcblx0XHRjb25zdCB7IG5vdGlvbkFQSSwgZGF0YWJhc2VJRCB9ID0gdGhpcy5zZXR0aW5ncztcblx0XHRcdFx0aWYgKG5vdGlvbkFQSSA9PT0gXCJcIiB8fCBkYXRhYmFzZUlEID09PSBcIlwiKSB7XG5cdFx0XHRcdFx0bmV3IE5vdGljZShcblx0XHRcdFx0XHRcdFwiUGxlYXNlIHNldCB1cCB0aGUgbm90aW9uIEFQSSBhbmQgZGF0YWJhc2UgSUQgaW4gdGhlIHNldHRpbmdzIHRhYi5cIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IHsgbm93RmlsZSwgZmlsZURhdGEsZnVsbFBhdGggfSA9XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5nZXROb3dGaWxlTWFya2R3b25Db250ZW50KHRoaXMuYXBwKTtcblx0XHRcdFx0Y29uc3QgeyBiYXNlbmFtZSB9ID0gbm93RmlsZTtcblx0XHRcdFx0aWYgKGZpbGVEYXRhKSB7XG5cdFx0XHRcdFx0Y29uc3QgdXBsb2FkID0gbmV3IFVwbG9hZDJOb3Rpb24odGhpcyk7XG5cdFx0XHRcdFx0Y29uc3QgcmVzID0gYXdhaXQgdXBsb2FkLnN5bmNNYXJrZG93blRvTm90aW9uKGJhc2VuYW1lLGZpbGVEYXRhLCBmdWxsUGF0aClcblx0XHRcdFx0XHRjb25zb2xlLmxvZyhyZXMpXG5cdFx0XHRcdFx0aWYocmVzLnN0YXR1cyA9PT0gMjAwKXtcblx0XHRcdFx0XHRcdG5ldyBOb3RpY2UoYCR7YmFzZW5hbWV9IFx1NTQwQ1x1NkI2NVx1NjIxMFx1NTI5RmApXG5cdFx0XHRcdFx0fWVsc2Uge1xuXHRcdFx0XHRcdFx0bmV3IE5vdGljZShgJHtiYXNlbmFtZX0gXHU1NDBDXHU2QjY1XHU1OTMxXHU4RDI1YClcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0fVxuXG5cdGFzeW5jIGdldE5vd0ZpbGVNYXJrZHdvbkNvbnRlbnQoYXBwOiBBcHApIHtcblx0XHRjb25zdCBub3dGaWxlID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKCk7XG5cdFx0aWYgKG5vd0ZpbGUpIHtcblx0XHRcdGNvbnN0IGZpbGVQYXRoOiBzdHJpbmcgPSBub3dGaWxlLnBhdGg7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRjb25zdCBiYXNlUGF0aDogc3RyaW5nID0gbm93RmlsZS52YXVsdC5hZGFwdGVyLmJhc2VQYXRoO1xuXHRcdFx0Y29uc3QgZnVsbFBhdGggPSBqb2luKGJhc2VQYXRoLCBmaWxlUGF0aCk7XG5cdFx0XHRjb25zb2xlLmxvZyhcImZ1bGxwYXRoXCIsIGZ1bGxQYXRoKTtcblx0XHRcdGNvbnN0IGZpbGVEYXRhID0gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCBcInV0ZjhcIik7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRmaWxlRGF0YSxcblx0XHRcdFx0bm93RmlsZSxcblx0XHRcdFx0ZnVsbFBhdGgsXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRuZXcgTm90aWNlKFwiXHU4QkY3XHU2MjUzXHU1RjAwXHU5NzAwXHU4OTgxXHU1NDBDXHU2QjY1XHU3Njg0XHU2NTg3XHU0RUY2XCIpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbihcblx0XHRcdHt9LFxuXHRcdFx0REVGQVVMVF9TRVRUSU5HUyxcblx0XHRcdGF3YWl0IHRoaXMubG9hZERhdGEoKVxuXHRcdCk7XG5cdH1cblxuXHRhc3luYyBzYXZlU2V0dGluZ3MoKSB7XG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcblx0fVxufVxuXG5jbGFzcyBTYW1wbGVNb2RhbCBleHRlbmRzIE1vZGFsIHtcblx0Y29uc3RydWN0b3IoYXBwOiBBcHApIHtcblx0XHRzdXBlcihhcHApO1xuXHR9XG5cblx0b25PcGVuKCkge1xuXHRcdGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xuXHRcdGNvbnRlbnRFbC5zZXRUZXh0KFwiV29haCFcIik7XG5cdH1cblxuXHRvbkNsb3NlKCkge1xuXHRcdGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xuXHRcdGNvbnRlbnRFbC5lbXB0eSgpO1xuXHR9XG59XG5cbmNsYXNzIFNhbXBsZVNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcblx0cGx1Z2luOiBNeVBsdWdpbjtcblxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBNeVBsdWdpbikge1xuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblx0fVxuXG5cdGRpc3BsYXkoKTogdm9pZCB7XG5cdFx0Y29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpcztcblxuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcImgyXCIsIHtcblx0XHRcdHRleHQ6IFwiU2V0dGluZ3MgZm9yIG9ic2lkaWFuIHRvIG5vdGlvbiBwbHVnaW4uXCIsXG5cdFx0fSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiTm90aW9uIEFQSSBUb2tlblwiKVxuXHRcdFx0LnNldERlc2MoXCJJdCdzIGEgc2VjcmV0XCIpXG5cdFx0XHQuYWRkVGV4dCgodGV4dCkgPT5cblx0XHRcdFx0dGV4dFxuXHRcdFx0XHRcdC5zZXRQbGFjZWhvbGRlcihcIkVudGVyIHlvdXIgTm90aW9uIEFQSSBUb2tlblwiKVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5ub3Rpb25BUEkpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc29sZS5sb2coXCJTZWNyZXQ6IFwiICsgdmFsdWUpO1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Mubm90aW9uQVBJID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoXCJEYXRhYmFzZSBJRFwiKVxuXHRcdFx0LnNldERlc2MoXCJJdCdzIGEgc2VjcmV0XCIpXG5cdFx0XHQuYWRkVGV4dCgodGV4dCkgPT5cblx0XHRcdFx0dGV4dFxuXHRcdFx0XHRcdC5zZXRQbGFjZWhvbGRlcihcIkVudGVyIHlvdXIgRGF0YWJhc2UgSURcIilcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGF0YWJhc2VJRClcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhcIlNlY3JldDogXCIgKyB2YWx1ZSk7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5kYXRhYmFzZUlEID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHR9XG59XG4iLCAiaW1wb3J0IHsgYWRkSWNvbiB9IGZyb20gJ29ic2lkaWFuJztcblxuY29uc3QgaWNvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICdub3Rpb24tbG9nbyc6IGBcbiAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgd2lkdGg9XCIxMDBweFwiIGhlaWdodD1cIjEwMHB4XCIgdmlld0JveD1cIjAgMCAxMDAgMTAwXCIgdmVyc2lvbj1cIjEuMVwiPlxuPGcgaWQ9XCJzdXJmYWNlMVwiPlxuPHBhdGggc3R5bGU9XCIgc3Ryb2tlOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7ZmlsbDpjdXJyZW50Q29sb3I7ZmlsbC1vcGFjaXR5OjE7XCIgZD1cIk0gMTguNzM4MjgxIDE3Ljc5Njg3NSBDIDIxLjgzMjAzMSAyMC4zMDg1OTQgMjIuOTk2MDk0IDIwLjExNzE4OCAyOC44MDQ2ODggMTkuNzMwNDY5IEwgODMuNTgyMDMxIDE2LjQ0MTQwNiBDIDg0Ljc0NjA5NCAxNi40NDE0MDYgODMuNzgxMjUgMTUuMjgxMjUgODMuMzkwNjI1IDE1LjA4OTg0NCBMIDc0LjI5Mjk2OSA4LjUxMTcxOSBDIDcyLjU1MDc4MSA3LjE2MDE1NiA3MC4yMzA0NjkgNS42MDkzNzUgNjUuNzc3MzQ0IDUuOTk2MDk0IEwgMTIuNzM0Mzc1IDkuODY3MTg4IEMgMTAuODAwNzgxIDEwLjA1ODU5NCAxMC40MTQwNjIgMTEuMDIzNDM4IDExLjE4MzU5NCAxMS44MDA3ODEgWiBNIDIyLjAyNzM0NCAzMC41NjI1IEwgMjIuMDI3MzQ0IDg4LjE5OTIxOSBDIDIyLjAyNzM0NCA5MS4yOTY4NzUgMjMuNTc0MjE5IDkyLjQ1NzAzMSAyNy4wNTg1OTQgOTIuMjY1NjI1IEwgODcuMjYxNzE5IDg4Ljc4MTI1IEMgOTAuNzQ2MDk0IDg4LjU4OTg0NCA5MS4xMzY3MTkgODYuNDU3MDMxIDkxLjEzNjcxOSA4My45NDE0MDYgTCA5MS4xMzY3MTkgMjYuNjkxNDA2IEMgOTEuMTM2NzE5IDI0LjE3OTY4OCA5MC4xNjc5NjkgMjIuODI0MjE5IDg4LjAzNTE1NiAyMy4wMTk1MzEgTCAyNS4xMjUgMjYuNjkxNDA2IEMgMjIuODAwNzgxIDI2Ljg4NjcxOSAyMi4wMjczNDQgMjguMDQ2ODc1IDIyLjAyNzM0NCAzMC41NjI1IFogTSA4MS40NjA5MzggMzMuNjUyMzQ0IEMgODEuODQzNzUgMzUuMzk4NDM4IDgxLjQ2MDkzOCAzNy4xMzY3MTkgNzkuNzE0ODQ0IDM3LjMzMjAzMSBMIDc2LjgxMjUgMzcuOTEwMTU2IEwgNzYuODEyNSA4MC40NjA5MzggQyA3NC4yOTI5NjkgODEuODE2NDA2IDcxLjk3MjY1NiA4Mi41ODk4NDQgNzAuMDM1MTU2IDgyLjU4OTg0NCBDIDY2LjkzNzUgODIuNTg5ODQ0IDY2LjE2NDA2MiA4MS42MjEwOTQgNjMuODM5ODQ0IDc4LjcyMjY1NiBMIDQ0Ljg2NzE4OCA0OC45Mzc1IEwgNDQuODY3MTg4IDc3Ljc1MzkwNiBMIDUwLjg3MTA5NCA3OS4xMDkzNzUgQyA1MC44NzEwOTQgNzkuMTA5Mzc1IDUwLjg3MTA5NCA4Mi41ODk4NDQgNDYuMDI3MzQ0IDgyLjU4OTg0NCBMIDMyLjY3NTc4MSA4My4zNjMyODEgQyAzMi4yODUxNTYgODIuNTg5ODQ0IDMyLjY3NTc4MSA4MC42NTYyNSAzNC4wMjczNDQgODAuMjY5NTMxIEwgMzcuNTExNzE5IDc5LjMwNDY4OCBMIDM3LjUxMTcxOSA0MS4xOTkyMTkgTCAzMi42NzU3ODEgNDAuODEyNSBDIDMyLjI4NTE1NiAzOS4wNzAzMTIgMzMuMjUzOTA2IDM2LjU1ODU5NCAzNS45NjQ4NDQgMzYuMzYzMjgxIEwgNTAuMjkyOTY5IDM1LjM5ODQzOCBMIDcwLjAzNTE1NiA2NS41NzAzMTIgTCA3MC4wMzUxNTYgMzguODc4OTA2IEwgNjUuMDAzOTA2IDM4LjMwMDc4MSBDIDY0LjYxNzE4OCAzNi4xNzE4NzUgNjYuMTY0MDYyIDM0LjYyNSA2OC4wOTc2NTYgMzQuNDMzNTk0IFogTSA4LjI4MTI1IDQuNjQ0NTMxIEwgNjMuNDUzMTI1IDAuNTgyMDMxIEMgNzAuMjMwNDY5IDAgNzEuOTcyNjU2IDAuMzkwNjI1IDc2LjIzMDQ2OSAzLjQ4NDM3NSBMIDkzLjg0Mzc1IDE1Ljg1OTM3NSBDIDk2Ljc1IDE3Ljk4ODI4MSA5Ny43MTg3NSAxOC41NzAzMTIgOTcuNzE4NzUgMjAuODkwNjI1IEwgOTcuNzE4NzUgODguNzgxMjUgQyA5Ny43MTg3NSA5My4wMzUxNTYgOTYuMTY3OTY5IDk1LjU1MDc4MSA5MC43NSA5NS45Mzc1IEwgMjYuNjc1NzgxIDk5LjgwNDY4OCBDIDIyLjYwOTM3NSAxMDAgMjAuNjcxODc1IDk5LjQyMTg3NSAxOC41NDI5NjkgOTYuNzEwOTM4IEwgNS41NzQyMTkgNzkuODgyODEyIEMgMy4yNSA3Ni43ODUxNTYgMi4yODEyNSA3NC40Njg3NSAyLjI4MTI1IDcxLjc1NzgxMiBMIDIuMjgxMjUgMTEuNDEwMTU2IEMgMi4yODEyNSA3LjkzMzU5NCAzLjgzMjAzMSA1LjAzMTI1IDguMjgxMjUgNC42NDQ1MzEgWiBNIDguMjgxMjUgNC42NDQ1MzEgXCIvPlxuPC9nPlxuPC9zdmc+XG4gIGBcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRJY29ucyA9ICgpOiB2b2lkID0+IHtcbiAgT2JqZWN0LmtleXMoaWNvbnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGFkZEljb24oa2V5LCBpY29uc1trZXldKTtcbiAgfSk7XG59O1xuIiwgImltcG9ydCB7IHJlcXVlc3RVcmwgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IENsaWVudCB9IGZyb20gXCJAbm90aW9uaHEvY2xpZW50XCI7XG5pbXBvcnQgeyBtYXJrZG93blRvQmxvY2tzLCAgfSBmcm9tIFwiQHRyeWZhYnJpYy9tYXJ0aWFuXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHlhbWxGcm9udE1hdHRlciBmcm9tIFwieWFtbC1mcm9udC1tYXR0ZXJcIjtcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSBcInlhbWxcIlxuaW1wb3J0IE15UGx1Z2luIGZyb20gXCJtYWluXCI7XG5cbmV4cG9ydCBjbGFzcyBVcGxvYWQyTm90aW9uIHtcblx0YXBwOiBNeVBsdWdpbjtcblx0bm90aW9uOiBDbGllbnQ7XG5cdGFnZW50OiBhbnk7XG5cdGNvbnN0cnVjdG9yKGFwcDogTXlQbHVnaW4pIHtcblx0XHR0aGlzLmFwcCA9IGFwcDtcblx0fVxuXHRhc3luYyBjcmVhdGVQYWdlKHRpdGxlOnN0cmluZywgY2hpbGRBcnI6IGFueSkge1xuXHRcdGNvbnN0IGJvZHlTdHJpbmcgPSB7XG5cdFx0XHRwYXJlbnQ6IHsgXG5cdFx0XHRcdGRhdGFiYXNlX2lkOiB0aGlzLmFwcC5zZXR0aW5ncy5kYXRhYmFzZUlEIFxuXHRcdFx0fSxcblx0XHRcdHByb3BlcnRpZXM6IHtcblx0XHRcdFx0TmFtZToge1xuXHRcdFx0XHRcdHRpdGxlOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IHtcblx0XHRcdFx0XHRcdFx0XHRjb250ZW50OiB0aXRsZSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHRjaGlsZHJlbjogY2hpbGRBcnIsXG5cdFx0fVxuXHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdFVybCh7XG5cdFx0XHR1cmw6IGBodHRwczovL2FwaS5ub3Rpb24uY29tL3YxL3BhZ2VzYCxcblx0XHRcdG1ldGhvZDogJ1BPU1QnLFxuXHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHQnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuXHRcdFx0XHQvLyAnVXNlci1BZ2VudCc6ICdvYnNpZGlhbi5tZCcsXG5cdFx0XHRcdCdBdXRob3JpemF0aW9uJzogJ0JlYXJlciAnICsgdGhpcy5hcHAuc2V0dGluZ3Mubm90aW9uQVBJLFxuXHRcdFx0XHQnTm90aW9uLVZlcnNpb24nOiAnMjAyMS0wOC0xNicsXG5cdFx0XHR9LFxuXHRcdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoYm9keVN0cmluZyksXG5cdFx0fSlcblx0XHRyZXR1cm4gcmVzcG9uc2U7XG5cdH1cblxuXHRhc3luYyBzeW5jTWFya2Rvd25Ub05vdGlvbih0aXRsZTpzdHJpbmcsIG1hcmtkb3duOiBzdHJpbmcsIGZ1bGxQYXRoOnN0cmluZyk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgeWFtbE9iajphbnkgPSB5YW1sRnJvbnRNYXR0ZXIubG9hZEZyb250KG1hcmtkb3duKTtcblx0XHRjb25zdCBfX2NvbnRlbnQgPSB5YW1sT2JqLl9fY29udGVudFxuXHRcdGNvbnN0IGZpbGUybWQgPSBtYXJrZG93blRvQmxvY2tzKF9fY29udGVudCk7XG5cdFx0Y29uc3QgcmVzID0gYXdhaXQgdGhpcy5jcmVhdGVQYWdlKHRpdGxlLCBmaWxlMm1kKTtcblx0XHRpZiAocmVzLnN0YXR1cyA9PT0gMjAwKSB7XG5cdFx0XHR0aGlzLnVwZGF0ZVlhbWxJbmZvKG1hcmtkb3duLCBmdWxsUGF0aCwgcmVzKVxuXHRcdH1cblx0XHRyZXR1cm4gcmVzXG5cdH1cblxuXHRhc3luYyB1cGRhdGVZYW1sSW5mbyh5YW1sQ29udGVudDogc3RyaW5nLCBmdWxsUGF0aDogc3RyaW5nLCByZXM6IGFueSkge1xuXHRcdGNvbnN0IHlhbWxPYmo6YW55ID0geWFtbEZyb250TWF0dGVyLmxvYWRGcm9udCh5YW1sQ29udGVudCk7XG5cdFx0Y29uc3Qge3VybH0gPSByZXMuanNvblxuXHRcdHlhbWxPYmoubGluayA9IHVybDtcblx0XHRjb25zdCBfX2NvbnRlbnQgPSB5YW1sT2JqLl9fY29udGVudDtcblx0XHRkZWxldGUgeWFtbE9iai5fX2NvbnRlbnRcblx0XHRjb25zdCB5YW1saGVhZCA9IHlhbWwuc3RyaW5naWZ5KHlhbWxPYmopXG5cdFx0Ly8gIGlmIHlhbWxoZWFkIGhhdmEgbGFzdCBcXG4gIHJlbW92ZSBpdFxuXHRcdGNvbnN0IHlhbWxoZWFkX3JlbW92ZV9uID0geWFtbGhlYWQucmVwbGFjZSgvXFxuJC8sICcnKVxuXHRcdC8vIGlmIF9fY29udGVudCBoYXZlIHN0YXJ0IFxcbiByZW1vdmUgaXRcblx0XHRjb25zdCBfX2NvbnRlbnRfcmVtb3ZlX24gPSBfX2NvbnRlbnQucmVwbGFjZSgvXlxcbi8sICcnKVxuXHRcdGNvbnN0IGNvbnRlbnQgPSAnLS0tXFxuJyAreWFtbGhlYWRfcmVtb3ZlX24gKydcXG4tLS1cXG4nICsgX19jb250ZW50X3JlbW92ZV9uO1xuXG5cdFx0Ly93cml0ZSBjb250ZW50IGZvIGZpbGVcblx0XHRmcy53cml0ZUZpbGVTeW5jKGZ1bGxQYXRoLCBjb250ZW50KTtcblx0XHRyZXR1cm4gcmVzXG5cdH1cbn1cbiIsICJ2YXIganNZYW1sID0gcmVxdWlyZSgnanMteWFtbCcpO1xuXG5mdW5jdGlvbiBwYXJzZSh0ZXh0LCBvcHRpb25zLCBsb2FkU2FmZSkge1xuICAgIGxldCBjb250ZW50S2V5TmFtZSA9IG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnXG4gICAgICAgID8gb3B0aW9uc1xuICAgICAgICA6IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZW50S2V5TmFtZSBcbiAgICAgICAgICAgID8gb3B0aW9ucy5jb250ZW50S2V5TmFtZSBcbiAgICAgICAgICAgIDogJ19fY29udGVudCc7XG5cbiAgICBsZXQgcGFzc1Rocm91Z2hPcHRpb25zID0gb3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCdcbiAgICAgICAgPyBvcHRpb25zXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgbGV0IHJlID0gL14oLXszfSg/OlxcbnxcXHIpKFtcXHdcXFddKz8pKD86XFxufFxcciktezN9KT8oW1xcd1xcV10qKSovXG4gICAgICAgICwgcmVzdWx0cyA9IHJlLmV4ZWModGV4dClcbiAgICAgICAgLCBjb25mID0ge31cbiAgICAgICAgLCB5YW1sT3JKc29uO1xuXG4gICAgaWYgKCh5YW1sT3JKc29uID0gcmVzdWx0c1syXSkpIHtcbiAgICAgICAgaWYgKHlhbWxPckpzb24uY2hhckF0KDApID09PSAneycpIHtcbiAgICAgICAgICAgIGNvbmYgPSBKU09OLnBhcnNlKHlhbWxPckpzb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYobG9hZFNhZmUpIHtcbiAgICAgICAgICAgICAgICBjb25mID0ganNZYW1sLnNhZmVMb2FkKHlhbWxPckpzb24sIHBhc3NUaHJvdWdoT3B0aW9ucyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbmYgPSBqc1lhbWwubG9hZCh5YW1sT3JKc29uLCBwYXNzVGhyb3VnaE9wdGlvbnMpOyBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbmZbY29udGVudEtleU5hbWVdID0gcmVzdWx0c1szXSB8fCAnJztcblxuICAgIHJldHVybiBjb25mO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRGcm9udCAoY29udGVudCwgb3B0aW9ucykge1xuICAgIHJldHVybiBwYXJzZShjb250ZW50LCBvcHRpb25zLCBmYWxzZSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gc2FmZUxvYWRGcm9udCAoY29udGVudCwgb3B0aW9ucykge1xuICAgIHJldHVybiBwYXJzZShjb250ZW50LCBvcHRpb25zLCB0cnVlKVxufVxuIiwgImNvbnN0IEFMSUFTID0gU3ltYm9sLmZvcigneWFtbC5hbGlhcycpO1xuY29uc3QgRE9DID0gU3ltYm9sLmZvcigneWFtbC5kb2N1bWVudCcpO1xuY29uc3QgTUFQID0gU3ltYm9sLmZvcigneWFtbC5tYXAnKTtcbmNvbnN0IFBBSVIgPSBTeW1ib2wuZm9yKCd5YW1sLnBhaXInKTtcbmNvbnN0IFNDQUxBUiA9IFN5bWJvbC5mb3IoJ3lhbWwuc2NhbGFyJyk7XG5jb25zdCBTRVEgPSBTeW1ib2wuZm9yKCd5YW1sLnNlcScpO1xuY29uc3QgTk9ERV9UWVBFID0gU3ltYm9sLmZvcigneWFtbC5ub2RlLnR5cGUnKTtcbmNvbnN0IGlzQWxpYXMgPSAobm9kZSkgPT4gISFub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBub2RlW05PREVfVFlQRV0gPT09IEFMSUFTO1xuY29uc3QgaXNEb2N1bWVudCA9IChub2RlKSA9PiAhIW5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIG5vZGVbTk9ERV9UWVBFXSA9PT0gRE9DO1xuY29uc3QgaXNNYXAgPSAobm9kZSkgPT4gISFub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBub2RlW05PREVfVFlQRV0gPT09IE1BUDtcbmNvbnN0IGlzUGFpciA9IChub2RlKSA9PiAhIW5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIG5vZGVbTk9ERV9UWVBFXSA9PT0gUEFJUjtcbmNvbnN0IGlzU2NhbGFyID0gKG5vZGUpID0+ICEhbm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZVtOT0RFX1RZUEVdID09PSBTQ0FMQVI7XG5jb25zdCBpc1NlcSA9IChub2RlKSA9PiAhIW5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIG5vZGVbTk9ERV9UWVBFXSA9PT0gU0VRO1xuZnVuY3Rpb24gaXNDb2xsZWN0aW9uKG5vZGUpIHtcbiAgICBpZiAobm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcpXG4gICAgICAgIHN3aXRjaCAobm9kZVtOT0RFX1RZUEVdKSB7XG4gICAgICAgICAgICBjYXNlIE1BUDpcbiAgICAgICAgICAgIGNhc2UgU0VROlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNOb2RlKG5vZGUpIHtcbiAgICBpZiAobm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcpXG4gICAgICAgIHN3aXRjaCAobm9kZVtOT0RFX1RZUEVdKSB7XG4gICAgICAgICAgICBjYXNlIEFMSUFTOlxuICAgICAgICAgICAgY2FzZSBNQVA6XG4gICAgICAgICAgICBjYXNlIFNDQUxBUjpcbiAgICAgICAgICAgIGNhc2UgU0VROlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuY29uc3QgaGFzQW5jaG9yID0gKG5vZGUpID0+IChpc1NjYWxhcihub2RlKSB8fCBpc0NvbGxlY3Rpb24obm9kZSkpICYmICEhbm9kZS5hbmNob3I7XG5jbGFzcyBOb2RlQmFzZSB7XG4gICAgY29uc3RydWN0b3IodHlwZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgTk9ERV9UWVBFLCB7IHZhbHVlOiB0eXBlIH0pO1xuICAgIH1cbiAgICAvKiogQ3JlYXRlIGEgY29weSBvZiB0aGlzIG5vZGUuICAqL1xuICAgIGNsb25lKCkge1xuICAgICAgICBjb25zdCBjb3B5ID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHRoaXMpKTtcbiAgICAgICAgaWYgKHRoaXMucmFuZ2UpXG4gICAgICAgICAgICBjb3B5LnJhbmdlID0gdGhpcy5yYW5nZS5zbGljZSgpO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IEFMSUFTLCBET0MsIE1BUCwgTk9ERV9UWVBFLCBOb2RlQmFzZSwgUEFJUiwgU0NBTEFSLCBTRVEsIGhhc0FuY2hvciwgaXNBbGlhcywgaXNDb2xsZWN0aW9uLCBpc0RvY3VtZW50LCBpc01hcCwgaXNOb2RlLCBpc1BhaXIsIGlzU2NhbGFyLCBpc1NlcSB9O1xuIiwgImltcG9ydCB7IGlzRG9jdW1lbnQsIGlzTm9kZSwgaXNQYWlyLCBpc0NvbGxlY3Rpb24sIGlzTWFwLCBpc1NlcSwgaXNTY2FsYXIsIGlzQWxpYXMgfSBmcm9tICcuL25vZGVzL05vZGUuanMnO1xuXG5jb25zdCBCUkVBSyA9IFN5bWJvbCgnYnJlYWsgdmlzaXQnKTtcbmNvbnN0IFNLSVAgPSBTeW1ib2woJ3NraXAgY2hpbGRyZW4nKTtcbmNvbnN0IFJFTU9WRSA9IFN5bWJvbCgncmVtb3ZlIG5vZGUnKTtcbi8qKlxuICogQXBwbHkgYSB2aXNpdG9yIHRvIGFuIEFTVCBub2RlIG9yIGRvY3VtZW50LlxuICpcbiAqIFdhbGtzIHRocm91Z2ggdGhlIHRyZWUgKGRlcHRoLWZpcnN0KSBzdGFydGluZyBmcm9tIGBub2RlYCwgY2FsbGluZyBhXG4gKiBgdmlzaXRvcmAgZnVuY3Rpb24gd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gKiAgIC0gYGtleWA6IEZvciBzZXF1ZW5jZSB2YWx1ZXMgYW5kIG1hcCBgUGFpcmAsIHRoZSBub2RlJ3MgaW5kZXggaW4gdGhlXG4gKiAgICAgY29sbGVjdGlvbi4gV2l0aGluIGEgYFBhaXJgLCBgJ2tleSdgIG9yIGAndmFsdWUnYCwgY29ycmVzcG9uZGluZ2x5LlxuICogICAgIGBudWxsYCBmb3IgdGhlIHJvb3Qgbm9kZS5cbiAqICAgLSBgbm9kZWA6IFRoZSBjdXJyZW50IG5vZGUuXG4gKiAgIC0gYHBhdGhgOiBUaGUgYW5jZXN0cnkgb2YgdGhlIGN1cnJlbnQgbm9kZS5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSB2aXNpdG9yIG1heSBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIHRyYXZlcnNhbDpcbiAqICAgLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IERvIG5vdGhpbmcgYW5kIGNvbnRpbnVlXG4gKiAgIC0gYHZpc2l0LlNLSVBgOiBEbyBub3QgdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSwgY29udGludWUgd2l0aCBuZXh0XG4gKiAgICAgc2libGluZ1xuICogICAtIGB2aXNpdC5CUkVBS2A6IFRlcm1pbmF0ZSB0cmF2ZXJzYWwgY29tcGxldGVseVxuICogICAtIGB2aXNpdC5SRU1PVkVgOiBSZW1vdmUgdGhlIGN1cnJlbnQgbm9kZSwgdGhlbiBjb250aW51ZSB3aXRoIHRoZSBuZXh0IG9uZVxuICogICAtIGBOb2RlYDogUmVwbGFjZSB0aGUgY3VycmVudCBub2RlLCB0aGVuIGNvbnRpbnVlIGJ5IHZpc2l0aW5nIGl0XG4gKiAgIC0gYG51bWJlcmA6IFdoaWxlIGl0ZXJhdGluZyB0aGUgaXRlbXMgb2YgYSBzZXF1ZW5jZSBvciBtYXAsIHNldCB0aGUgaW5kZXhcbiAqICAgICBvZiB0aGUgbmV4dCBzdGVwLiBUaGlzIGlzIHVzZWZ1bCBlc3BlY2lhbGx5IGlmIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudFxuICogICAgIG5vZGUgaGFzIGNoYW5nZWQuXG4gKlxuICogSWYgYHZpc2l0b3JgIGlzIGEgc2luZ2xlIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGFsbCB2YWx1ZXNcbiAqIGVuY291bnRlcmVkIGluIHRoZSB0cmVlLCBpbmNsdWRpbmcgZS5nLiBgbnVsbGAgdmFsdWVzLiBBbHRlcm5hdGl2ZWx5LFxuICogc2VwYXJhdGUgdmlzaXRvciBmdW5jdGlvbnMgbWF5IGJlIGRlZmluZWQgZm9yIGVhY2ggYE1hcGAsIGBQYWlyYCwgYFNlcWAsXG4gKiBgQWxpYXNgIGFuZCBgU2NhbGFyYCBub2RlLiBUbyBkZWZpbmUgdGhlIHNhbWUgdmlzaXRvciBmdW5jdGlvbiBmb3IgbW9yZSB0aGFuXG4gKiBvbmUgbm9kZSB0eXBlLCB1c2UgdGhlIGBDb2xsZWN0aW9uYCAobWFwIGFuZCBzZXEpLCBgVmFsdWVgIChtYXAsIHNlcSAmIHNjYWxhcilcbiAqIGFuZCBgTm9kZWAgKGFsaWFzLCBtYXAsIHNlcSAmIHNjYWxhcikgdGFyZ2V0cy4gT2YgYWxsIHRoZXNlLCBvbmx5IHRoZSBtb3N0XG4gKiBzcGVjaWZpYyBkZWZpbmVkIG9uZSB3aWxsIGJlIHVzZWQgZm9yIGVhY2ggbm9kZS5cbiAqL1xuZnVuY3Rpb24gdmlzaXQobm9kZSwgdmlzaXRvcikge1xuICAgIGNvbnN0IHZpc2l0b3JfID0gaW5pdFZpc2l0b3IodmlzaXRvcik7XG4gICAgaWYgKGlzRG9jdW1lbnQobm9kZSkpIHtcbiAgICAgICAgY29uc3QgY2QgPSB2aXNpdF8obnVsbCwgbm9kZS5jb250ZW50cywgdmlzaXRvcl8sIE9iamVjdC5mcmVlemUoW25vZGVdKSk7XG4gICAgICAgIGlmIChjZCA9PT0gUkVNT1ZFKVxuICAgICAgICAgICAgbm9kZS5jb250ZW50cyA9IG51bGw7XG4gICAgfVxuICAgIGVsc2VcbiAgICAgICAgdmlzaXRfKG51bGwsIG5vZGUsIHZpc2l0b3JfLCBPYmplY3QuZnJlZXplKFtdKSk7XG59XG4vLyBXaXRob3V0IHRoZSBgYXMgc3ltYm9sYCBjYXN0cywgVFMgZGVjbGFyZXMgdGhlc2UgaW4gdGhlIGB2aXNpdGBcbi8vIG5hbWVzcGFjZSB1c2luZyBgdmFyYCwgYnV0IHRoZW4gY29tcGxhaW5zIGFib3V0IHRoYXQgYmVjYXVzZVxuLy8gYHVuaXF1ZSBzeW1ib2xgIG11c3QgYmUgYGNvbnN0YC5cbi8qKiBUZXJtaW5hdGUgdmlzaXQgdHJhdmVyc2FsIGNvbXBsZXRlbHkgKi9cbnZpc2l0LkJSRUFLID0gQlJFQUs7XG4vKiogRG8gbm90IHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgY3VycmVudCBub2RlICovXG52aXNpdC5TS0lQID0gU0tJUDtcbi8qKiBSZW1vdmUgdGhlIGN1cnJlbnQgbm9kZSAqL1xudmlzaXQuUkVNT1ZFID0gUkVNT1ZFO1xuZnVuY3Rpb24gdmlzaXRfKGtleSwgbm9kZSwgdmlzaXRvciwgcGF0aCkge1xuICAgIGNvbnN0IGN0cmwgPSBjYWxsVmlzaXRvcihrZXksIG5vZGUsIHZpc2l0b3IsIHBhdGgpO1xuICAgIGlmIChpc05vZGUoY3RybCkgfHwgaXNQYWlyKGN0cmwpKSB7XG4gICAgICAgIHJlcGxhY2VOb2RlKGtleSwgcGF0aCwgY3RybCk7XG4gICAgICAgIHJldHVybiB2aXNpdF8oa2V5LCBjdHJsLCB2aXNpdG9yLCBwYXRoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjdHJsICE9PSAnc3ltYm9sJykge1xuICAgICAgICBpZiAoaXNDb2xsZWN0aW9uKG5vZGUpKSB7XG4gICAgICAgICAgICBwYXRoID0gT2JqZWN0LmZyZWV6ZShwYXRoLmNvbmNhdChub2RlKSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaSA9IHZpc2l0XyhpLCBub2RlLml0ZW1zW2ldLCB2aXNpdG9yLCBwYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNpID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgICAgICAgICAgaSA9IGNpIC0gMTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaSA9PT0gQlJFQUspXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSztcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaSA9PT0gUkVNT1ZFKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuaXRlbXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICBpIC09IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUGFpcihub2RlKSkge1xuICAgICAgICAgICAgcGF0aCA9IE9iamVjdC5mcmVlemUocGF0aC5jb25jYXQobm9kZSkpO1xuICAgICAgICAgICAgY29uc3QgY2sgPSB2aXNpdF8oJ2tleScsIG5vZGUua2V5LCB2aXNpdG9yLCBwYXRoKTtcbiAgICAgICAgICAgIGlmIChjayA9PT0gQlJFQUspXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJSRUFLO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2sgPT09IFJFTU9WRSlcbiAgICAgICAgICAgICAgICBub2RlLmtleSA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCBjdiA9IHZpc2l0XygndmFsdWUnLCBub2RlLnZhbHVlLCB2aXNpdG9yLCBwYXRoKTtcbiAgICAgICAgICAgIGlmIChjdiA9PT0gQlJFQUspXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJSRUFLO1xuICAgICAgICAgICAgZWxzZSBpZiAoY3YgPT09IFJFTU9WRSlcbiAgICAgICAgICAgICAgICBub2RlLnZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3RybDtcbn1cbi8qKlxuICogQXBwbHkgYW4gYXN5bmMgdmlzaXRvciB0byBhbiBBU1Qgbm9kZSBvciBkb2N1bWVudC5cbiAqXG4gKiBXYWxrcyB0aHJvdWdoIHRoZSB0cmVlIChkZXB0aC1maXJzdCkgc3RhcnRpbmcgZnJvbSBgbm9kZWAsIGNhbGxpbmcgYVxuICogYHZpc2l0b3JgIGZ1bmN0aW9uIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICogICAtIGBrZXlgOiBGb3Igc2VxdWVuY2UgdmFsdWVzIGFuZCBtYXAgYFBhaXJgLCB0aGUgbm9kZSdzIGluZGV4IGluIHRoZVxuICogICAgIGNvbGxlY3Rpb24uIFdpdGhpbiBhIGBQYWlyYCwgYCdrZXknYCBvciBgJ3ZhbHVlJ2AsIGNvcnJlc3BvbmRpbmdseS5cbiAqICAgICBgbnVsbGAgZm9yIHRoZSByb290IG5vZGUuXG4gKiAgIC0gYG5vZGVgOiBUaGUgY3VycmVudCBub2RlLlxuICogICAtIGBwYXRoYDogVGhlIGFuY2VzdHJ5IG9mIHRoZSBjdXJyZW50IG5vZGUuXG4gKlxuICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgdmlzaXRvciBtYXkgYmUgdXNlZCB0byBjb250cm9sIHRoZSB0cmF2ZXJzYWw6XG4gKiAgIC0gYFByb21pc2VgOiBNdXN0IHJlc29sdmUgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzXG4gKiAgIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBEbyBub3RoaW5nIGFuZCBjb250aW51ZVxuICogICAtIGB2aXNpdC5TS0lQYDogRG8gbm90IHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUsIGNvbnRpbnVlIHdpdGggbmV4dFxuICogICAgIHNpYmxpbmdcbiAqICAgLSBgdmlzaXQuQlJFQUtgOiBUZXJtaW5hdGUgdHJhdmVyc2FsIGNvbXBsZXRlbHlcbiAqICAgLSBgdmlzaXQuUkVNT1ZFYDogUmVtb3ZlIHRoZSBjdXJyZW50IG5vZGUsIHRoZW4gY29udGludWUgd2l0aCB0aGUgbmV4dCBvbmVcbiAqICAgLSBgTm9kZWA6IFJlcGxhY2UgdGhlIGN1cnJlbnQgbm9kZSwgdGhlbiBjb250aW51ZSBieSB2aXNpdGluZyBpdFxuICogICAtIGBudW1iZXJgOiBXaGlsZSBpdGVyYXRpbmcgdGhlIGl0ZW1zIG9mIGEgc2VxdWVuY2Ugb3IgbWFwLCBzZXQgdGhlIGluZGV4XG4gKiAgICAgb2YgdGhlIG5leHQgc3RlcC4gVGhpcyBpcyB1c2VmdWwgZXNwZWNpYWxseSBpZiB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnRcbiAqICAgICBub2RlIGhhcyBjaGFuZ2VkLlxuICpcbiAqIElmIGB2aXNpdG9yYCBpcyBhIHNpbmdsZSBmdW5jdGlvbiwgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCBhbGwgdmFsdWVzXG4gKiBlbmNvdW50ZXJlZCBpbiB0aGUgdHJlZSwgaW5jbHVkaW5nIGUuZy4gYG51bGxgIHZhbHVlcy4gQWx0ZXJuYXRpdmVseSxcbiAqIHNlcGFyYXRlIHZpc2l0b3IgZnVuY3Rpb25zIG1heSBiZSBkZWZpbmVkIGZvciBlYWNoIGBNYXBgLCBgUGFpcmAsIGBTZXFgLFxuICogYEFsaWFzYCBhbmQgYFNjYWxhcmAgbm9kZS4gVG8gZGVmaW5lIHRoZSBzYW1lIHZpc2l0b3IgZnVuY3Rpb24gZm9yIG1vcmUgdGhhblxuICogb25lIG5vZGUgdHlwZSwgdXNlIHRoZSBgQ29sbGVjdGlvbmAgKG1hcCBhbmQgc2VxKSwgYFZhbHVlYCAobWFwLCBzZXEgJiBzY2FsYXIpXG4gKiBhbmQgYE5vZGVgIChhbGlhcywgbWFwLCBzZXEgJiBzY2FsYXIpIHRhcmdldHMuIE9mIGFsbCB0aGVzZSwgb25seSB0aGUgbW9zdFxuICogc3BlY2lmaWMgZGVmaW5lZCBvbmUgd2lsbCBiZSB1c2VkIGZvciBlYWNoIG5vZGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHZpc2l0QXN5bmMobm9kZSwgdmlzaXRvcikge1xuICAgIGNvbnN0IHZpc2l0b3JfID0gaW5pdFZpc2l0b3IodmlzaXRvcik7XG4gICAgaWYgKGlzRG9jdW1lbnQobm9kZSkpIHtcbiAgICAgICAgY29uc3QgY2QgPSBhd2FpdCB2aXNpdEFzeW5jXyhudWxsLCBub2RlLmNvbnRlbnRzLCB2aXNpdG9yXywgT2JqZWN0LmZyZWV6ZShbbm9kZV0pKTtcbiAgICAgICAgaWYgKGNkID09PSBSRU1PVkUpXG4gICAgICAgICAgICBub2RlLmNvbnRlbnRzID0gbnVsbDtcbiAgICB9XG4gICAgZWxzZVxuICAgICAgICBhd2FpdCB2aXNpdEFzeW5jXyhudWxsLCBub2RlLCB2aXNpdG9yXywgT2JqZWN0LmZyZWV6ZShbXSkpO1xufVxuLy8gV2l0aG91dCB0aGUgYGFzIHN5bWJvbGAgY2FzdHMsIFRTIGRlY2xhcmVzIHRoZXNlIGluIHRoZSBgdmlzaXRgXG4vLyBuYW1lc3BhY2UgdXNpbmcgYHZhcmAsIGJ1dCB0aGVuIGNvbXBsYWlucyBhYm91dCB0aGF0IGJlY2F1c2Vcbi8vIGB1bmlxdWUgc3ltYm9sYCBtdXN0IGJlIGBjb25zdGAuXG4vKiogVGVybWluYXRlIHZpc2l0IHRyYXZlcnNhbCBjb21wbGV0ZWx5ICovXG52aXNpdEFzeW5jLkJSRUFLID0gQlJFQUs7XG4vKiogRG8gbm90IHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgY3VycmVudCBub2RlICovXG52aXNpdEFzeW5jLlNLSVAgPSBTS0lQO1xuLyoqIFJlbW92ZSB0aGUgY3VycmVudCBub2RlICovXG52aXNpdEFzeW5jLlJFTU9WRSA9IFJFTU9WRTtcbmFzeW5jIGZ1bmN0aW9uIHZpc2l0QXN5bmNfKGtleSwgbm9kZSwgdmlzaXRvciwgcGF0aCkge1xuICAgIGNvbnN0IGN0cmwgPSBhd2FpdCBjYWxsVmlzaXRvcihrZXksIG5vZGUsIHZpc2l0b3IsIHBhdGgpO1xuICAgIGlmIChpc05vZGUoY3RybCkgfHwgaXNQYWlyKGN0cmwpKSB7XG4gICAgICAgIHJlcGxhY2VOb2RlKGtleSwgcGF0aCwgY3RybCk7XG4gICAgICAgIHJldHVybiB2aXNpdEFzeW5jXyhrZXksIGN0cmwsIHZpc2l0b3IsIHBhdGgpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGN0cmwgIT09ICdzeW1ib2wnKSB7XG4gICAgICAgIGlmIChpc0NvbGxlY3Rpb24obm9kZSkpIHtcbiAgICAgICAgICAgIHBhdGggPSBPYmplY3QuZnJlZXplKHBhdGguY29uY2F0KG5vZGUpKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5pdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNpID0gYXdhaXQgdmlzaXRBc3luY18oaSwgbm9kZS5pdGVtc1tpXSwgdmlzaXRvciwgcGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjaSA9PT0gJ251bWJlcicpXG4gICAgICAgICAgICAgICAgICAgIGkgPSBjaSAtIDE7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2kgPT09IEJSRUFLKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQlJFQUs7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2kgPT09IFJFTU9WRSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLml0ZW1zLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1BhaXIobm9kZSkpIHtcbiAgICAgICAgICAgIHBhdGggPSBPYmplY3QuZnJlZXplKHBhdGguY29uY2F0KG5vZGUpKTtcbiAgICAgICAgICAgIGNvbnN0IGNrID0gYXdhaXQgdmlzaXRBc3luY18oJ2tleScsIG5vZGUua2V5LCB2aXNpdG9yLCBwYXRoKTtcbiAgICAgICAgICAgIGlmIChjayA9PT0gQlJFQUspXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJSRUFLO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2sgPT09IFJFTU9WRSlcbiAgICAgICAgICAgICAgICBub2RlLmtleSA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCBjdiA9IGF3YWl0IHZpc2l0QXN5bmNfKCd2YWx1ZScsIG5vZGUudmFsdWUsIHZpc2l0b3IsIHBhdGgpO1xuICAgICAgICAgICAgaWYgKGN2ID09PSBCUkVBSylcbiAgICAgICAgICAgICAgICByZXR1cm4gQlJFQUs7XG4gICAgICAgICAgICBlbHNlIGlmIChjdiA9PT0gUkVNT1ZFKVxuICAgICAgICAgICAgICAgIG5vZGUudmFsdWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdHJsO1xufVxuZnVuY3Rpb24gaW5pdFZpc2l0b3IodmlzaXRvcikge1xuICAgIGlmICh0eXBlb2YgdmlzaXRvciA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgKHZpc2l0b3IuQ29sbGVjdGlvbiB8fCB2aXNpdG9yLk5vZGUgfHwgdmlzaXRvci5WYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgQWxpYXM6IHZpc2l0b3IuTm9kZSxcbiAgICAgICAgICAgIE1hcDogdmlzaXRvci5Ob2RlLFxuICAgICAgICAgICAgU2NhbGFyOiB2aXNpdG9yLk5vZGUsXG4gICAgICAgICAgICBTZXE6IHZpc2l0b3IuTm9kZVxuICAgICAgICB9LCB2aXNpdG9yLlZhbHVlICYmIHtcbiAgICAgICAgICAgIE1hcDogdmlzaXRvci5WYWx1ZSxcbiAgICAgICAgICAgIFNjYWxhcjogdmlzaXRvci5WYWx1ZSxcbiAgICAgICAgICAgIFNlcTogdmlzaXRvci5WYWx1ZVxuICAgICAgICB9LCB2aXNpdG9yLkNvbGxlY3Rpb24gJiYge1xuICAgICAgICAgICAgTWFwOiB2aXNpdG9yLkNvbGxlY3Rpb24sXG4gICAgICAgICAgICBTZXE6IHZpc2l0b3IuQ29sbGVjdGlvblxuICAgICAgICB9LCB2aXNpdG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIHZpc2l0b3I7XG59XG5mdW5jdGlvbiBjYWxsVmlzaXRvcihrZXksIG5vZGUsIHZpc2l0b3IsIHBhdGgpIHtcbiAgICBpZiAodHlwZW9mIHZpc2l0b3IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIHJldHVybiB2aXNpdG9yKGtleSwgbm9kZSwgcGF0aCk7XG4gICAgaWYgKGlzTWFwKG5vZGUpKVxuICAgICAgICByZXR1cm4gdmlzaXRvci5NYXA/LihrZXksIG5vZGUsIHBhdGgpO1xuICAgIGlmIChpc1NlcShub2RlKSlcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IuU2VxPy4oa2V5LCBub2RlLCBwYXRoKTtcbiAgICBpZiAoaXNQYWlyKG5vZGUpKVxuICAgICAgICByZXR1cm4gdmlzaXRvci5QYWlyPy4oa2V5LCBub2RlLCBwYXRoKTtcbiAgICBpZiAoaXNTY2FsYXIobm9kZSkpXG4gICAgICAgIHJldHVybiB2aXNpdG9yLlNjYWxhcj8uKGtleSwgbm9kZSwgcGF0aCk7XG4gICAgaWYgKGlzQWxpYXMobm9kZSkpXG4gICAgICAgIHJldHVybiB2aXNpdG9yLkFsaWFzPy4oa2V5LCBub2RlLCBwYXRoKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gcmVwbGFjZU5vZGUoa2V5LCBwYXRoLCBub2RlKSB7XG4gICAgY29uc3QgcGFyZW50ID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICAgIGlmIChpc0NvbGxlY3Rpb24ocGFyZW50KSkge1xuICAgICAgICBwYXJlbnQuaXRlbXNba2V5XSA9IG5vZGU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzUGFpcihwYXJlbnQpKSB7XG4gICAgICAgIGlmIChrZXkgPT09ICdrZXknKVxuICAgICAgICAgICAgcGFyZW50LmtleSA9IG5vZGU7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHBhcmVudC52YWx1ZSA9IG5vZGU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzRG9jdW1lbnQocGFyZW50KSkge1xuICAgICAgICBwYXJlbnQuY29udGVudHMgPSBub2RlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgcHQgPSBpc0FsaWFzKHBhcmVudCkgPyAnYWxpYXMnIDogJ3NjYWxhcic7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlcGxhY2Ugbm9kZSB3aXRoICR7cHR9IHBhcmVudGApO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgdmlzaXQsIHZpc2l0QXN5bmMgfTtcbiIsICJpbXBvcnQgeyBpc05vZGUgfSBmcm9tICcuLi9ub2Rlcy9Ob2RlLmpzJztcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSAnLi4vdmlzaXQuanMnO1xuXG5jb25zdCBlc2NhcGVDaGFycyA9IHtcbiAgICAnISc6ICclMjEnLFxuICAgICcsJzogJyUyQycsXG4gICAgJ1snOiAnJTVCJyxcbiAgICAnXSc6ICclNUQnLFxuICAgICd7JzogJyU3QicsXG4gICAgJ30nOiAnJTdEJ1xufTtcbmNvbnN0IGVzY2FwZVRhZ05hbWUgPSAodG4pID0+IHRuLnJlcGxhY2UoL1shLFtcXF17fV0vZywgY2ggPT4gZXNjYXBlQ2hhcnNbY2hdKTtcbmNsYXNzIERpcmVjdGl2ZXMge1xuICAgIGNvbnN0cnVjdG9yKHlhbWwsIHRhZ3MpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaXJlY3RpdmVzLWVuZC9kb2Mtc3RhcnQgbWFya2VyIGAtLS1gLiBJZiBgbnVsbGAsIGEgbWFya2VyIG1heSBzdGlsbCBiZVxuICAgICAgICAgKiBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnQncyBzdHJpbmdpZmllZCByZXByZXNlbnRhdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZG9jU3RhcnQgPSBudWxsO1xuICAgICAgICAvKiogVGhlIGRvYy1lbmQgbWFya2VyIGAuLi5gLiAgKi9cbiAgICAgICAgdGhpcy5kb2NFbmQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy55YW1sID0gT2JqZWN0LmFzc2lnbih7fSwgRGlyZWN0aXZlcy5kZWZhdWx0WWFtbCwgeWFtbCk7XG4gICAgICAgIHRoaXMudGFncyA9IE9iamVjdC5hc3NpZ24oe30sIERpcmVjdGl2ZXMuZGVmYXVsdFRhZ3MsIHRhZ3MpO1xuICAgIH1cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgY29uc3QgY29weSA9IG5ldyBEaXJlY3RpdmVzKHRoaXMueWFtbCwgdGhpcy50YWdzKTtcbiAgICAgICAgY29weS5kb2NTdGFydCA9IHRoaXMuZG9jU3RhcnQ7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEdXJpbmcgcGFyc2luZywgZ2V0IGEgRGlyZWN0aXZlcyBpbnN0YW5jZSBmb3IgdGhlIGN1cnJlbnQgZG9jdW1lbnQgYW5kXG4gICAgICogdXBkYXRlIHRoZSBzdHJlYW0gc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHZlcnNpb24ncyBzcGVjLlxuICAgICAqL1xuICAgIGF0RG9jdW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyBEaXJlY3RpdmVzKHRoaXMueWFtbCwgdGhpcy50YWdzKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnlhbWwudmVyc2lvbikge1xuICAgICAgICAgICAgY2FzZSAnMS4xJzpcbiAgICAgICAgICAgICAgICB0aGlzLmF0TmV4dERvY3VtZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzEuMic6XG4gICAgICAgICAgICAgICAgdGhpcy5hdE5leHREb2N1bWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMueWFtbCA9IHtcbiAgICAgICAgICAgICAgICAgICAgZXhwbGljaXQ6IERpcmVjdGl2ZXMuZGVmYXVsdFlhbWwuZXhwbGljaXQsXG4gICAgICAgICAgICAgICAgICAgIHZlcnNpb246ICcxLjInXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBEaXJlY3RpdmVzLmRlZmF1bHRUYWdzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gb25FcnJvciAtIE1heSBiZSBjYWxsZWQgZXZlbiBpZiB0aGUgYWN0aW9uIHdhcyBzdWNjZXNzZnVsXG4gICAgICogQHJldHVybnMgYHRydWVgIG9uIHN1Y2Nlc3NcbiAgICAgKi9cbiAgICBhZGQobGluZSwgb25FcnJvcikge1xuICAgICAgICBpZiAodGhpcy5hdE5leHREb2N1bWVudCkge1xuICAgICAgICAgICAgdGhpcy55YW1sID0geyBleHBsaWNpdDogRGlyZWN0aXZlcy5kZWZhdWx0WWFtbC5leHBsaWNpdCwgdmVyc2lvbjogJzEuMScgfTtcbiAgICAgICAgICAgIHRoaXMudGFncyA9IE9iamVjdC5hc3NpZ24oe30sIERpcmVjdGl2ZXMuZGVmYXVsdFRhZ3MpO1xuICAgICAgICAgICAgdGhpcy5hdE5leHREb2N1bWVudCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnRzID0gbGluZS50cmltKCkuc3BsaXQoL1sgXFx0XSsvKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IHBhcnRzLnNoaWZ0KCk7XG4gICAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAgICAgY2FzZSAnJVRBRyc6IHtcbiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoMCwgJyVUQUcgZGlyZWN0aXZlIHNob3VsZCBjb250YWluIGV4YWN0bHkgdHdvIHBhcnRzJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPCAyKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBbaGFuZGxlLCBwcmVmaXhdID0gcGFydHM7XG4gICAgICAgICAgICAgICAgdGhpcy50YWdzW2hhbmRsZV0gPSBwcmVmaXg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICclWUFNTCc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnlhbWwuZXhwbGljaXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcigwLCAnJVlBTUwgZGlyZWN0aXZlIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lIHBhcnQnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBbdmVyc2lvbl0gPSBwYXJ0cztcbiAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiA9PT0gJzEuMScgfHwgdmVyc2lvbiA9PT0gJzEuMicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55YW1sLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzVmFsaWQgPSAvXlxcZCtcXC5cXGQrJC8udGVzdCh2ZXJzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcig2LCBgVW5zdXBwb3J0ZWQgWUFNTCB2ZXJzaW9uICR7dmVyc2lvbn1gLCBpc1ZhbGlkKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgb25FcnJvcigwLCBgVW5rbm93biBkaXJlY3RpdmUgJHtuYW1lfWAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyBhIHRhZywgbWF0Y2hpbmcgaGFuZGxlcyB0byB0aG9zZSBkZWZpbmVkIGluICVUQUcgZGlyZWN0aXZlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVkIHRhZywgd2hpY2ggbWF5IGFsc28gYmUgdGhlIG5vbi1zcGVjaWZpYyB0YWcgYCchJ2Agb3IgYVxuICAgICAqICAgYCchbG9jYWwnYCB0YWcsIG9yIGBudWxsYCBpZiB1bnJlc29sdmFibGUuXG4gICAgICovXG4gICAgdGFnTmFtZShzb3VyY2UsIG9uRXJyb3IpIHtcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gJyEnKVxuICAgICAgICAgICAgcmV0dXJuICchJzsgLy8gbm9uLXNwZWNpZmljIHRhZ1xuICAgICAgICBpZiAoc291cmNlWzBdICE9PSAnIScpIHtcbiAgICAgICAgICAgIG9uRXJyb3IoYE5vdCBhIHZhbGlkIHRhZzogJHtzb3VyY2V9YCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc291cmNlWzFdID09PSAnPCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHZlcmJhdGltID0gc291cmNlLnNsaWNlKDIsIC0xKTtcbiAgICAgICAgICAgIGlmICh2ZXJiYXRpbSA9PT0gJyEnIHx8IHZlcmJhdGltID09PSAnISEnKSB7XG4gICAgICAgICAgICAgICAgb25FcnJvcihgVmVyYmF0aW0gdGFncyBhcmVuJ3QgcmVzb2x2ZWQsIHNvICR7c291cmNlfSBpcyBpbnZhbGlkLmApO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNvdXJjZVtzb3VyY2UubGVuZ3RoIC0gMV0gIT09ICc+JylcbiAgICAgICAgICAgICAgICBvbkVycm9yKCdWZXJiYXRpbSB0YWdzIG11c3QgZW5kIHdpdGggYSA+Jyk7XG4gICAgICAgICAgICByZXR1cm4gdmVyYmF0aW07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgWywgaGFuZGxlLCBzdWZmaXhdID0gc291cmNlLm1hdGNoKC9eKC4qISkoW14hXSopJC8pO1xuICAgICAgICBpZiAoIXN1ZmZpeClcbiAgICAgICAgICAgIG9uRXJyb3IoYFRoZSAke3NvdXJjZX0gdGFnIGhhcyBubyBzdWZmaXhgKTtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gdGhpcy50YWdzW2hhbmRsZV07XG4gICAgICAgIGlmIChwcmVmaXgpXG4gICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgZGVjb2RlVVJJQ29tcG9uZW50KHN1ZmZpeCk7XG4gICAgICAgIGlmIChoYW5kbGUgPT09ICchJylcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2U7IC8vIGxvY2FsIHRhZ1xuICAgICAgICBvbkVycm9yKGBDb3VsZCBub3QgcmVzb2x2ZSB0YWc6ICR7c291cmNlfWApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBmdWxseSByZXNvbHZlZCB0YWcsIHJldHVybnMgaXRzIHByaW50YWJsZSBzdHJpbmcgZm9ybSxcbiAgICAgKiB0YWtpbmcgaW50byBhY2NvdW50IGN1cnJlbnQgdGFnIHByZWZpeGVzIGFuZCBkZWZhdWx0cy5cbiAgICAgKi9cbiAgICB0YWdTdHJpbmcodGFnKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2hhbmRsZSwgcHJlZml4XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnRhZ3MpKSB7XG4gICAgICAgICAgICBpZiAodGFnLnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlICsgZXNjYXBlVGFnTmFtZSh0YWcuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFnWzBdID09PSAnIScgPyB0YWcgOiBgITwke3RhZ30+YDtcbiAgICB9XG4gICAgdG9TdHJpbmcoZG9jKSB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy55YW1sLmV4cGxpY2l0XG4gICAgICAgICAgICA/IFtgJVlBTUwgJHt0aGlzLnlhbWwudmVyc2lvbiB8fCAnMS4yJ31gXVxuICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgY29uc3QgdGFnRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMudGFncyk7XG4gICAgICAgIGxldCB0YWdOYW1lcztcbiAgICAgICAgaWYgKGRvYyAmJiB0YWdFbnRyaWVzLmxlbmd0aCA+IDAgJiYgaXNOb2RlKGRvYy5jb250ZW50cykpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSB7fTtcbiAgICAgICAgICAgIHZpc2l0KGRvYy5jb250ZW50cywgKF9rZXksIG5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNOb2RlKG5vZGUpICYmIG5vZGUudGFnKVxuICAgICAgICAgICAgICAgICAgICB0YWdzW25vZGUudGFnXSA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRhZ05hbWVzID0gT2JqZWN0LmtleXModGFncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGFnTmFtZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBbaGFuZGxlLCBwcmVmaXhdIG9mIHRhZ0VudHJpZXMpIHtcbiAgICAgICAgICAgIGlmIChoYW5kbGUgPT09ICchIScgJiYgcHJlZml4ID09PSAndGFnOnlhbWwub3JnLDIwMDI6JylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghZG9jIHx8IHRhZ05hbWVzLnNvbWUodG4gPT4gdG4uc3RhcnRzV2l0aChwcmVmaXgpKSlcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKGAlVEFHICR7aGFuZGxlfSAke3ByZWZpeH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gICAgfVxufVxuRGlyZWN0aXZlcy5kZWZhdWx0WWFtbCA9IHsgZXhwbGljaXQ6IGZhbHNlLCB2ZXJzaW9uOiAnMS4yJyB9O1xuRGlyZWN0aXZlcy5kZWZhdWx0VGFncyA9IHsgJyEhJzogJ3RhZzp5YW1sLm9yZywyMDAyOicgfTtcblxuZXhwb3J0IHsgRGlyZWN0aXZlcyB9O1xuIiwgImltcG9ydCB7IGlzU2NhbGFyLCBpc0NvbGxlY3Rpb24gfSBmcm9tICcuLi9ub2Rlcy9Ob2RlLmpzJztcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSAnLi4vdmlzaXQuanMnO1xuXG4vKipcbiAqIFZlcmlmeSB0aGF0IHRoZSBpbnB1dCBzdHJpbmcgaXMgYSB2YWxpZCBhbmNob3IuXG4gKlxuICogV2lsbCB0aHJvdyBvbiBlcnJvcnMuXG4gKi9cbmZ1bmN0aW9uIGFuY2hvcklzVmFsaWQoYW5jaG9yKSB7XG4gICAgaWYgKC9bXFx4MDAtXFx4MTlcXHMsW1xcXXt9XS8udGVzdChhbmNob3IpKSB7XG4gICAgICAgIGNvbnN0IHNhID0gSlNPTi5zdHJpbmdpZnkoYW5jaG9yKTtcbiAgICAgICAgY29uc3QgbXNnID0gYEFuY2hvciBtdXN0IG5vdCBjb250YWluIHdoaXRlc3BhY2Ugb3IgY29udHJvbCBjaGFyYWN0ZXJzOiAke3NhfWA7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGFuY2hvck5hbWVzKHJvb3QpIHtcbiAgICBjb25zdCBhbmNob3JzID0gbmV3IFNldCgpO1xuICAgIHZpc2l0KHJvb3QsIHtcbiAgICAgICAgVmFsdWUoX2tleSwgbm9kZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUuYW5jaG9yKVxuICAgICAgICAgICAgICAgIGFuY2hvcnMuYWRkKG5vZGUuYW5jaG9yKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhbmNob3JzO1xufVxuLyoqIEZpbmQgYSBuZXcgYW5jaG9yIG5hbWUgd2l0aCB0aGUgZ2l2ZW4gYHByZWZpeGAgYW5kIGEgb25lLWluZGV4ZWQgc3VmZml4LiAqL1xuZnVuY3Rpb24gZmluZE5ld0FuY2hvcihwcmVmaXgsIGV4Y2x1ZGUpIHtcbiAgICBmb3IgKGxldCBpID0gMTsgdHJ1ZTsgKytpKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBgJHtwcmVmaXh9JHtpfWA7XG4gICAgICAgIGlmICghZXhjbHVkZS5oYXMobmFtZSkpXG4gICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVOb2RlQW5jaG9ycyhkb2MsIHByZWZpeCkge1xuICAgIGNvbnN0IGFsaWFzT2JqZWN0cyA9IFtdO1xuICAgIGNvbnN0IHNvdXJjZU9iamVjdHMgPSBuZXcgTWFwKCk7XG4gICAgbGV0IHByZXZBbmNob3JzID0gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgICBvbkFuY2hvcjogKHNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgYWxpYXNPYmplY3RzLnB1c2goc291cmNlKTtcbiAgICAgICAgICAgIGlmICghcHJldkFuY2hvcnMpXG4gICAgICAgICAgICAgICAgcHJldkFuY2hvcnMgPSBhbmNob3JOYW1lcyhkb2MpO1xuICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gZmluZE5ld0FuY2hvcihwcmVmaXgsIHByZXZBbmNob3JzKTtcbiAgICAgICAgICAgIHByZXZBbmNob3JzLmFkZChhbmNob3IpO1xuICAgICAgICAgICAgcmV0dXJuIGFuY2hvcjtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdpdGggY2lyY3VsYXIgcmVmZXJlbmNlcywgdGhlIHNvdXJjZSBub2RlIGlzIG9ubHkgcmVzb2x2ZWQgYWZ0ZXIgYWxsXG4gICAgICAgICAqIG9mIGl0cyBjaGlsZCBub2RlcyBhcmUuIFRoaXMgaXMgd2h5IGFuY2hvcnMgYXJlIHNldCBvbmx5IGFmdGVyIGFsbCBvZlxuICAgICAgICAgKiB0aGUgbm9kZXMgaGF2ZSBiZWVuIGNyZWF0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICBzZXRBbmNob3JzOiAoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBhbGlhc09iamVjdHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWYgPSBzb3VyY2VPYmplY3RzLmdldChzb3VyY2UpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVmID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICAgICByZWYuYW5jaG9yICYmXG4gICAgICAgICAgICAgICAgICAgIChpc1NjYWxhcihyZWYubm9kZSkgfHwgaXNDb2xsZWN0aW9uKHJlZi5ub2RlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmLm5vZGUuYW5jaG9yID0gcmVmLmFuY2hvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdGYWlsZWQgdG8gcmVzb2x2ZSByZXBlYXRlZCBvYmplY3QgKHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4pJyk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2VPYmplY3RzXG4gICAgfTtcbn1cblxuZXhwb3J0IHsgYW5jaG9ySXNWYWxpZCwgYW5jaG9yTmFtZXMsIGNyZWF0ZU5vZGVBbmNob3JzLCBmaW5kTmV3QW5jaG9yIH07XG4iLCAiaW1wb3J0IHsgYW5jaG9ySXNWYWxpZCB9IGZyb20gJy4uL2RvYy9hbmNob3JzLmpzJztcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSAnLi4vdmlzaXQuanMnO1xuaW1wb3J0IHsgTm9kZUJhc2UsIEFMSUFTLCBpc0FsaWFzLCBpc0NvbGxlY3Rpb24sIGlzUGFpciB9IGZyb20gJy4vTm9kZS5qcyc7XG5cbmNsYXNzIEFsaWFzIGV4dGVuZHMgTm9kZUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSkge1xuICAgICAgICBzdXBlcihBTElBUyk7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3RhZycsIHtcbiAgICAgICAgICAgIHNldCgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FsaWFzIG5vZGVzIGNhbm5vdCBoYXZlIHRhZ3MnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgdGhlIHZhbHVlIG9mIHRoaXMgYWxpYXMgd2l0aGluIGBkb2NgLCBmaW5kaW5nIHRoZSBsYXN0XG4gICAgICogaW5zdGFuY2Ugb2YgdGhlIGBzb3VyY2VgIGFuY2hvciBiZWZvcmUgdGhpcyBub2RlLlxuICAgICAqL1xuICAgIHJlc29sdmUoZG9jKSB7XG4gICAgICAgIGxldCBmb3VuZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmlzaXQoZG9jLCB7XG4gICAgICAgICAgICBOb2RlOiAoX2tleSwgbm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChub2RlID09PSB0aGlzKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlzaXQuQlJFQUs7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuYW5jaG9yID09PSB0aGlzLnNvdXJjZSlcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH1cbiAgICB0b0pTT04oX2FyZywgY3R4KSB7XG4gICAgICAgIGlmICghY3R4KVxuICAgICAgICAgICAgcmV0dXJuIHsgc291cmNlOiB0aGlzLnNvdXJjZSB9O1xuICAgICAgICBjb25zdCB7IGFuY2hvcnMsIGRvYywgbWF4QWxpYXNDb3VudCB9ID0gY3R4O1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnJlc29sdmUoZG9jKTtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGBVbnJlc29sdmVkIGFsaWFzICh0aGUgYW5jaG9yIG11c3QgYmUgc2V0IGJlZm9yZSB0aGUgYWxpYXMpOiAke3RoaXMuc291cmNlfWA7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IobXNnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhID0gYW5jaG9ycy5nZXQoc291cmNlKTtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmICghZGF0YSB8fCBkYXRhLnJlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSAnVGhpcyBzaG91bGQgbm90IGhhcHBlbjogQWxpYXMgYW5jaG9yIHdhcyBub3QgcmVzb2x2ZWQ/JztcbiAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihtc2cpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXhBbGlhc0NvdW50ID49IDApIHtcbiAgICAgICAgICAgIGRhdGEuY291bnQgKz0gMTtcbiAgICAgICAgICAgIGlmIChkYXRhLmFsaWFzQ291bnQgPT09IDApXG4gICAgICAgICAgICAgICAgZGF0YS5hbGlhc0NvdW50ID0gZ2V0QWxpYXNDb3VudChkb2MsIHNvdXJjZSwgYW5jaG9ycyk7XG4gICAgICAgICAgICBpZiAoZGF0YS5jb3VudCAqIGRhdGEuYWxpYXNDb3VudCA+IG1heEFsaWFzQ291bnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSAnRXhjZXNzaXZlIGFsaWFzIGNvdW50IGluZGljYXRlcyBhIHJlc291cmNlIGV4aGF1c3Rpb24gYXR0YWNrJztcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IobXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YS5yZXM7XG4gICAgfVxuICAgIHRvU3RyaW5nKGN0eCwgX29uQ29tbWVudCwgX29uQ2hvbXBLZWVwKSB7XG4gICAgICAgIGNvbnN0IHNyYyA9IGAqJHt0aGlzLnNvdXJjZX1gO1xuICAgICAgICBpZiAoY3R4KSB7XG4gICAgICAgICAgICBhbmNob3JJc1ZhbGlkKHRoaXMuc291cmNlKTtcbiAgICAgICAgICAgIGlmIChjdHgub3B0aW9ucy52ZXJpZnlBbGlhc09yZGVyICYmICFjdHguYW5jaG9ycy5oYXModGhpcy5zb3VyY2UpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gYFVucmVzb2x2ZWQgYWxpYXMgKHRoZSBhbmNob3IgbXVzdCBiZSBzZXQgYmVmb3JlIHRoZSBhbGlhcyk6ICR7dGhpcy5zb3VyY2V9YDtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdHguaW1wbGljaXRLZXkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3NyY30gYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3JjO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldEFsaWFzQ291bnQoZG9jLCBub2RlLCBhbmNob3JzKSB7XG4gICAgaWYgKGlzQWxpYXMobm9kZSkpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gbm9kZS5yZXNvbHZlKGRvYyk7XG4gICAgICAgIGNvbnN0IGFuY2hvciA9IGFuY2hvcnMgJiYgc291cmNlICYmIGFuY2hvcnMuZ2V0KHNvdXJjZSk7XG4gICAgICAgIHJldHVybiBhbmNob3IgPyBhbmNob3IuY291bnQgKiBhbmNob3IuYWxpYXNDb3VudCA6IDA7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzQ29sbGVjdGlvbihub2RlKSkge1xuICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygbm9kZS5pdGVtcykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGdldEFsaWFzQ291bnQoZG9jLCBpdGVtLCBhbmNob3JzKTtcbiAgICAgICAgICAgIGlmIChjID4gY291bnQpXG4gICAgICAgICAgICAgICAgY291bnQgPSBjO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNQYWlyKG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IGtjID0gZ2V0QWxpYXNDb3VudChkb2MsIG5vZGUua2V5LCBhbmNob3JzKTtcbiAgICAgICAgY29uc3QgdmMgPSBnZXRBbGlhc0NvdW50KGRvYywgbm9kZS52YWx1ZSwgYW5jaG9ycyk7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChrYywgdmMpO1xuICAgIH1cbiAgICByZXR1cm4gMTtcbn1cblxuZXhwb3J0IHsgQWxpYXMgfTtcbiIsICJpbXBvcnQgeyBoYXNBbmNob3IgfSBmcm9tICcuL05vZGUuanMnO1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGNvbnZlcnQgYW55IG5vZGUgb3IgaXRzIGNvbnRlbnRzIHRvIG5hdGl2ZSBKYXZhU2NyaXB0XG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIGlucHV0IHZhbHVlXG4gKiBAcGFyYW0gYXJnIC0gSWYgYHZhbHVlYCBkZWZpbmVzIGEgYHRvSlNPTigpYCBtZXRob2QsIHVzZSB0aGlzXG4gKiAgIGFzIGl0cyBmaXJzdCBhcmd1bWVudFxuICogQHBhcmFtIGN0eCAtIENvbnZlcnNpb24gY29udGV4dCwgb3JpZ2luYWxseSBzZXQgaW4gRG9jdW1lbnQjdG9KUygpLiBJZlxuICogICBgeyBrZWVwOiB0cnVlIH1gIGlzIG5vdCBzZXQsIG91dHB1dCBzaG91bGQgYmUgc3VpdGFibGUgZm9yIEpTT05cbiAqICAgc3RyaW5naWZpY2F0aW9uLlxuICovXG5mdW5jdGlvbiB0b0pTKHZhbHVlLCBhcmcsIGN0eCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLXJldHVyblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIHZhbHVlLm1hcCgodiwgaSkgPT4gdG9KUyh2LCBTdHJpbmcoaSksIGN0eCkpO1xuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUudG9KU09OID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWNhbGxcbiAgICAgICAgaWYgKCFjdHggfHwgIWhhc0FuY2hvcih2YWx1ZSkpXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudG9KU09OKGFyZywgY3R4KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHsgYWxpYXNDb3VudDogMCwgY291bnQ6IDEsIHJlczogdW5kZWZpbmVkIH07XG4gICAgICAgIGN0eC5hbmNob3JzLnNldCh2YWx1ZSwgZGF0YSk7XG4gICAgICAgIGN0eC5vbkNyZWF0ZSA9IHJlcyA9PiB7XG4gICAgICAgICAgICBkYXRhLnJlcyA9IHJlcztcbiAgICAgICAgICAgIGRlbGV0ZSBjdHgub25DcmVhdGU7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlcyA9IHZhbHVlLnRvSlNPTihhcmcsIGN0eCk7XG4gICAgICAgIGlmIChjdHgub25DcmVhdGUpXG4gICAgICAgICAgICBjdHgub25DcmVhdGUocmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgJiYgIWN0eD8ua2VlcClcbiAgICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgeyB0b0pTIH07XG4iLCAiaW1wb3J0IHsgTm9kZUJhc2UsIFNDQUxBUiB9IGZyb20gJy4vTm9kZS5qcyc7XG5pbXBvcnQgeyB0b0pTIH0gZnJvbSAnLi90b0pTLmpzJztcblxuY29uc3QgaXNTY2FsYXJWYWx1ZSA9ICh2YWx1ZSkgPT4gIXZhbHVlIHx8ICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jyk7XG5jbGFzcyBTY2FsYXIgZXh0ZW5kcyBOb2RlQmFzZSB7XG4gICAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICAgICAgc3VwZXIoU0NBTEFSKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICB0b0pTT04oYXJnLCBjdHgpIHtcbiAgICAgICAgcmV0dXJuIGN0eD8ua2VlcCA/IHRoaXMudmFsdWUgOiB0b0pTKHRoaXMudmFsdWUsIGFyZywgY3R4KTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcodGhpcy52YWx1ZSk7XG4gICAgfVxufVxuU2NhbGFyLkJMT0NLX0ZPTERFRCA9ICdCTE9DS19GT0xERUQnO1xuU2NhbGFyLkJMT0NLX0xJVEVSQUwgPSAnQkxPQ0tfTElURVJBTCc7XG5TY2FsYXIuUExBSU4gPSAnUExBSU4nO1xuU2NhbGFyLlFVT1RFX0RPVUJMRSA9ICdRVU9URV9ET1VCTEUnO1xuU2NhbGFyLlFVT1RFX1NJTkdMRSA9ICdRVU9URV9TSU5HTEUnO1xuXG5leHBvcnQgeyBTY2FsYXIsIGlzU2NhbGFyVmFsdWUgfTtcbiIsICJpbXBvcnQgeyBBbGlhcyB9IGZyb20gJy4uL25vZGVzL0FsaWFzLmpzJztcbmltcG9ydCB7IGlzTm9kZSwgaXNQYWlyLCBNQVAsIFNFUSwgaXNEb2N1bWVudCB9IGZyb20gJy4uL25vZGVzL05vZGUuanMnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcblxuY29uc3QgZGVmYXVsdFRhZ1ByZWZpeCA9ICd0YWc6eWFtbC5vcmcsMjAwMjonO1xuZnVuY3Rpb24gZmluZFRhZ09iamVjdCh2YWx1ZSwgdGFnTmFtZSwgdGFncykge1xuICAgIGlmICh0YWdOYW1lKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGFncy5maWx0ZXIodCA9PiB0LnRhZyA9PT0gdGFnTmFtZSk7XG4gICAgICAgIGNvbnN0IHRhZ09iaiA9IG1hdGNoLmZpbmQodCA9PiAhdC5mb3JtYXQpID8/IG1hdGNoWzBdO1xuICAgICAgICBpZiAoIXRhZ09iailcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFnICR7dGFnTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgICAgIHJldHVybiB0YWdPYmo7XG4gICAgfVxuICAgIHJldHVybiB0YWdzLmZpbmQodCA9PiB0LmlkZW50aWZ5Py4odmFsdWUpICYmICF0LmZvcm1hdCk7XG59XG5mdW5jdGlvbiBjcmVhdGVOb2RlKHZhbHVlLCB0YWdOYW1lLCBjdHgpIHtcbiAgICBpZiAoaXNEb2N1bWVudCh2YWx1ZSkpXG4gICAgICAgIHZhbHVlID0gdmFsdWUuY29udGVudHM7XG4gICAgaWYgKGlzTm9kZSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICBpZiAoaXNQYWlyKHZhbHVlKSkge1xuICAgICAgICBjb25zdCBtYXAgPSBjdHguc2NoZW1hW01BUF0uY3JlYXRlTm9kZT8uKGN0eC5zY2hlbWEsIG51bGwsIGN0eCk7XG4gICAgICAgIG1hcC5pdGVtcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nIHx8XG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyIHx8XG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbiB8fFxuICAgICAgICAodHlwZW9mIEJpZ0ludCA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEJpZ0ludCkgLy8gbm90IHN1cHBvcnRlZCBldmVyeXdoZXJlXG4gICAgKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2VyaWFsaXplanNvbnByb3BlcnR5XG4gICAgICAgIHZhbHVlID0gdmFsdWUudmFsdWVPZigpO1xuICAgIH1cbiAgICBjb25zdCB7IGFsaWFzRHVwbGljYXRlT2JqZWN0cywgb25BbmNob3IsIG9uVGFnT2JqLCBzY2hlbWEsIHNvdXJjZU9iamVjdHMgfSA9IGN0eDtcbiAgICAvLyBEZXRlY3QgZHVwbGljYXRlIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgb2JqZWN0ICYgdXNlIEFsaWFzIG5vZGVzIGZvciBhbGxcbiAgICAvLyBhZnRlciBmaXJzdC4gVGhlIGByZWZgIHdyYXBwZXIgYWxsb3dzIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIHRvIHJlc29sdmUuXG4gICAgbGV0IHJlZiA9IHVuZGVmaW5lZDtcbiAgICBpZiAoYWxpYXNEdXBsaWNhdGVPYmplY3RzICYmIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmVmID0gc291cmNlT2JqZWN0cy5nZXQodmFsdWUpO1xuICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICBpZiAoIXJlZi5hbmNob3IpXG4gICAgICAgICAgICAgICAgcmVmLmFuY2hvciA9IG9uQW5jaG9yKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWxpYXMocmVmLmFuY2hvcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZWYgPSB7IGFuY2hvcjogbnVsbCwgbm9kZTogbnVsbCB9O1xuICAgICAgICAgICAgc291cmNlT2JqZWN0cy5zZXQodmFsdWUsIHJlZik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRhZ05hbWU/LnN0YXJ0c1dpdGgoJyEhJykpXG4gICAgICAgIHRhZ05hbWUgPSBkZWZhdWx0VGFnUHJlZml4ICsgdGFnTmFtZS5zbGljZSgyKTtcbiAgICBsZXQgdGFnT2JqID0gZmluZFRhZ09iamVjdCh2YWx1ZSwgdGFnTmFtZSwgc2NoZW1hLnRhZ3MpO1xuICAgIGlmICghdGFnT2JqKSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUudG9KU09OID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvSlNPTigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBTY2FsYXIodmFsdWUpO1xuICAgICAgICAgICAgaWYgKHJlZilcbiAgICAgICAgICAgICAgICByZWYubm9kZSA9IG5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICB0YWdPYmogPVxuICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBNYXBcbiAgICAgICAgICAgICAgICA/IHNjaGVtYVtNQVBdXG4gICAgICAgICAgICAgICAgOiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA/IHNjaGVtYVtTRVFdXG4gICAgICAgICAgICAgICAgICAgIDogc2NoZW1hW01BUF07XG4gICAgfVxuICAgIGlmIChvblRhZ09iaikge1xuICAgICAgICBvblRhZ09iaih0YWdPYmopO1xuICAgICAgICBkZWxldGUgY3R4Lm9uVGFnT2JqO1xuICAgIH1cbiAgICBjb25zdCBub2RlID0gdGFnT2JqPy5jcmVhdGVOb2RlXG4gICAgICAgID8gdGFnT2JqLmNyZWF0ZU5vZGUoY3R4LnNjaGVtYSwgdmFsdWUsIGN0eClcbiAgICAgICAgOiBuZXcgU2NhbGFyKHZhbHVlKTtcbiAgICBpZiAodGFnTmFtZSlcbiAgICAgICAgbm9kZS50YWcgPSB0YWdOYW1lO1xuICAgIGlmIChyZWYpXG4gICAgICAgIHJlZi5ub2RlID0gbm9kZTtcbiAgICByZXR1cm4gbm9kZTtcbn1cblxuZXhwb3J0IHsgY3JlYXRlTm9kZSB9O1xuIiwgImltcG9ydCB7IGNyZWF0ZU5vZGUgfSBmcm9tICcuLi9kb2MvY3JlYXRlTm9kZS5qcyc7XG5pbXBvcnQgeyBOb2RlQmFzZSwgaXNOb2RlLCBpc1BhaXIsIGlzQ29sbGVjdGlvbiwgaXNTY2FsYXIgfSBmcm9tICcuL05vZGUuanMnO1xuXG5mdW5jdGlvbiBjb2xsZWN0aW9uRnJvbVBhdGgoc2NoZW1hLCBwYXRoLCB2YWx1ZSkge1xuICAgIGxldCB2ID0gdmFsdWU7XG4gICAgZm9yIChsZXQgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgY29uc3QgayA9IHBhdGhbaV07XG4gICAgICAgIGlmICh0eXBlb2YgayA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzSW50ZWdlcihrKSAmJiBrID49IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBbXTtcbiAgICAgICAgICAgIGFba10gPSB2O1xuICAgICAgICAgICAgdiA9IGE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2ID0gbmV3IE1hcChbW2ssIHZdXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZU5vZGUodiwgdW5kZWZpbmVkLCB7XG4gICAgICAgIGFsaWFzRHVwbGljYXRlT2JqZWN0czogZmFsc2UsXG4gICAgICAgIGtlZXBVbmRlZmluZWQ6IGZhbHNlLFxuICAgICAgICBvbkFuY2hvcjogKCkgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHNob3VsZCBub3QgaGFwcGVuLCBwbGVhc2UgcmVwb3J0IGEgYnVnLicpO1xuICAgICAgICB9LFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgIHNvdXJjZU9iamVjdHM6IG5ldyBNYXAoKVxuICAgIH0pO1xufVxuLy8gVHlwZSBndWFyZCBpcyBpbnRlbnRpb25hbGx5IGEgbGl0dGxlIHdyb25nIHNvIGFzIHRvIGJlIG1vcmUgdXNlZnVsLFxuLy8gYXMgaXQgZG9lcyBub3QgY292ZXIgdW50eXBhYmxlIGVtcHR5IG5vbi1zdHJpbmcgaXRlcmFibGVzIChlLmcuIFtdKS5cbmNvbnN0IGlzRW1wdHlQYXRoID0gKHBhdGgpID0+IHBhdGggPT0gbnVsbCB8fFxuICAgICh0eXBlb2YgcGF0aCA9PT0gJ29iamVjdCcgJiYgISFwYXRoW1N5bWJvbC5pdGVyYXRvcl0oKS5uZXh0KCkuZG9uZSk7XG5jbGFzcyBDb2xsZWN0aW9uIGV4dGVuZHMgTm9kZUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHR5cGUsIHNjaGVtYSkge1xuICAgICAgICBzdXBlcih0eXBlKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdzY2hlbWEnLCB7XG4gICAgICAgICAgICB2YWx1ZTogc2NoZW1hLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgY29weSBvZiB0aGlzIGNvbGxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2NoZW1hIC0gSWYgZGVmaW5lZCwgb3ZlcndyaXRlcyB0aGUgb3JpZ2luYWwncyBzY2hlbWFcbiAgICAgKi9cbiAgICBjbG9uZShzY2hlbWEpIHtcbiAgICAgICAgY29uc3QgY29weSA9IE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0aGlzKSk7XG4gICAgICAgIGlmIChzY2hlbWEpXG4gICAgICAgICAgICBjb3B5LnNjaGVtYSA9IHNjaGVtYTtcbiAgICAgICAgY29weS5pdGVtcyA9IGNvcHkuaXRlbXMubWFwKGl0ID0+IGlzTm9kZShpdCkgfHwgaXNQYWlyKGl0KSA/IGl0LmNsb25lKHNjaGVtYSkgOiBpdCk7XG4gICAgICAgIGlmICh0aGlzLnJhbmdlKVxuICAgICAgICAgICAgY29weS5yYW5nZSA9IHRoaXMucmFuZ2Uuc2xpY2UoKTtcbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSB2YWx1ZSB0byB0aGUgY29sbGVjdGlvbi4gRm9yIGAhIW1hcGAgYW5kIGAhIW9tYXBgIHRoZSB2YWx1ZSBtdXN0XG4gICAgICogYmUgYSBQYWlyIGluc3RhbmNlIG9yIGEgYHsga2V5LCB2YWx1ZSB9YCBvYmplY3QsIHdoaWNoIG1heSBub3QgaGF2ZSBhIGtleVxuICAgICAqIHRoYXQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIG1hcC5cbiAgICAgKi9cbiAgICBhZGRJbihwYXRoLCB2YWx1ZSkge1xuICAgICAgICBpZiAoaXNFbXB0eVBhdGgocGF0aCkpXG4gICAgICAgICAgICB0aGlzLmFkZCh2YWx1ZSk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRoO1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0KGtleSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoaXNDb2xsZWN0aW9uKG5vZGUpKVxuICAgICAgICAgICAgICAgIG5vZGUuYWRkSW4ocmVzdCwgdmFsdWUpO1xuICAgICAgICAgICAgZWxzZSBpZiAobm9kZSA9PT0gdW5kZWZpbmVkICYmIHRoaXMuc2NoZW1hKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgY29sbGVjdGlvbkZyb21QYXRoKHRoaXMuc2NoZW1hLCByZXN0LCB2YWx1ZSkpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgWUFNTCBjb2xsZWN0aW9uIGF0ICR7a2V5fS4gUmVtYWluaW5nIHBhdGg6ICR7cmVzdH1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgdmFsdWUgZnJvbSB0aGUgY29sbGVjdGlvbi5cbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGl0ZW0gd2FzIGZvdW5kIGFuZCByZW1vdmVkLlxuICAgICAqL1xuICAgIGRlbGV0ZUluKHBhdGgpIHtcbiAgICAgICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRoO1xuICAgICAgICBpZiAocmVzdC5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWxldGUoa2V5KTtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0KGtleSwgdHJ1ZSk7XG4gICAgICAgIGlmIChpc0NvbGxlY3Rpb24obm9kZSkpXG4gICAgICAgICAgICByZXR1cm4gbm9kZS5kZWxldGVJbihyZXN0KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBZQU1MIGNvbGxlY3Rpb24gYXQgJHtrZXl9LiBSZW1haW5pbmcgcGF0aDogJHtyZXN0fWApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGl0ZW0gYXQgYGtleWAsIG9yIGB1bmRlZmluZWRgIGlmIG5vdCBmb3VuZC4gQnkgZGVmYXVsdCB1bndyYXBzXG4gICAgICogc2NhbGFyIHZhbHVlcyBmcm9tIHRoZWlyIHN1cnJvdW5kaW5nIG5vZGU7IHRvIGRpc2FibGUgc2V0IGBrZWVwU2NhbGFyYCB0b1xuICAgICAqIGB0cnVlYCAoY29sbGVjdGlvbnMgYXJlIGFsd2F5cyByZXR1cm5lZCBpbnRhY3QpLlxuICAgICAqL1xuICAgIGdldEluKHBhdGgsIGtlZXBTY2FsYXIpIHtcbiAgICAgICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRoO1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5nZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgaWYgKHJlc3QubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuICFrZWVwU2NhbGFyICYmIGlzU2NhbGFyKG5vZGUpID8gbm9kZS52YWx1ZSA6IG5vZGU7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBpc0NvbGxlY3Rpb24obm9kZSkgPyBub2RlLmdldEluKHJlc3QsIGtlZXBTY2FsYXIpIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBoYXNBbGxOdWxsVmFsdWVzKGFsbG93U2NhbGFyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1zLmV2ZXJ5KG5vZGUgPT4ge1xuICAgICAgICAgICAgaWYgKCFpc1BhaXIobm9kZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgbiA9IG5vZGUudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gKG4gPT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgIChhbGxvd1NjYWxhciAmJlxuICAgICAgICAgICAgICAgICAgICBpc1NjYWxhcihuKSAmJlxuICAgICAgICAgICAgICAgICAgICBuLnZhbHVlID09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgIW4uY29tbWVudEJlZm9yZSAmJlxuICAgICAgICAgICAgICAgICAgICAhbi5jb21tZW50ICYmXG4gICAgICAgICAgICAgICAgICAgICFuLnRhZykpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjb2xsZWN0aW9uIGluY2x1ZGVzIGEgdmFsdWUgd2l0aCB0aGUga2V5IGBrZXlgLlxuICAgICAqL1xuICAgIGhhc0luKHBhdGgpIHtcbiAgICAgICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRoO1xuICAgICAgICBpZiAocmVzdC5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYXMoa2V5KTtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0KGtleSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBpc0NvbGxlY3Rpb24obm9kZSkgPyBub2RlLmhhc0luKHJlc3QpIDogZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgYSB2YWx1ZSBpbiB0aGlzIGNvbGxlY3Rpb24uIEZvciBgISFzZXRgLCBgdmFsdWVgIG5lZWRzIHRvIGJlIGFcbiAgICAgKiBib29sZWFuIHRvIGFkZC9yZW1vdmUgdGhlIGl0ZW0gZnJvbSB0aGUgc2V0LlxuICAgICAqL1xuICAgIHNldEluKHBhdGgsIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IFtrZXksIC4uLnJlc3RdID0gcGF0aDtcbiAgICAgICAgaWYgKHJlc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldChrZXksIHRydWUpO1xuICAgICAgICAgICAgaWYgKGlzQ29sbGVjdGlvbihub2RlKSlcbiAgICAgICAgICAgICAgICBub2RlLnNldEluKHJlc3QsIHZhbHVlKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnNjaGVtYSlcbiAgICAgICAgICAgICAgICB0aGlzLnNldChrZXksIGNvbGxlY3Rpb25Gcm9tUGF0aCh0aGlzLnNjaGVtYSwgcmVzdCwgdmFsdWUpKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIFlBTUwgY29sbGVjdGlvbiBhdCAke2tleX0uIFJlbWFpbmluZyBwYXRoOiAke3Jlc3R9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5Db2xsZWN0aW9uLm1heEZsb3dTdHJpbmdTaW5nbGVMaW5lTGVuZ3RoID0gNjA7XG5cbmV4cG9ydCB7IENvbGxlY3Rpb24sIGNvbGxlY3Rpb25Gcm9tUGF0aCwgaXNFbXB0eVBhdGggfTtcbiIsICIvKipcbiAqIFN0cmluZ2lmaWVzIGEgY29tbWVudC5cbiAqXG4gKiBFbXB0eSBjb21tZW50IGxpbmVzIGFyZSBsZWZ0IGVtcHR5LFxuICogbGluZXMgY29uc2lzdGluZyBvZiBhIHNpbmdsZSBzcGFjZSBhcmUgcmVwbGFjZWQgYnkgYCNgLFxuICogYW5kIGFsbCBvdGhlciBsaW5lcyBhcmUgcHJlZml4ZWQgd2l0aCBhIGAjYC5cbiAqL1xuY29uc3Qgc3RyaW5naWZ5Q29tbWVudCA9IChzdHIpID0+IHN0ci5yZXBsYWNlKC9eKD8hJCkoPzogJCk/L2dtLCAnIycpO1xuZnVuY3Rpb24gaW5kZW50Q29tbWVudChjb21tZW50LCBpbmRlbnQpIHtcbiAgICBpZiAoL15cXG4rJC8udGVzdChjb21tZW50KSlcbiAgICAgICAgcmV0dXJuIGNvbW1lbnQuc3Vic3RyaW5nKDEpO1xuICAgIHJldHVybiBpbmRlbnQgPyBjb21tZW50LnJlcGxhY2UoL14oPyEgKiQpL2dtLCBpbmRlbnQpIDogY29tbWVudDtcbn1cbmNvbnN0IGxpbmVDb21tZW50ID0gKHN0ciwgaW5kZW50LCBjb21tZW50KSA9PiBzdHIuZW5kc1dpdGgoJ1xcbicpXG4gICAgPyBpbmRlbnRDb21tZW50KGNvbW1lbnQsIGluZGVudClcbiAgICA6IGNvbW1lbnQuaW5jbHVkZXMoJ1xcbicpXG4gICAgICAgID8gJ1xcbicgKyBpbmRlbnRDb21tZW50KGNvbW1lbnQsIGluZGVudClcbiAgICAgICAgOiAoc3RyLmVuZHNXaXRoKCcgJykgPyAnJyA6ICcgJykgKyBjb21tZW50O1xuXG5leHBvcnQgeyBpbmRlbnRDb21tZW50LCBsaW5lQ29tbWVudCwgc3RyaW5naWZ5Q29tbWVudCB9O1xuIiwgImNvbnN0IEZPTERfRkxPVyA9ICdmbG93JztcbmNvbnN0IEZPTERfQkxPQ0sgPSAnYmxvY2snO1xuY29uc3QgRk9MRF9RVU9URUQgPSAncXVvdGVkJztcbi8qKlxuICogVHJpZXMgdG8ga2VlcCBpbnB1dCBhdCB1cCB0byBgbGluZVdpZHRoYCBjaGFyYWN0ZXJzLCBzcGxpdHRpbmcgb25seSBvbiBzcGFjZXNcbiAqIG5vdCBmb2xsb3dlZCBieSBuZXdsaW5lcyBvciBzcGFjZXMgdW5sZXNzIGBtb2RlYCBpcyBgJ3F1b3RlZCdgLiBMaW5lcyBhcmVcbiAqIHRlcm1pbmF0ZWQgd2l0aCBgXFxuYCBhbmQgc3RhcnRlZCB3aXRoIGBpbmRlbnRgLlxuICovXG5mdW5jdGlvbiBmb2xkRmxvd0xpbmVzKHRleHQsIGluZGVudCwgbW9kZSA9ICdmbG93JywgeyBpbmRlbnRBdFN0YXJ0LCBsaW5lV2lkdGggPSA4MCwgbWluQ29udGVudFdpZHRoID0gMjAsIG9uRm9sZCwgb25PdmVyZmxvdyB9ID0ge30pIHtcbiAgICBpZiAoIWxpbmVXaWR0aCB8fCBsaW5lV2lkdGggPCAwKVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICBjb25zdCBlbmRTdGVwID0gTWF0aC5tYXgoMSArIG1pbkNvbnRlbnRXaWR0aCwgMSArIGxpbmVXaWR0aCAtIGluZGVudC5sZW5ndGgpO1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA8PSBlbmRTdGVwKVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICBjb25zdCBmb2xkcyA9IFtdO1xuICAgIGNvbnN0IGVzY2FwZWRGb2xkcyA9IHt9O1xuICAgIGxldCBlbmQgPSBsaW5lV2lkdGggLSBpbmRlbnQubGVuZ3RoO1xuICAgIGlmICh0eXBlb2YgaW5kZW50QXRTdGFydCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKGluZGVudEF0U3RhcnQgPiBsaW5lV2lkdGggLSBNYXRoLm1heCgyLCBtaW5Db250ZW50V2lkdGgpKVxuICAgICAgICAgICAgZm9sZHMucHVzaCgwKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZW5kID0gbGluZVdpZHRoIC0gaW5kZW50QXRTdGFydDtcbiAgICB9XG4gICAgbGV0IHNwbGl0ID0gdW5kZWZpbmVkO1xuICAgIGxldCBwcmV2ID0gdW5kZWZpbmVkO1xuICAgIGxldCBvdmVyZmxvdyA9IGZhbHNlO1xuICAgIGxldCBpID0gLTE7XG4gICAgbGV0IGVzY1N0YXJ0ID0gLTE7XG4gICAgbGV0IGVzY0VuZCA9IC0xO1xuICAgIGlmIChtb2RlID09PSBGT0xEX0JMT0NLKSB7XG4gICAgICAgIGkgPSBjb25zdW1lTW9yZUluZGVudGVkTGluZXModGV4dCwgaSk7XG4gICAgICAgIGlmIChpICE9PSAtMSlcbiAgICAgICAgICAgIGVuZCA9IGkgKyBlbmRTdGVwO1xuICAgIH1cbiAgICBmb3IgKGxldCBjaDsgKGNoID0gdGV4dFsoaSArPSAxKV0pOykge1xuICAgICAgICBpZiAobW9kZSA9PT0gRk9MRF9RVU9URUQgJiYgY2ggPT09ICdcXFxcJykge1xuICAgICAgICAgICAgZXNjU3RhcnQgPSBpO1xuICAgICAgICAgICAgc3dpdGNoICh0ZXh0W2kgKyAxXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3gnOlxuICAgICAgICAgICAgICAgICAgICBpICs9IDM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3UnOlxuICAgICAgICAgICAgICAgICAgICBpICs9IDU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1UnOlxuICAgICAgICAgICAgICAgICAgICBpICs9IDk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVzY0VuZCA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoID09PSAnXFxuJykge1xuICAgICAgICAgICAgaWYgKG1vZGUgPT09IEZPTERfQkxPQ0spXG4gICAgICAgICAgICAgICAgaSA9IGNvbnN1bWVNb3JlSW5kZW50ZWRMaW5lcyh0ZXh0LCBpKTtcbiAgICAgICAgICAgIGVuZCA9IGkgKyBlbmRTdGVwO1xuICAgICAgICAgICAgc3BsaXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoY2ggPT09ICcgJyAmJlxuICAgICAgICAgICAgICAgIHByZXYgJiZcbiAgICAgICAgICAgICAgICBwcmV2ICE9PSAnICcgJiZcbiAgICAgICAgICAgICAgICBwcmV2ICE9PSAnXFxuJyAmJlxuICAgICAgICAgICAgICAgIHByZXYgIT09ICdcXHQnKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BhY2Ugc3Vycm91bmRlZCBieSBub24tc3BhY2UgY2FuIGJlIHJlcGxhY2VkIHdpdGggbmV3bGluZSArIGluZGVudFxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSB0ZXh0W2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCAmJiBuZXh0ICE9PSAnICcgJiYgbmV4dCAhPT0gJ1xcbicgJiYgbmV4dCAhPT0gJ1xcdCcpXG4gICAgICAgICAgICAgICAgICAgIHNwbGl0ID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpID49IGVuZCkge1xuICAgICAgICAgICAgICAgIGlmIChzcGxpdCkge1xuICAgICAgICAgICAgICAgICAgICBmb2xkcy5wdXNoKHNwbGl0KTtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gc3BsaXQgKyBlbmRTdGVwO1xuICAgICAgICAgICAgICAgICAgICBzcGxpdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZSA9PT0gRk9MRF9RVU9URUQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hpdGUtc3BhY2UgY29sbGVjdGVkIGF0IGVuZCBtYXkgc3RyZXRjaCBwYXN0IGxpbmVXaWR0aFxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAocHJldiA9PT0gJyAnIHx8IHByZXYgPT09ICdcXHQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID0gY2g7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaCA9IHRleHRbKGkgKz0gMSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEFjY291bnQgZm9yIG5ld2xpbmUgZXNjYXBlLCBidXQgZG9uJ3QgYnJlYWsgcHJlY2VkaW5nIGVzY2FwZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBqID0gaSA+IGVzY0VuZCArIDEgPyBpIC0gMiA6IGVzY1N0YXJ0IC0gMTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQmFpbCBvdXQgaWYgbGluZVdpZHRoICYgbWluQ29udGVudFdpZHRoIGFyZSBzaG9ydGVyIHRoYW4gYW4gZXNjYXBlIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXNjYXBlZEZvbGRzW2pdKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICAgICAgICAgICAgICAgIGZvbGRzLnB1c2goaik7XG4gICAgICAgICAgICAgICAgICAgIGVzY2FwZWRGb2xkc1tqXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IGogKyBlbmRTdGVwO1xuICAgICAgICAgICAgICAgICAgICBzcGxpdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHJldiA9IGNoO1xuICAgIH1cbiAgICBpZiAob3ZlcmZsb3cgJiYgb25PdmVyZmxvdylcbiAgICAgICAgb25PdmVyZmxvdygpO1xuICAgIGlmIChmb2xkcy5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIGlmIChvbkZvbGQpXG4gICAgICAgIG9uRm9sZCgpO1xuICAgIGxldCByZXMgPSB0ZXh0LnNsaWNlKDAsIGZvbGRzWzBdKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvbGRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGZvbGQgPSBmb2xkc1tpXTtcbiAgICAgICAgY29uc3QgZW5kID0gZm9sZHNbaSArIDFdIHx8IHRleHQubGVuZ3RoO1xuICAgICAgICBpZiAoZm9sZCA9PT0gMClcbiAgICAgICAgICAgIHJlcyA9IGBcXG4ke2luZGVudH0ke3RleHQuc2xpY2UoMCwgZW5kKX1gO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChtb2RlID09PSBGT0xEX1FVT1RFRCAmJiBlc2NhcGVkRm9sZHNbZm9sZF0pXG4gICAgICAgICAgICAgICAgcmVzICs9IGAke3RleHRbZm9sZF19XFxcXGA7XG4gICAgICAgICAgICByZXMgKz0gYFxcbiR7aW5kZW50fSR7dGV4dC5zbGljZShmb2xkICsgMSwgZW5kKX1gO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG4vKipcbiAqIFByZXN1bWVzIGBpICsgMWAgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZVxuICogQHJldHVybnMgaW5kZXggb2YgbGFzdCBuZXdsaW5lIGluIG1vcmUtaW5kZW50ZWQgYmxvY2tcbiAqL1xuZnVuY3Rpb24gY29uc3VtZU1vcmVJbmRlbnRlZExpbmVzKHRleHQsIGkpIHtcbiAgICBsZXQgY2ggPSB0ZXh0W2kgKyAxXTtcbiAgICB3aGlsZSAoY2ggPT09ICcgJyB8fCBjaCA9PT0gJ1xcdCcpIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgY2ggPSB0ZXh0WyhpICs9IDEpXTtcbiAgICAgICAgfSB3aGlsZSAoY2ggJiYgY2ggIT09ICdcXG4nKTtcbiAgICAgICAgY2ggPSB0ZXh0W2kgKyAxXTtcbiAgICB9XG4gICAgcmV0dXJuIGk7XG59XG5cbmV4cG9ydCB7IEZPTERfQkxPQ0ssIEZPTERfRkxPVywgRk9MRF9RVU9URUQsIGZvbGRGbG93TGluZXMgfTtcbiIsICJpbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi9ub2Rlcy9TY2FsYXIuanMnO1xuaW1wb3J0IHsgZm9sZEZsb3dMaW5lcywgRk9MRF9RVU9URUQsIEZPTERfRkxPVywgRk9MRF9CTE9DSyB9IGZyb20gJy4vZm9sZEZsb3dMaW5lcy5qcyc7XG5cbmNvbnN0IGdldEZvbGRPcHRpb25zID0gKGN0eCkgPT4gKHtcbiAgICBpbmRlbnRBdFN0YXJ0OiBjdHguaW5kZW50QXRTdGFydCxcbiAgICBsaW5lV2lkdGg6IGN0eC5vcHRpb25zLmxpbmVXaWR0aCxcbiAgICBtaW5Db250ZW50V2lkdGg6IGN0eC5vcHRpb25zLm1pbkNvbnRlbnRXaWR0aFxufSk7XG4vLyBBbHNvIGNoZWNrcyBmb3IgbGluZXMgc3RhcnRpbmcgd2l0aCAlLCBhcyBwYXJzaW5nIHRoZSBvdXRwdXQgYXMgWUFNTCAxLjEgd2lsbFxuLy8gcHJlc3VtZSB0aGF0J3Mgc3RhcnRpbmcgYSBuZXcgZG9jdW1lbnQuXG5jb25zdCBjb250YWluc0RvY3VtZW50TWFya2VyID0gKHN0cikgPT4gL14oJXwtLS18XFwuXFwuXFwuKS9tLnRlc3Qoc3RyKTtcbmZ1bmN0aW9uIGxpbmVMZW5ndGhPdmVyTGltaXQoc3RyLCBsaW5lV2lkdGgsIGluZGVudExlbmd0aCkge1xuICAgIGlmICghbGluZVdpZHRoIHx8IGxpbmVXaWR0aCA8IDApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBsaW1pdCA9IGxpbmVXaWR0aCAtIGluZGVudExlbmd0aDtcbiAgICBjb25zdCBzdHJMZW4gPSBzdHIubGVuZ3RoO1xuICAgIGlmIChzdHJMZW4gPD0gbGltaXQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMCwgc3RhcnQgPSAwOyBpIDwgc3RyTGVuOyArK2kpIHtcbiAgICAgICAgaWYgKHN0cltpXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgIGlmIChpIC0gc3RhcnQgPiBsaW1pdClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICBpZiAoc3RyTGVuIC0gc3RhcnQgPD0gbGltaXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZG91YmxlUXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpIHtcbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIGlmIChjdHgub3B0aW9ucy5kb3VibGVRdW90ZWRBc0pTT04pXG4gICAgICAgIHJldHVybiBqc29uO1xuICAgIGNvbnN0IHsgaW1wbGljaXRLZXkgfSA9IGN0eDtcbiAgICBjb25zdCBtaW5NdWx0aUxpbmVMZW5ndGggPSBjdHgub3B0aW9ucy5kb3VibGVRdW90ZWRNaW5NdWx0aUxpbmVMZW5ndGg7XG4gICAgY29uc3QgaW5kZW50ID0gY3R4LmluZGVudCB8fCAoY29udGFpbnNEb2N1bWVudE1hcmtlcih2YWx1ZSkgPyAnICAnIDogJycpO1xuICAgIGxldCBzdHIgPSAnJztcbiAgICBsZXQgc3RhcnQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwLCBjaCA9IGpzb25baV07IGNoOyBjaCA9IGpzb25bKytpXSkge1xuICAgICAgICBpZiAoY2ggPT09ICcgJyAmJiBqc29uW2kgKyAxXSA9PT0gJ1xcXFwnICYmIGpzb25baSArIDJdID09PSAnbicpIHtcbiAgICAgICAgICAgIC8vIHNwYWNlIGJlZm9yZSBuZXdsaW5lIG5lZWRzIHRvIGJlIGVzY2FwZWQgdG8gbm90IGJlIGZvbGRlZFxuICAgICAgICAgICAgc3RyICs9IGpzb24uc2xpY2Uoc3RhcnQsIGkpICsgJ1xcXFwgJztcbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIHN0YXJ0ID0gaTtcbiAgICAgICAgICAgIGNoID0gJ1xcXFwnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaCA9PT0gJ1xcXFwnKVxuICAgICAgICAgICAgc3dpdGNoIChqc29uW2kgKyAxXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3UnOlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0ganNvbi5zbGljZShzdGFydCwgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2RlID0ganNvbi5zdWJzdHIoaSArIDIsIDQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMDAwMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXDAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwMDA3JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcYSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzAwMGInOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFx2JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMDAxYic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwMDg1JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcTic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzAwYTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxfJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMjAyOCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXEwnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcyMDI5JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcUCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlLnN1YnN0cigwLCAyKSA9PT0gJzAwJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXHgnICsgY29kZS5zdWJzdHIoMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBqc29uLnN1YnN0cihpLCA2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gNTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbic6XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBsaWNpdEtleSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAganNvbltpICsgMl0gPT09ICdcIicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb24ubGVuZ3RoIDwgbWluTXVsdGlMaW5lTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb2xkaW5nIHdpbGwgZWF0IGZpcnN0IG5ld2xpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBqc29uLnNsaWNlKHN0YXJ0LCBpKSArICdcXG5cXG4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGpzb25baSArIDJdID09PSAnXFxcXCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uW2kgKyAzXSA9PT0gJ24nICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbltpICsgNF0gIT09ICdcIicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcbic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGluZGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwYWNlIGFmdGVyIG5ld2xpbmUgbmVlZHMgdG8gYmUgZXNjYXBlZCB0byBub3QgYmUgZm9sZGVkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoanNvbltpICsgMl0gPT09ICcgJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFwnO1xuICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIHN0ciA9IHN0YXJ0ID8gc3RyICsganNvbi5zbGljZShzdGFydCkgOiBqc29uO1xuICAgIHJldHVybiBpbXBsaWNpdEtleVxuICAgICAgICA/IHN0clxuICAgICAgICA6IGZvbGRGbG93TGluZXMoc3RyLCBpbmRlbnQsIEZPTERfUVVPVEVELCBnZXRGb2xkT3B0aW9ucyhjdHgpKTtcbn1cbmZ1bmN0aW9uIHNpbmdsZVF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KSB7XG4gICAgaWYgKGN0eC5vcHRpb25zLnNpbmdsZVF1b3RlID09PSBmYWxzZSB8fFxuICAgICAgICAoY3R4LmltcGxpY2l0S2V5ICYmIHZhbHVlLmluY2x1ZGVzKCdcXG4nKSkgfHxcbiAgICAgICAgL1sgXFx0XVxcbnxcXG5bIFxcdF0vLnRlc3QodmFsdWUpIC8vIHNpbmdsZSBxdW90ZWQgc3RyaW5nIGNhbid0IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGFyb3VuZCBuZXdsaW5lXG4gICAgKVxuICAgICAgICByZXR1cm4gZG91YmxlUXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpO1xuICAgIGNvbnN0IGluZGVudCA9IGN0eC5pbmRlbnQgfHwgKGNvbnRhaW5zRG9jdW1lbnRNYXJrZXIodmFsdWUpID8gJyAgJyA6ICcnKTtcbiAgICBjb25zdCByZXMgPSBcIidcIiArIHZhbHVlLnJlcGxhY2UoLycvZywgXCInJ1wiKS5yZXBsYWNlKC9cXG4rL2csIGAkJlxcbiR7aW5kZW50fWApICsgXCInXCI7XG4gICAgcmV0dXJuIGN0eC5pbXBsaWNpdEtleVxuICAgICAgICA/IHJlc1xuICAgICAgICA6IGZvbGRGbG93TGluZXMocmVzLCBpbmRlbnQsIEZPTERfRkxPVywgZ2V0Rm9sZE9wdGlvbnMoY3R4KSk7XG59XG5mdW5jdGlvbiBxdW90ZWRTdHJpbmcodmFsdWUsIGN0eCkge1xuICAgIGNvbnN0IHsgc2luZ2xlUXVvdGUgfSA9IGN0eC5vcHRpb25zO1xuICAgIGxldCBxcztcbiAgICBpZiAoc2luZ2xlUXVvdGUgPT09IGZhbHNlKVxuICAgICAgICBxcyA9IGRvdWJsZVF1b3RlZFN0cmluZztcbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgaGFzRG91YmxlID0gdmFsdWUuaW5jbHVkZXMoJ1wiJyk7XG4gICAgICAgIGNvbnN0IGhhc1NpbmdsZSA9IHZhbHVlLmluY2x1ZGVzKFwiJ1wiKTtcbiAgICAgICAgaWYgKGhhc0RvdWJsZSAmJiAhaGFzU2luZ2xlKVxuICAgICAgICAgICAgcXMgPSBzaW5nbGVRdW90ZWRTdHJpbmc7XG4gICAgICAgIGVsc2UgaWYgKGhhc1NpbmdsZSAmJiAhaGFzRG91YmxlKVxuICAgICAgICAgICAgcXMgPSBkb3VibGVRdW90ZWRTdHJpbmc7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHFzID0gc2luZ2xlUXVvdGUgPyBzaW5nbGVRdW90ZWRTdHJpbmcgOiBkb3VibGVRdW90ZWRTdHJpbmc7XG4gICAgfVxuICAgIHJldHVybiBxcyh2YWx1ZSwgY3R4KTtcbn1cbmZ1bmN0aW9uIGJsb2NrU3RyaW5nKHsgY29tbWVudCwgdHlwZSwgdmFsdWUgfSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgY29uc3QgeyBibG9ja1F1b3RlLCBjb21tZW50U3RyaW5nLCBsaW5lV2lkdGggfSA9IGN0eC5vcHRpb25zO1xuICAgIC8vIDEuIEJsb2NrIGNhbid0IGVuZCBpbiB3aGl0ZXNwYWNlIHVubGVzcyB0aGUgbGFzdCBsaW5lIGlzIG5vbi1lbXB0eS5cbiAgICAvLyAyLiBTdHJpbmdzIGNvbnNpc3Rpbmcgb2Ygb25seSB3aGl0ZXNwYWNlIGFyZSBiZXN0IHJlbmRlcmVkIGV4cGxpY2l0bHkuXG4gICAgaWYgKCFibG9ja1F1b3RlIHx8IC9cXG5bXFx0IF0rJC8udGVzdCh2YWx1ZSkgfHwgL15cXHMqJC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KTtcbiAgICB9XG4gICAgY29uc3QgaW5kZW50ID0gY3R4LmluZGVudCB8fFxuICAgICAgICAoY3R4LmZvcmNlQmxvY2tJbmRlbnQgfHwgY29udGFpbnNEb2N1bWVudE1hcmtlcih2YWx1ZSkgPyAnICAnIDogJycpO1xuICAgIGNvbnN0IGxpdGVyYWwgPSBibG9ja1F1b3RlID09PSAnbGl0ZXJhbCdcbiAgICAgICAgPyB0cnVlXG4gICAgICAgIDogYmxvY2tRdW90ZSA9PT0gJ2ZvbGRlZCcgfHwgdHlwZSA9PT0gU2NhbGFyLkJMT0NLX0ZPTERFRFxuICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgOiB0eXBlID09PSBTY2FsYXIuQkxPQ0tfTElURVJBTFxuICAgICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICAgIDogIWxpbmVMZW5ndGhPdmVyTGltaXQodmFsdWUsIGxpbmVXaWR0aCwgaW5kZW50Lmxlbmd0aCk7XG4gICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgcmV0dXJuIGxpdGVyYWwgPyAnfFxcbicgOiAnPlxcbic7XG4gICAgLy8gZGV0ZXJtaW5lIGNob21waW5nIGZyb20gd2hpdGVzcGFjZSBhdCB2YWx1ZSBlbmRcbiAgICBsZXQgY2hvbXA7XG4gICAgbGV0IGVuZFN0YXJ0O1xuICAgIGZvciAoZW5kU3RhcnQgPSB2YWx1ZS5sZW5ndGg7IGVuZFN0YXJ0ID4gMDsgLS1lbmRTdGFydCkge1xuICAgICAgICBjb25zdCBjaCA9IHZhbHVlW2VuZFN0YXJ0IC0gMV07XG4gICAgICAgIGlmIChjaCAhPT0gJ1xcbicgJiYgY2ggIT09ICdcXHQnICYmIGNoICE9PSAnICcpXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgbGV0IGVuZCA9IHZhbHVlLnN1YnN0cmluZyhlbmRTdGFydCk7XG4gICAgY29uc3QgZW5kTmxQb3MgPSBlbmQuaW5kZXhPZignXFxuJyk7XG4gICAgaWYgKGVuZE5sUG9zID09PSAtMSkge1xuICAgICAgICBjaG9tcCA9ICctJzsgLy8gc3RyaXBcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsdWUgPT09IGVuZCB8fCBlbmRObFBvcyAhPT0gZW5kLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgY2hvbXAgPSAnKyc7IC8vIGtlZXBcbiAgICAgICAgaWYgKG9uQ2hvbXBLZWVwKVxuICAgICAgICAgICAgb25DaG9tcEtlZXAoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNob21wID0gJyc7IC8vIGNsaXBcbiAgICB9XG4gICAgaWYgKGVuZCkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIC1lbmQubGVuZ3RoKTtcbiAgICAgICAgaWYgKGVuZFtlbmQubGVuZ3RoIC0gMV0gPT09ICdcXG4nKVxuICAgICAgICAgICAgZW5kID0gZW5kLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgZW5kID0gZW5kLnJlcGxhY2UoL1xcbisoPyFcXG58JCkvZywgYCQmJHtpbmRlbnR9YCk7XG4gICAgfVxuICAgIC8vIGRldGVybWluZSBpbmRlbnQgaW5kaWNhdG9yIGZyb20gd2hpdGVzcGFjZSBhdCB2YWx1ZSBzdGFydFxuICAgIGxldCBzdGFydFdpdGhTcGFjZSA9IGZhbHNlO1xuICAgIGxldCBzdGFydEVuZDtcbiAgICBsZXQgc3RhcnRObFBvcyA9IC0xO1xuICAgIGZvciAoc3RhcnRFbmQgPSAwOyBzdGFydEVuZCA8IHZhbHVlLmxlbmd0aDsgKytzdGFydEVuZCkge1xuICAgICAgICBjb25zdCBjaCA9IHZhbHVlW3N0YXJ0RW5kXTtcbiAgICAgICAgaWYgKGNoID09PSAnICcpXG4gICAgICAgICAgICBzdGFydFdpdGhTcGFjZSA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKGNoID09PSAnXFxuJylcbiAgICAgICAgICAgIHN0YXJ0TmxQb3MgPSBzdGFydEVuZDtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxldCBzdGFydCA9IHZhbHVlLnN1YnN0cmluZygwLCBzdGFydE5sUG9zIDwgc3RhcnRFbmQgPyBzdGFydE5sUG9zICsgMSA6IHN0YXJ0RW5kKTtcbiAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoc3RhcnQubGVuZ3RoKTtcbiAgICAgICAgc3RhcnQgPSBzdGFydC5yZXBsYWNlKC9cXG4rL2csIGAkJiR7aW5kZW50fWApO1xuICAgIH1cbiAgICBjb25zdCBpbmRlbnRTaXplID0gaW5kZW50ID8gJzInIDogJzEnOyAvLyByb290IGlzIGF0IC0xXG4gICAgbGV0IGhlYWRlciA9IChsaXRlcmFsID8gJ3wnIDogJz4nKSArIChzdGFydFdpdGhTcGFjZSA/IGluZGVudFNpemUgOiAnJykgKyBjaG9tcDtcbiAgICBpZiAoY29tbWVudCkge1xuICAgICAgICBoZWFkZXIgKz0gJyAnICsgY29tbWVudFN0cmluZyhjb21tZW50LnJlcGxhY2UoLyA/W1xcclxcbl0rL2csICcgJykpO1xuICAgICAgICBpZiAob25Db21tZW50KVxuICAgICAgICAgICAgb25Db21tZW50KCk7XG4gICAgfVxuICAgIGlmIChsaXRlcmFsKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFxuKy9nLCBgJCYke2luZGVudH1gKTtcbiAgICAgICAgcmV0dXJuIGAke2hlYWRlcn1cXG4ke2luZGVudH0ke3N0YXJ0fSR7dmFsdWV9JHtlbmR9YDtcbiAgICB9XG4gICAgdmFsdWUgPSB2YWx1ZVxuICAgICAgICAucmVwbGFjZSgvXFxuKy9nLCAnXFxuJCYnKVxuICAgICAgICAucmVwbGFjZSgvKD86XnxcXG4pKFtcXHQgXS4qKSg/OihbXFxuXFx0IF0qKVxcbig/IVtcXG5cXHQgXSkpPy9nLCAnJDEkMicpIC8vIG1vcmUtaW5kZW50ZWQgbGluZXMgYXJlbid0IGZvbGRlZFxuICAgICAgICAvLyAgICAgICAgICAgICAgICBeIG1vcmUtaW5kLiBeIGVtcHR5ICAgICBeIGNhcHR1cmUgbmV4dCBlbXB0eSBsaW5lcyBvbmx5IGF0IGVuZCBvZiBpbmRlbnRcbiAgICAgICAgLnJlcGxhY2UoL1xcbisvZywgYCQmJHtpbmRlbnR9YCk7XG4gICAgY29uc3QgYm9keSA9IGZvbGRGbG93TGluZXMoYCR7c3RhcnR9JHt2YWx1ZX0ke2VuZH1gLCBpbmRlbnQsIEZPTERfQkxPQ0ssIGdldEZvbGRPcHRpb25zKGN0eCkpO1xuICAgIHJldHVybiBgJHtoZWFkZXJ9XFxuJHtpbmRlbnR9JHtib2R5fWA7XG59XG5mdW5jdGlvbiBwbGFpblN0cmluZyhpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICBjb25zdCB7IHR5cGUsIHZhbHVlIH0gPSBpdGVtO1xuICAgIGNvbnN0IHsgYWN0dWFsU3RyaW5nLCBpbXBsaWNpdEtleSwgaW5kZW50LCBpbkZsb3cgfSA9IGN0eDtcbiAgICBpZiAoKGltcGxpY2l0S2V5ICYmIC9bXFxuW1xcXXt9LF0vLnRlc3QodmFsdWUpKSB8fFxuICAgICAgICAoaW5GbG93ICYmIC9bW1xcXXt9LF0vLnRlc3QodmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gcXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpO1xuICAgIH1cbiAgICBpZiAoIXZhbHVlIHx8XG4gICAgICAgIC9eW1xcblxcdCAsW1xcXXt9IyYqIXw+J1wiJUBgXXxeWz8tXSR8Xls/LV1bIFxcdF18W1xcbjpdWyBcXHRdfFsgXFx0XVxcbnxbXFxuXFx0IF0jfFtcXG5cXHQgOl0kLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAvLyBub3QgYWxsb3dlZDpcbiAgICAgICAgLy8gLSBlbXB0eSBzdHJpbmcsICctJyBvciAnPydcbiAgICAgICAgLy8gLSBzdGFydCB3aXRoIGFuIGluZGljYXRvciBjaGFyYWN0ZXIgKGV4Y2VwdCBbPzotXSkgb3IgL1s/LV0gL1xuICAgICAgICAvLyAtICdcXG4gJywgJzogJyBvciAnIFxcbicgYW55d2hlcmVcbiAgICAgICAgLy8gLSAnIycgbm90IHByZWNlZGVkIGJ5IGEgbm9uLXNwYWNlIGNoYXJcbiAgICAgICAgLy8gLSBlbmQgd2l0aCAnICcgb3IgJzonXG4gICAgICAgIHJldHVybiBpbXBsaWNpdEtleSB8fCBpbkZsb3cgfHwgIXZhbHVlLmluY2x1ZGVzKCdcXG4nKVxuICAgICAgICAgICAgPyBxdW90ZWRTdHJpbmcodmFsdWUsIGN0eClcbiAgICAgICAgICAgIDogYmxvY2tTdHJpbmcoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICB9XG4gICAgaWYgKCFpbXBsaWNpdEtleSAmJlxuICAgICAgICAhaW5GbG93ICYmXG4gICAgICAgIHR5cGUgIT09IFNjYWxhci5QTEFJTiAmJlxuICAgICAgICB2YWx1ZS5pbmNsdWRlcygnXFxuJykpIHtcbiAgICAgICAgLy8gV2hlcmUgYWxsb3dlZCAmIHR5cGUgbm90IHNldCBleHBsaWNpdGx5LCBwcmVmZXIgYmxvY2sgc3R5bGUgZm9yIG11bHRpbGluZSBzdHJpbmdzXG4gICAgICAgIHJldHVybiBibG9ja1N0cmluZyhpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgIH1cbiAgICBpZiAoaW5kZW50ID09PSAnJyAmJiBjb250YWluc0RvY3VtZW50TWFya2VyKHZhbHVlKSkge1xuICAgICAgICBjdHguZm9yY2VCbG9ja0luZGVudCA9IHRydWU7XG4gICAgICAgIHJldHVybiBibG9ja1N0cmluZyhpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgIH1cbiAgICBjb25zdCBzdHIgPSB2YWx1ZS5yZXBsYWNlKC9cXG4rL2csIGAkJlxcbiR7aW5kZW50fWApO1xuICAgIC8vIFZlcmlmeSB0aGF0IG91dHB1dCB3aWxsIGJlIHBhcnNlZCBhcyBhIHN0cmluZywgYXMgZS5nLiBwbGFpbiBudW1iZXJzIGFuZFxuICAgIC8vIGJvb2xlYW5zIGdldCBwYXJzZWQgd2l0aCB0aG9zZSB0eXBlcyBpbiB2MS4yIChlLmcuICc0MicsICd0cnVlJyAmICcwLjllLTMnKSxcbiAgICAvLyBhbmQgb3RoZXJzIGluIHYxLjEuXG4gICAgaWYgKGFjdHVhbFN0cmluZykge1xuICAgICAgICBjb25zdCB0ZXN0ID0gKHRhZykgPT4gdGFnLmRlZmF1bHQgJiYgdGFnLnRhZyAhPT0gJ3RhZzp5YW1sLm9yZywyMDAyOnN0cicgJiYgdGFnLnRlc3Q/LnRlc3Qoc3RyKTtcbiAgICAgICAgY29uc3QgeyBjb21wYXQsIHRhZ3MgfSA9IGN0eC5kb2Muc2NoZW1hO1xuICAgICAgICBpZiAodGFncy5zb21lKHRlc3QpIHx8IGNvbXBhdD8uc29tZSh0ZXN0KSlcbiAgICAgICAgICAgIHJldHVybiBxdW90ZWRTdHJpbmcodmFsdWUsIGN0eCk7XG4gICAgfVxuICAgIHJldHVybiBpbXBsaWNpdEtleVxuICAgICAgICA/IHN0clxuICAgICAgICA6IGZvbGRGbG93TGluZXMoc3RyLCBpbmRlbnQsIEZPTERfRkxPVywgZ2V0Rm9sZE9wdGlvbnMoY3R4KSk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlTdHJpbmcoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgY29uc3QgeyBpbXBsaWNpdEtleSwgaW5GbG93IH0gPSBjdHg7XG4gICAgY29uc3Qgc3MgPSB0eXBlb2YgaXRlbS52YWx1ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBpdGVtXG4gICAgICAgIDogT2JqZWN0LmFzc2lnbih7fSwgaXRlbSwgeyB2YWx1ZTogU3RyaW5nKGl0ZW0udmFsdWUpIH0pO1xuICAgIGxldCB7IHR5cGUgfSA9IGl0ZW07XG4gICAgaWYgKHR5cGUgIT09IFNjYWxhci5RVU9URV9ET1VCTEUpIHtcbiAgICAgICAgLy8gZm9yY2UgZG91YmxlIHF1b3RlcyBvbiBjb250cm9sIGNoYXJhY3RlcnMgJiB1bnBhaXJlZCBzdXJyb2dhdGVzXG4gICAgICAgIGlmICgvW1xceDAwLVxceDA4XFx4MGItXFx4MWZcXHg3Zi1cXHg5ZlxcdXtEODAwfS1cXHV7REZGRn1dL3UudGVzdChzcy52YWx1ZSkpXG4gICAgICAgICAgICB0eXBlID0gU2NhbGFyLlFVT1RFX0RPVUJMRTtcbiAgICB9XG4gICAgY29uc3QgX3N0cmluZ2lmeSA9IChfdHlwZSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKF90eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFNjYWxhci5CTE9DS19GT0xERUQ6XG4gICAgICAgICAgICBjYXNlIFNjYWxhci5CTE9DS19MSVRFUkFMOlxuICAgICAgICAgICAgICAgIHJldHVybiBpbXBsaWNpdEtleSB8fCBpbkZsb3dcbiAgICAgICAgICAgICAgICAgICAgPyBxdW90ZWRTdHJpbmcoc3MudmFsdWUsIGN0eCkgLy8gYmxvY2tzIGFyZSBub3QgdmFsaWQgaW5zaWRlIGZsb3cgY29udGFpbmVyc1xuICAgICAgICAgICAgICAgICAgICA6IGJsb2NrU3RyaW5nKHNzLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXIuUVVPVEVfRE9VQkxFOlxuICAgICAgICAgICAgICAgIHJldHVybiBkb3VibGVRdW90ZWRTdHJpbmcoc3MudmFsdWUsIGN0eCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhci5RVU9URV9TSU5HTEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNpbmdsZVF1b3RlZFN0cmluZyhzcy52YWx1ZSwgY3R4KTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyLlBMQUlOOlxuICAgICAgICAgICAgICAgIHJldHVybiBwbGFpblN0cmluZyhzcywgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGxldCByZXMgPSBfc3RyaW5naWZ5KHR5cGUpO1xuICAgIGlmIChyZXMgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgeyBkZWZhdWx0S2V5VHlwZSwgZGVmYXVsdFN0cmluZ1R5cGUgfSA9IGN0eC5vcHRpb25zO1xuICAgICAgICBjb25zdCB0ID0gKGltcGxpY2l0S2V5ICYmIGRlZmF1bHRLZXlUeXBlKSB8fCBkZWZhdWx0U3RyaW5nVHlwZTtcbiAgICAgICAgcmVzID0gX3N0cmluZ2lmeSh0KTtcbiAgICAgICAgaWYgKHJlcyA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGVmYXVsdCBzdHJpbmcgdHlwZSAke3R9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCB7IHN0cmluZ2lmeVN0cmluZyB9O1xuIiwgImltcG9ydCB7IGFuY2hvcklzVmFsaWQgfSBmcm9tICcuLi9kb2MvYW5jaG9ycy5qcyc7XG5pbXBvcnQgeyBpc1BhaXIsIGlzQWxpYXMsIGlzTm9kZSwgaXNTY2FsYXIsIGlzQ29sbGVjdGlvbiB9IGZyb20gJy4uL25vZGVzL05vZGUuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5Q29tbWVudCB9IGZyb20gJy4vc3RyaW5naWZ5Q29tbWVudC5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlTdHJpbmcgfSBmcm9tICcuL3N0cmluZ2lmeVN0cmluZy5qcyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0cmluZ2lmeUNvbnRleHQoZG9jLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgb3B0ID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGJsb2NrUXVvdGU6IHRydWUsXG4gICAgICAgIGNvbW1lbnRTdHJpbmc6IHN0cmluZ2lmeUNvbW1lbnQsXG4gICAgICAgIGRlZmF1bHRLZXlUeXBlOiBudWxsLFxuICAgICAgICBkZWZhdWx0U3RyaW5nVHlwZTogJ1BMQUlOJyxcbiAgICAgICAgZGlyZWN0aXZlczogbnVsbCxcbiAgICAgICAgZG91YmxlUXVvdGVkQXNKU09OOiBmYWxzZSxcbiAgICAgICAgZG91YmxlUXVvdGVkTWluTXVsdGlMaW5lTGVuZ3RoOiA0MCxcbiAgICAgICAgZmFsc2VTdHI6ICdmYWxzZScsXG4gICAgICAgIGluZGVudFNlcTogdHJ1ZSxcbiAgICAgICAgbGluZVdpZHRoOiA4MCxcbiAgICAgICAgbWluQ29udGVudFdpZHRoOiAyMCxcbiAgICAgICAgbnVsbFN0cjogJ251bGwnLFxuICAgICAgICBzaW1wbGVLZXlzOiBmYWxzZSxcbiAgICAgICAgc2luZ2xlUXVvdGU6IG51bGwsXG4gICAgICAgIHRydWVTdHI6ICd0cnVlJyxcbiAgICAgICAgdmVyaWZ5QWxpYXNPcmRlcjogdHJ1ZVxuICAgIH0sIGRvYy5zY2hlbWEudG9TdHJpbmdPcHRpb25zLCBvcHRpb25zKTtcbiAgICBsZXQgaW5GbG93O1xuICAgIHN3aXRjaCAob3B0LmNvbGxlY3Rpb25TdHlsZSkge1xuICAgICAgICBjYXNlICdibG9jayc6XG4gICAgICAgICAgICBpbkZsb3cgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdmbG93JzpcbiAgICAgICAgICAgIGluRmxvdyA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGluRmxvdyA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGFuY2hvcnM6IG5ldyBTZXQoKSxcbiAgICAgICAgZG9jLFxuICAgICAgICBpbmRlbnQ6ICcnLFxuICAgICAgICBpbmRlbnRTdGVwOiB0eXBlb2Ygb3B0LmluZGVudCA9PT0gJ251bWJlcicgPyAnICcucmVwZWF0KG9wdC5pbmRlbnQpIDogJyAgJyxcbiAgICAgICAgaW5GbG93LFxuICAgICAgICBvcHRpb25zOiBvcHRcbiAgICB9O1xufVxuZnVuY3Rpb24gZ2V0VGFnT2JqZWN0KHRhZ3MsIGl0ZW0pIHtcbiAgICBpZiAoaXRlbS50YWcpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0YWdzLmZpbHRlcih0ID0+IHQudGFnID09PSBpdGVtLnRhZyk7XG4gICAgICAgIGlmIChtYXRjaC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoLmZpbmQodCA9PiB0LmZvcm1hdCA9PT0gaXRlbS5mb3JtYXQpID8/IG1hdGNoWzBdO1xuICAgIH1cbiAgICBsZXQgdGFnT2JqID0gdW5kZWZpbmVkO1xuICAgIGxldCBvYmo7XG4gICAgaWYgKGlzU2NhbGFyKGl0ZW0pKSB7XG4gICAgICAgIG9iaiA9IGl0ZW0udmFsdWU7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGFncy5maWx0ZXIodCA9PiB0LmlkZW50aWZ5Py4ob2JqKSk7XG4gICAgICAgIHRhZ09iaiA9XG4gICAgICAgICAgICBtYXRjaC5maW5kKHQgPT4gdC5mb3JtYXQgPT09IGl0ZW0uZm9ybWF0KSA/PyBtYXRjaC5maW5kKHQgPT4gIXQuZm9ybWF0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG9iaiA9IGl0ZW07XG4gICAgICAgIHRhZ09iaiA9IHRhZ3MuZmluZCh0ID0+IHQubm9kZUNsYXNzICYmIG9iaiBpbnN0YW5jZW9mIHQubm9kZUNsYXNzKTtcbiAgICB9XG4gICAgaWYgKCF0YWdPYmopIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IG9iaj8uY29uc3RydWN0b3I/Lm5hbWUgPz8gdHlwZW9mIG9iajtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWcgbm90IHJlc29sdmVkIGZvciAke25hbWV9IHZhbHVlYCk7XG4gICAgfVxuICAgIHJldHVybiB0YWdPYmo7XG59XG4vLyBuZWVkcyB0byBiZSBjYWxsZWQgYmVmb3JlIHZhbHVlIHN0cmluZ2lmaWVyIHRvIGFsbG93IGZvciBjaXJjdWxhciBhbmNob3IgcmVmc1xuZnVuY3Rpb24gc3RyaW5naWZ5UHJvcHMobm9kZSwgdGFnT2JqLCB7IGFuY2hvcnMsIGRvYyB9KSB7XG4gICAgaWYgKCFkb2MuZGlyZWN0aXZlcylcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIGNvbnN0IHByb3BzID0gW107XG4gICAgY29uc3QgYW5jaG9yID0gKGlzU2NhbGFyKG5vZGUpIHx8IGlzQ29sbGVjdGlvbihub2RlKSkgJiYgbm9kZS5hbmNob3I7XG4gICAgaWYgKGFuY2hvciAmJiBhbmNob3JJc1ZhbGlkKGFuY2hvcikpIHtcbiAgICAgICAgYW5jaG9ycy5hZGQoYW5jaG9yKTtcbiAgICAgICAgcHJvcHMucHVzaChgJiR7YW5jaG9yfWApO1xuICAgIH1cbiAgICBjb25zdCB0YWcgPSBub2RlLnRhZyA/IG5vZGUudGFnIDogdGFnT2JqLmRlZmF1bHQgPyBudWxsIDogdGFnT2JqLnRhZztcbiAgICBpZiAodGFnKVxuICAgICAgICBwcm9wcy5wdXNoKGRvYy5kaXJlY3RpdmVzLnRhZ1N0cmluZyh0YWcpKTtcbiAgICByZXR1cm4gcHJvcHMuam9pbignICcpO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5KGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgIGlmIChpc1BhaXIoaXRlbSkpXG4gICAgICAgIHJldHVybiBpdGVtLnRvU3RyaW5nKGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgaWYgKGlzQWxpYXMoaXRlbSkpIHtcbiAgICAgICAgaWYgKGN0eC5kb2MuZGlyZWN0aXZlcylcbiAgICAgICAgICAgIHJldHVybiBpdGVtLnRvU3RyaW5nKGN0eCk7XG4gICAgICAgIGlmIChjdHgucmVzb2x2ZWRBbGlhc2VzPy5oYXMoaXRlbSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCBzdHJpbmdpZnkgY2lyY3VsYXIgc3RydWN0dXJlIHdpdGhvdXQgYWxpYXMgbm9kZXNgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjdHgucmVzb2x2ZWRBbGlhc2VzKVxuICAgICAgICAgICAgICAgIGN0eC5yZXNvbHZlZEFsaWFzZXMuYWRkKGl0ZW0pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGN0eC5yZXNvbHZlZEFsaWFzZXMgPSBuZXcgU2V0KFtpdGVtXSk7XG4gICAgICAgICAgICBpdGVtID0gaXRlbS5yZXNvbHZlKGN0eC5kb2MpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCB0YWdPYmogPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm9kZSA9IGlzTm9kZShpdGVtKVxuICAgICAgICA/IGl0ZW1cbiAgICAgICAgOiBjdHguZG9jLmNyZWF0ZU5vZGUoaXRlbSwgeyBvblRhZ09iajogbyA9PiAodGFnT2JqID0gbykgfSk7XG4gICAgaWYgKCF0YWdPYmopXG4gICAgICAgIHRhZ09iaiA9IGdldFRhZ09iamVjdChjdHguZG9jLnNjaGVtYS50YWdzLCBub2RlKTtcbiAgICBjb25zdCBwcm9wcyA9IHN0cmluZ2lmeVByb3BzKG5vZGUsIHRhZ09iaiwgY3R4KTtcbiAgICBpZiAocHJvcHMubGVuZ3RoID4gMClcbiAgICAgICAgY3R4LmluZGVudEF0U3RhcnQgPSAoY3R4LmluZGVudEF0U3RhcnQgPz8gMCkgKyBwcm9wcy5sZW5ndGggKyAxO1xuICAgIGNvbnN0IHN0ciA9IHR5cGVvZiB0YWdPYmouc3RyaW5naWZ5ID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gdGFnT2JqLnN0cmluZ2lmeShub2RlLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApXG4gICAgICAgIDogaXNTY2FsYXIobm9kZSlcbiAgICAgICAgICAgID8gc3RyaW5naWZ5U3RyaW5nKG5vZGUsIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcClcbiAgICAgICAgICAgIDogbm9kZS50b1N0cmluZyhjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgIGlmICghcHJvcHMpXG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgcmV0dXJuIGlzU2NhbGFyKG5vZGUpIHx8IHN0clswXSA9PT0gJ3snIHx8IHN0clswXSA9PT0gJ1snXG4gICAgICAgID8gYCR7cHJvcHN9ICR7c3RyfWBcbiAgICAgICAgOiBgJHtwcm9wc31cXG4ke2N0eC5pbmRlbnR9JHtzdHJ9YDtcbn1cblxuZXhwb3J0IHsgY3JlYXRlU3RyaW5naWZ5Q29udGV4dCwgc3RyaW5naWZ5IH07XG4iLCAiaW1wb3J0IHsgaXNDb2xsZWN0aW9uLCBpc05vZGUsIGlzU2NhbGFyLCBpc1NlcSB9IGZyb20gJy4uL25vZGVzL05vZGUuanMnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IHN0cmluZ2lmeSB9IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcbmltcG9ydCB7IGxpbmVDb21tZW50LCBpbmRlbnRDb21tZW50IH0gZnJvbSAnLi9zdHJpbmdpZnlDb21tZW50LmpzJztcblxuZnVuY3Rpb24gc3RyaW5naWZ5UGFpcih7IGtleSwgdmFsdWUgfSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgY29uc3QgeyBhbGxOdWxsVmFsdWVzLCBkb2MsIGluZGVudCwgaW5kZW50U3RlcCwgb3B0aW9uczogeyBjb21tZW50U3RyaW5nLCBpbmRlbnRTZXEsIHNpbXBsZUtleXMgfSB9ID0gY3R4O1xuICAgIGxldCBrZXlDb21tZW50ID0gKGlzTm9kZShrZXkpICYmIGtleS5jb21tZW50KSB8fCBudWxsO1xuICAgIGlmIChzaW1wbGVLZXlzKSB7XG4gICAgICAgIGlmIChrZXlDb21tZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dpdGggc2ltcGxlIGtleXMsIGtleSBub2RlcyBjYW5ub3QgaGF2ZSBjb21tZW50cycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0NvbGxlY3Rpb24oa2V5KSkge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gJ1dpdGggc2ltcGxlIGtleXMsIGNvbGxlY3Rpb24gY2Fubm90IGJlIHVzZWQgYXMgYSBrZXkgdmFsdWUnO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IGV4cGxpY2l0S2V5ID0gIXNpbXBsZUtleXMgJiZcbiAgICAgICAgKCFrZXkgfHxcbiAgICAgICAgICAgIChrZXlDb21tZW50ICYmIHZhbHVlID09IG51bGwgJiYgIWN0eC5pbkZsb3cpIHx8XG4gICAgICAgICAgICBpc0NvbGxlY3Rpb24oa2V5KSB8fFxuICAgICAgICAgICAgKGlzU2NhbGFyKGtleSlcbiAgICAgICAgICAgICAgICA/IGtleS50eXBlID09PSBTY2FsYXIuQkxPQ0tfRk9MREVEIHx8IGtleS50eXBlID09PSBTY2FsYXIuQkxPQ0tfTElURVJBTFxuICAgICAgICAgICAgICAgIDogdHlwZW9mIGtleSA9PT0gJ29iamVjdCcpKTtcbiAgICBjdHggPSBPYmplY3QuYXNzaWduKHt9LCBjdHgsIHtcbiAgICAgICAgYWxsTnVsbFZhbHVlczogZmFsc2UsXG4gICAgICAgIGltcGxpY2l0S2V5OiAhZXhwbGljaXRLZXkgJiYgKHNpbXBsZUtleXMgfHwgIWFsbE51bGxWYWx1ZXMpLFxuICAgICAgICBpbmRlbnQ6IGluZGVudCArIGluZGVudFN0ZXBcbiAgICB9KTtcbiAgICBsZXQga2V5Q29tbWVudERvbmUgPSBmYWxzZTtcbiAgICBsZXQgY2hvbXBLZWVwID0gZmFsc2U7XG4gICAgbGV0IHN0ciA9IHN0cmluZ2lmeShrZXksIGN0eCwgKCkgPT4gKGtleUNvbW1lbnREb25lID0gdHJ1ZSksICgpID0+IChjaG9tcEtlZXAgPSB0cnVlKSk7XG4gICAgaWYgKCFleHBsaWNpdEtleSAmJiAhY3R4LmluRmxvdyAmJiBzdHIubGVuZ3RoID4gMTAyNCkge1xuICAgICAgICBpZiAoc2ltcGxlS2V5cylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2l0aCBzaW1wbGUga2V5cywgc2luZ2xlIGxpbmUgc2NhbGFyIG11c3Qgbm90IHNwYW4gbW9yZSB0aGFuIDEwMjQgY2hhcmFjdGVycycpO1xuICAgICAgICBleHBsaWNpdEtleSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChjdHguaW5GbG93KSB7XG4gICAgICAgIGlmIChhbGxOdWxsVmFsdWVzIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChrZXlDb21tZW50RG9uZSAmJiBvbkNvbW1lbnQpXG4gICAgICAgICAgICAgICAgb25Db21tZW50KCk7XG4gICAgICAgICAgICByZXR1cm4gc3RyID09PSAnJyA/ICc/JyA6IGV4cGxpY2l0S2V5ID8gYD8gJHtzdHJ9YCA6IHN0cjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICgoYWxsTnVsbFZhbHVlcyAmJiAhc2ltcGxlS2V5cykgfHwgKHZhbHVlID09IG51bGwgJiYgZXhwbGljaXRLZXkpKSB7XG4gICAgICAgIHN0ciA9IGA/ICR7c3RyfWA7XG4gICAgICAgIGlmIChrZXlDb21tZW50ICYmICFrZXlDb21tZW50RG9uZSkge1xuICAgICAgICAgICAgc3RyICs9IGxpbmVDb21tZW50KHN0ciwgY3R4LmluZGVudCwgY29tbWVudFN0cmluZyhrZXlDb21tZW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2hvbXBLZWVwICYmIG9uQ2hvbXBLZWVwKVxuICAgICAgICAgICAgb25DaG9tcEtlZXAoKTtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgaWYgKGtleUNvbW1lbnREb25lKVxuICAgICAgICBrZXlDb21tZW50ID0gbnVsbDtcbiAgICBpZiAoZXhwbGljaXRLZXkpIHtcbiAgICAgICAgaWYgKGtleUNvbW1lbnQpXG4gICAgICAgICAgICBzdHIgKz0gbGluZUNvbW1lbnQoc3RyLCBjdHguaW5kZW50LCBjb21tZW50U3RyaW5nKGtleUNvbW1lbnQpKTtcbiAgICAgICAgc3RyID0gYD8gJHtzdHJ9XFxuJHtpbmRlbnR9OmA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzdHIgPSBgJHtzdHJ9OmA7XG4gICAgICAgIGlmIChrZXlDb21tZW50KVxuICAgICAgICAgICAgc3RyICs9IGxpbmVDb21tZW50KHN0ciwgY3R4LmluZGVudCwgY29tbWVudFN0cmluZyhrZXlDb21tZW50KSk7XG4gICAgfVxuICAgIGxldCB2Y2IgPSAnJztcbiAgICBsZXQgdmFsdWVDb21tZW50ID0gbnVsbDtcbiAgICBpZiAoaXNOb2RlKHZhbHVlKSkge1xuICAgICAgICBpZiAodmFsdWUuc3BhY2VCZWZvcmUpXG4gICAgICAgICAgICB2Y2IgPSAnXFxuJztcbiAgICAgICAgaWYgKHZhbHVlLmNvbW1lbnRCZWZvcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNzID0gY29tbWVudFN0cmluZyh2YWx1ZS5jb21tZW50QmVmb3JlKTtcbiAgICAgICAgICAgIHZjYiArPSBgXFxuJHtpbmRlbnRDb21tZW50KGNzLCBjdHguaW5kZW50KX1gO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlQ29tbWVudCA9IHZhbHVlLmNvbW1lbnQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFsdWUgPSBkb2MuY3JlYXRlTm9kZSh2YWx1ZSk7XG4gICAgfVxuICAgIGN0eC5pbXBsaWNpdEtleSA9IGZhbHNlO1xuICAgIGlmICghZXhwbGljaXRLZXkgJiYgIWtleUNvbW1lbnQgJiYgaXNTY2FsYXIodmFsdWUpKVxuICAgICAgICBjdHguaW5kZW50QXRTdGFydCA9IHN0ci5sZW5ndGggKyAxO1xuICAgIGNob21wS2VlcCA9IGZhbHNlO1xuICAgIGlmICghaW5kZW50U2VxICYmXG4gICAgICAgIGluZGVudFN0ZXAubGVuZ3RoID49IDIgJiZcbiAgICAgICAgIWN0eC5pbkZsb3cgJiZcbiAgICAgICAgIWV4cGxpY2l0S2V5ICYmXG4gICAgICAgIGlzU2VxKHZhbHVlKSAmJlxuICAgICAgICAhdmFsdWUuZmxvdyAmJlxuICAgICAgICAhdmFsdWUudGFnICYmXG4gICAgICAgICF2YWx1ZS5hbmNob3IpIHtcbiAgICAgICAgLy8gSWYgaW5kZW50U2VxID09PSBmYWxzZSwgY29uc2lkZXIgJy0gJyBhcyBwYXJ0IG9mIGluZGVudGF0aW9uIHdoZXJlIHBvc3NpYmxlXG4gICAgICAgIGN0eC5pbmRlbnQgPSBjdHguaW5kZW50LnN1YnN0cigyKTtcbiAgICB9XG4gICAgbGV0IHZhbHVlQ29tbWVudERvbmUgPSBmYWxzZTtcbiAgICBjb25zdCB2YWx1ZVN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgY3R4LCAoKSA9PiAodmFsdWVDb21tZW50RG9uZSA9IHRydWUpLCAoKSA9PiAoY2hvbXBLZWVwID0gdHJ1ZSkpO1xuICAgIGxldCB3cyA9ICcgJztcbiAgICBpZiAodmNiIHx8IGtleUNvbW1lbnQpIHtcbiAgICAgICAgaWYgKHZhbHVlU3RyID09PSAnJyAmJiAhY3R4LmluRmxvdylcbiAgICAgICAgICAgIHdzID0gdmNiID09PSAnXFxuJyA/ICdcXG5cXG4nIDogdmNiO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB3cyA9IGAke3ZjYn1cXG4ke2N0eC5pbmRlbnR9YDtcbiAgICB9XG4gICAgZWxzZSBpZiAoIWV4cGxpY2l0S2V5ICYmIGlzQ29sbGVjdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgZmxvdyA9IHZhbHVlU3RyWzBdID09PSAnWycgfHwgdmFsdWVTdHJbMF0gPT09ICd7JztcbiAgICAgICAgaWYgKCFmbG93IHx8IHZhbHVlU3RyLmluY2x1ZGVzKCdcXG4nKSlcbiAgICAgICAgICAgIHdzID0gYFxcbiR7Y3R4LmluZGVudH1gO1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZVN0ciA9PT0gJycgfHwgdmFsdWVTdHJbMF0gPT09ICdcXG4nKVxuICAgICAgICB3cyA9ICcnO1xuICAgIHN0ciArPSB3cyArIHZhbHVlU3RyO1xuICAgIGlmIChjdHguaW5GbG93KSB7XG4gICAgICAgIGlmICh2YWx1ZUNvbW1lbnREb25lICYmIG9uQ29tbWVudClcbiAgICAgICAgICAgIG9uQ29tbWVudCgpO1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZUNvbW1lbnQgJiYgIXZhbHVlQ29tbWVudERvbmUpIHtcbiAgICAgICAgc3RyICs9IGxpbmVDb21tZW50KHN0ciwgY3R4LmluZGVudCwgY29tbWVudFN0cmluZyh2YWx1ZUNvbW1lbnQpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2hvbXBLZWVwICYmIG9uQ2hvbXBLZWVwKSB7XG4gICAgICAgIG9uQ2hvbXBLZWVwKCk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5cbmV4cG9ydCB7IHN0cmluZ2lmeVBhaXIgfTtcbiIsICJmdW5jdGlvbiBkZWJ1Zyhsb2dMZXZlbCwgLi4ubWVzc2FnZXMpIHtcbiAgICBpZiAobG9nTGV2ZWwgPT09ICdkZWJ1ZycpXG4gICAgICAgIGNvbnNvbGUubG9nKC4uLm1lc3NhZ2VzKTtcbn1cbmZ1bmN0aW9uIHdhcm4obG9nTGV2ZWwsIHdhcm5pbmcpIHtcbiAgICBpZiAobG9nTGV2ZWwgPT09ICdkZWJ1ZycgfHwgbG9nTGV2ZWwgPT09ICd3YXJuJykge1xuICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW1pdFdhcm5pbmcpXG4gICAgICAgICAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKHdhcm5pbmcpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb25zb2xlLndhcm4od2FybmluZyk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBkZWJ1Zywgd2FybiB9O1xuIiwgImltcG9ydCB7IHdhcm4gfSBmcm9tICcuLi9sb2cuanMnO1xuaW1wb3J0IHsgY3JlYXRlU3RyaW5naWZ5Q29udGV4dCB9IGZyb20gJy4uL3N0cmluZ2lmeS9zdHJpbmdpZnkuanMnO1xuaW1wb3J0IHsgaXNBbGlhcywgaXNTZXEsIGlzU2NhbGFyLCBpc01hcCwgaXNOb2RlIH0gZnJvbSAnLi9Ob2RlLmpzJztcbmltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4vU2NhbGFyLmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuL3RvSlMuanMnO1xuXG5jb25zdCBNRVJHRV9LRVkgPSAnPDwnO1xuZnVuY3Rpb24gYWRkUGFpclRvSlNNYXAoY3R4LCBtYXAsIHsga2V5LCB2YWx1ZSB9KSB7XG4gICAgaWYgKGN0eD8uZG9jLnNjaGVtYS5tZXJnZSAmJiBpc01lcmdlS2V5KGtleSkpIHtcbiAgICAgICAgdmFsdWUgPSBpc0FsaWFzKHZhbHVlKSA/IHZhbHVlLnJlc29sdmUoY3R4LmRvYykgOiB2YWx1ZTtcbiAgICAgICAgaWYgKGlzU2VxKHZhbHVlKSlcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXQgb2YgdmFsdWUuaXRlbXMpXG4gICAgICAgICAgICAgICAgbWVyZ2VUb0pTTWFwKGN0eCwgbWFwLCBpdCk7XG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgICAgICAgZm9yIChjb25zdCBpdCBvZiB2YWx1ZSlcbiAgICAgICAgICAgICAgICBtZXJnZVRvSlNNYXAoY3R4LCBtYXAsIGl0KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbWVyZ2VUb0pTTWFwKGN0eCwgbWFwLCB2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBqc0tleSA9IHRvSlMoa2V5LCAnJywgY3R4KTtcbiAgICAgICAgaWYgKG1hcCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgbWFwLnNldChqc0tleSwgdG9KUyh2YWx1ZSwganNLZXksIGN0eCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1hcCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgICAgbWFwLmFkZChqc0tleSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzdHJpbmdLZXkgPSBzdHJpbmdpZnlLZXkoa2V5LCBqc0tleSwgY3R4KTtcbiAgICAgICAgICAgIGNvbnN0IGpzVmFsdWUgPSB0b0pTKHZhbHVlLCBzdHJpbmdLZXksIGN0eCk7XG4gICAgICAgICAgICBpZiAoc3RyaW5nS2V5IGluIG1hcClcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobWFwLCBzdHJpbmdLZXksIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGpzVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBtYXBbc3RyaW5nS2V5XSA9IGpzVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbn1cbmNvbnN0IGlzTWVyZ2VLZXkgPSAoa2V5KSA9PiBrZXkgPT09IE1FUkdFX0tFWSB8fFxuICAgIChpc1NjYWxhcihrZXkpICYmXG4gICAgICAgIGtleS52YWx1ZSA9PT0gTUVSR0VfS0VZICYmXG4gICAgICAgICgha2V5LnR5cGUgfHwga2V5LnR5cGUgPT09IFNjYWxhci5QTEFJTikpO1xuLy8gSWYgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIG1lcmdlIGtleSBpcyBhIHNpbmdsZSBtYXBwaW5nIG5vZGUsIGVhY2ggb2Zcbi8vIGl0cyBrZXkvdmFsdWUgcGFpcnMgaXMgaW5zZXJ0ZWQgaW50byB0aGUgY3VycmVudCBtYXBwaW5nLCB1bmxlc3MgdGhlIGtleVxuLy8gYWxyZWFkeSBleGlzdHMgaW4gaXQuIElmIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lcmdlIGtleSBpcyBhXG4vLyBzZXF1ZW5jZSwgdGhlbiB0aGlzIHNlcXVlbmNlIGlzIGV4cGVjdGVkIHRvIGNvbnRhaW4gbWFwcGluZyBub2RlcyBhbmQgZWFjaFxuLy8gb2YgdGhlc2Ugbm9kZXMgaXMgbWVyZ2VkIGluIHR1cm4gYWNjb3JkaW5nIHRvIGl0cyBvcmRlciBpbiB0aGUgc2VxdWVuY2UuXG4vLyBLZXlzIGluIG1hcHBpbmcgbm9kZXMgZWFybGllciBpbiB0aGUgc2VxdWVuY2Ugb3ZlcnJpZGUga2V5cyBzcGVjaWZpZWQgaW5cbi8vIGxhdGVyIG1hcHBpbmcgbm9kZXMuIC0tIGh0dHA6Ly95YW1sLm9yZy90eXBlL21lcmdlLmh0bWxcbmZ1bmN0aW9uIG1lcmdlVG9KU01hcChjdHgsIG1hcCwgdmFsdWUpIHtcbiAgICBjb25zdCBzb3VyY2UgPSBjdHggJiYgaXNBbGlhcyh2YWx1ZSkgPyB2YWx1ZS5yZXNvbHZlKGN0eC5kb2MpIDogdmFsdWU7XG4gICAgaWYgKCFpc01hcChzb3VyY2UpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lcmdlIHNvdXJjZXMgbXVzdCBiZSBtYXBzIG9yIG1hcCBhbGlhc2VzJyk7XG4gICAgY29uc3Qgc3JjTWFwID0gc291cmNlLnRvSlNPTihudWxsLCBjdHgsIE1hcCk7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc3JjTWFwKSB7XG4gICAgICAgIGlmIChtYXAgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgIGlmICghbWFwLmhhcyhrZXkpKVxuICAgICAgICAgICAgICAgIG1hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWFwIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICBtYXAuYWRkKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtYXAsIGtleSkpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtYXAsIGtleSwge1xuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5S2V5KGtleSwganNLZXksIGN0eCkge1xuICAgIGlmIChqc0tleSA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIGlmICh0eXBlb2YganNLZXkgIT09ICdvYmplY3QnKVxuICAgICAgICByZXR1cm4gU3RyaW5nKGpzS2V5KTtcbiAgICBpZiAoaXNOb2RlKGtleSkgJiYgY3R4ICYmIGN0eC5kb2MpIHtcbiAgICAgICAgY29uc3Qgc3RyQ3R4ID0gY3JlYXRlU3RyaW5naWZ5Q29udGV4dChjdHguZG9jLCB7fSk7XG4gICAgICAgIHN0ckN0eC5hbmNob3JzID0gbmV3IFNldCgpO1xuICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgY3R4LmFuY2hvcnMua2V5cygpKVxuICAgICAgICAgICAgc3RyQ3R4LmFuY2hvcnMuYWRkKG5vZGUuYW5jaG9yKTtcbiAgICAgICAgc3RyQ3R4LmluRmxvdyA9IHRydWU7XG4gICAgICAgIHN0ckN0eC5pblN0cmluZ2lmeUtleSA9IHRydWU7XG4gICAgICAgIGNvbnN0IHN0cktleSA9IGtleS50b1N0cmluZyhzdHJDdHgpO1xuICAgICAgICBpZiAoIWN0eC5tYXBLZXlXYXJuZWQpIHtcbiAgICAgICAgICAgIGxldCBqc29uU3RyID0gSlNPTi5zdHJpbmdpZnkoc3RyS2V5KTtcbiAgICAgICAgICAgIGlmIChqc29uU3RyLmxlbmd0aCA+IDQwKVxuICAgICAgICAgICAgICAgIGpzb25TdHIgPSBqc29uU3RyLnN1YnN0cmluZygwLCAzNikgKyAnLi4uXCInO1xuICAgICAgICAgICAgd2FybihjdHguZG9jLm9wdGlvbnMubG9nTGV2ZWwsIGBLZXlzIHdpdGggY29sbGVjdGlvbiB2YWx1ZXMgd2lsbCBiZSBzdHJpbmdpZmllZCBkdWUgdG8gSlMgT2JqZWN0IHJlc3RyaWN0aW9uczogJHtqc29uU3RyfS4gU2V0IG1hcEFzTWFwOiB0cnVlIHRvIHVzZSBvYmplY3Qga2V5cy5gKTtcbiAgICAgICAgICAgIGN0eC5tYXBLZXlXYXJuZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJLZXk7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShqc0tleSk7XG59XG5cbmV4cG9ydCB7IGFkZFBhaXJUb0pTTWFwIH07XG4iLCAiaW1wb3J0IHsgY3JlYXRlTm9kZSB9IGZyb20gJy4uL2RvYy9jcmVhdGVOb2RlLmpzJztcbmltcG9ydCB7IHN0cmluZ2lmeVBhaXIgfSBmcm9tICcuLi9zdHJpbmdpZnkvc3RyaW5naWZ5UGFpci5qcyc7XG5pbXBvcnQgeyBhZGRQYWlyVG9KU01hcCB9IGZyb20gJy4vYWRkUGFpclRvSlNNYXAuanMnO1xuaW1wb3J0IHsgTk9ERV9UWVBFLCBQQUlSLCBpc05vZGUgfSBmcm9tICcuL05vZGUuanMnO1xuXG5mdW5jdGlvbiBjcmVhdGVQYWlyKGtleSwgdmFsdWUsIGN0eCkge1xuICAgIGNvbnN0IGsgPSBjcmVhdGVOb2RlKGtleSwgdW5kZWZpbmVkLCBjdHgpO1xuICAgIGNvbnN0IHYgPSBjcmVhdGVOb2RlKHZhbHVlLCB1bmRlZmluZWQsIGN0eCk7XG4gICAgcmV0dXJuIG5ldyBQYWlyKGssIHYpO1xufVxuY2xhc3MgUGFpciB7XG4gICAgY29uc3RydWN0b3Ioa2V5LCB2YWx1ZSA9IG51bGwpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIE5PREVfVFlQRSwgeyB2YWx1ZTogUEFJUiB9KTtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgY2xvbmUoc2NoZW1hKSB7XG4gICAgICAgIGxldCB7IGtleSwgdmFsdWUgfSA9IHRoaXM7XG4gICAgICAgIGlmIChpc05vZGUoa2V5KSlcbiAgICAgICAgICAgIGtleSA9IGtleS5jbG9uZShzY2hlbWEpO1xuICAgICAgICBpZiAoaXNOb2RlKHZhbHVlKSlcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuY2xvbmUoc2NoZW1hKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWlyKGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICB0b0pTT04oXywgY3R4KSB7XG4gICAgICAgIGNvbnN0IHBhaXIgPSBjdHg/Lm1hcEFzTWFwID8gbmV3IE1hcCgpIDoge307XG4gICAgICAgIHJldHVybiBhZGRQYWlyVG9KU01hcChjdHgsIHBhaXIsIHRoaXMpO1xuICAgIH1cbiAgICB0b1N0cmluZyhjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICAgICAgcmV0dXJuIGN0eD8uZG9jXG4gICAgICAgICAgICA/IHN0cmluZ2lmeVBhaXIodGhpcywgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKVxuICAgICAgICAgICAgOiBKU09OLnN0cmluZ2lmeSh0aGlzKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFBhaXIsIGNyZWF0ZVBhaXIgfTtcbiIsICJpbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnLi4vbm9kZXMvQ29sbGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBpc05vZGUsIGlzUGFpciB9IGZyb20gJy4uL25vZGVzL05vZGUuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5IH0gZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuaW1wb3J0IHsgbGluZUNvbW1lbnQsIGluZGVudENvbW1lbnQgfSBmcm9tICcuL3N0cmluZ2lmeUNvbW1lbnQuanMnO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnlDb2xsZWN0aW9uKGNvbGxlY3Rpb24sIGN0eCwgb3B0aW9ucykge1xuICAgIGNvbnN0IGZsb3cgPSBjdHguaW5GbG93ID8/IGNvbGxlY3Rpb24uZmxvdztcbiAgICBjb25zdCBzdHJpbmdpZnkgPSBmbG93ID8gc3RyaW5naWZ5Rmxvd0NvbGxlY3Rpb24gOiBzdHJpbmdpZnlCbG9ja0NvbGxlY3Rpb247XG4gICAgcmV0dXJuIHN0cmluZ2lmeShjb2xsZWN0aW9uLCBjdHgsIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5QmxvY2tDb2xsZWN0aW9uKHsgY29tbWVudCwgaXRlbXMgfSwgY3R4LCB7IGJsb2NrSXRlbVByZWZpeCwgZmxvd0NoYXJzLCBpdGVtSW5kZW50LCBvbkNob21wS2VlcCwgb25Db21tZW50IH0pIHtcbiAgICBjb25zdCB7IGluZGVudCwgb3B0aW9uczogeyBjb21tZW50U3RyaW5nIH0gfSA9IGN0eDtcbiAgICBjb25zdCBpdGVtQ3R4ID0gT2JqZWN0LmFzc2lnbih7fSwgY3R4LCB7IGluZGVudDogaXRlbUluZGVudCwgdHlwZTogbnVsbCB9KTtcbiAgICBsZXQgY2hvbXBLZWVwID0gZmFsc2U7IC8vIGZsYWcgZm9yIHRoZSBwcmVjZWRpbmcgbm9kZSdzIHN0YXR1c1xuICAgIGNvbnN0IGxpbmVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaV07XG4gICAgICAgIGxldCBjb21tZW50ID0gbnVsbDtcbiAgICAgICAgaWYgKGlzTm9kZShpdGVtKSkge1xuICAgICAgICAgICAgaWYgKCFjaG9tcEtlZXAgJiYgaXRlbS5zcGFjZUJlZm9yZSlcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgICAgICAgIGFkZENvbW1lbnRCZWZvcmUoY3R4LCBsaW5lcywgaXRlbS5jb21tZW50QmVmb3JlLCBjaG9tcEtlZXApO1xuICAgICAgICAgICAgaWYgKGl0ZW0uY29tbWVudClcbiAgICAgICAgICAgICAgICBjb21tZW50ID0gaXRlbS5jb21tZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUGFpcihpdGVtKSkge1xuICAgICAgICAgICAgY29uc3QgaWsgPSBpc05vZGUoaXRlbS5rZXkpID8gaXRlbS5rZXkgOiBudWxsO1xuICAgICAgICAgICAgaWYgKGlrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjaG9tcEtlZXAgJiYgaWsuc3BhY2VCZWZvcmUpXG4gICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgICAgICAgICAgIGFkZENvbW1lbnRCZWZvcmUoY3R4LCBsaW5lcywgaWsuY29tbWVudEJlZm9yZSwgY2hvbXBLZWVwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjaG9tcEtlZXAgPSBmYWxzZTtcbiAgICAgICAgbGV0IHN0ciA9IHN0cmluZ2lmeShpdGVtLCBpdGVtQ3R4LCAoKSA9PiAoY29tbWVudCA9IG51bGwpLCAoKSA9PiAoY2hvbXBLZWVwID0gdHJ1ZSkpO1xuICAgICAgICBpZiAoY29tbWVudClcbiAgICAgICAgICAgIHN0ciArPSBsaW5lQ29tbWVudChzdHIsIGl0ZW1JbmRlbnQsIGNvbW1lbnRTdHJpbmcoY29tbWVudCkpO1xuICAgICAgICBpZiAoY2hvbXBLZWVwICYmIGNvbW1lbnQpXG4gICAgICAgICAgICBjaG9tcEtlZXAgPSBmYWxzZTtcbiAgICAgICAgbGluZXMucHVzaChibG9ja0l0ZW1QcmVmaXggKyBzdHIpO1xuICAgIH1cbiAgICBsZXQgc3RyO1xuICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc3RyID0gZmxvd0NoYXJzLnN0YXJ0ICsgZmxvd0NoYXJzLmVuZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHN0ciA9IGxpbmVzWzBdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbaV07XG4gICAgICAgICAgICBzdHIgKz0gbGluZSA/IGBcXG4ke2luZGVudH0ke2xpbmV9YCA6ICdcXG4nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb21tZW50KSB7XG4gICAgICAgIHN0ciArPSAnXFxuJyArIGluZGVudENvbW1lbnQoY29tbWVudFN0cmluZyhjb21tZW50KSwgaW5kZW50KTtcbiAgICAgICAgaWYgKG9uQ29tbWVudClcbiAgICAgICAgICAgIG9uQ29tbWVudCgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChjaG9tcEtlZXAgJiYgb25DaG9tcEtlZXApXG4gICAgICAgIG9uQ2hvbXBLZWVwKCk7XG4gICAgcmV0dXJuIHN0cjtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeUZsb3dDb2xsZWN0aW9uKHsgY29tbWVudCwgaXRlbXMgfSwgY3R4LCB7IGZsb3dDaGFycywgaXRlbUluZGVudCwgb25Db21tZW50IH0pIHtcbiAgICBjb25zdCB7IGluZGVudCwgaW5kZW50U3RlcCwgb3B0aW9uczogeyBjb21tZW50U3RyaW5nIH0gfSA9IGN0eDtcbiAgICBpdGVtSW5kZW50ICs9IGluZGVudFN0ZXA7XG4gICAgY29uc3QgaXRlbUN0eCA9IE9iamVjdC5hc3NpZ24oe30sIGN0eCwge1xuICAgICAgICBpbmRlbnQ6IGl0ZW1JbmRlbnQsXG4gICAgICAgIGluRmxvdzogdHJ1ZSxcbiAgICAgICAgdHlwZTogbnVsbFxuICAgIH0pO1xuICAgIGxldCByZXFOZXdsaW5lID0gZmFsc2U7XG4gICAgbGV0IGxpbmVzQXRWYWx1ZSA9IDA7XG4gICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgbGV0IGNvbW1lbnQgPSBudWxsO1xuICAgICAgICBpZiAoaXNOb2RlKGl0ZW0pKSB7XG4gICAgICAgICAgICBpZiAoaXRlbS5zcGFjZUJlZm9yZSlcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgICAgICAgIGFkZENvbW1lbnRCZWZvcmUoY3R4LCBsaW5lcywgaXRlbS5jb21tZW50QmVmb3JlLCBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoaXRlbS5jb21tZW50KVxuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBpdGVtLmNvbW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQYWlyKGl0ZW0pKSB7XG4gICAgICAgICAgICBjb25zdCBpayA9IGlzTm9kZShpdGVtLmtleSkgPyBpdGVtLmtleSA6IG51bGw7XG4gICAgICAgICAgICBpZiAoaWspIHtcbiAgICAgICAgICAgICAgICBpZiAoaWsuc3BhY2VCZWZvcmUpXG4gICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgICAgICAgICAgIGFkZENvbW1lbnRCZWZvcmUoY3R4LCBsaW5lcywgaWsuY29tbWVudEJlZm9yZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChpay5jb21tZW50KVxuICAgICAgICAgICAgICAgICAgICByZXFOZXdsaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGl2ID0gaXNOb2RlKGl0ZW0udmFsdWUpID8gaXRlbS52YWx1ZSA6IG51bGw7XG4gICAgICAgICAgICBpZiAoaXYpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXYuY29tbWVudClcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IGl2LmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGl2LmNvbW1lbnRCZWZvcmUpXG4gICAgICAgICAgICAgICAgICAgIHJlcU5ld2xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXRlbS52YWx1ZSA9PSBudWxsICYmIGlrICYmIGlrLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb21tZW50ID0gaWsuY29tbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbWVudClcbiAgICAgICAgICAgIHJlcU5ld2xpbmUgPSB0cnVlO1xuICAgICAgICBsZXQgc3RyID0gc3RyaW5naWZ5KGl0ZW0sIGl0ZW1DdHgsICgpID0+IChjb21tZW50ID0gbnVsbCkpO1xuICAgICAgICBpZiAoaSA8IGl0ZW1zLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICBzdHIgKz0gJywnO1xuICAgICAgICBpZiAoY29tbWVudClcbiAgICAgICAgICAgIHN0ciArPSBsaW5lQ29tbWVudChzdHIsIGl0ZW1JbmRlbnQsIGNvbW1lbnRTdHJpbmcoY29tbWVudCkpO1xuICAgICAgICBpZiAoIXJlcU5ld2xpbmUgJiYgKGxpbmVzLmxlbmd0aCA+IGxpbmVzQXRWYWx1ZSB8fCBzdHIuaW5jbHVkZXMoJ1xcbicpKSlcbiAgICAgICAgICAgIHJlcU5ld2xpbmUgPSB0cnVlO1xuICAgICAgICBsaW5lcy5wdXNoKHN0cik7XG4gICAgICAgIGxpbmVzQXRWYWx1ZSA9IGxpbmVzLmxlbmd0aDtcbiAgICB9XG4gICAgbGV0IHN0cjtcbiAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IGZsb3dDaGFycztcbiAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0YXJ0ICsgZW5kO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKCFyZXFOZXdsaW5lKSB7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBsaW5lcy5yZWR1Y2UoKHN1bSwgbGluZSkgPT4gc3VtICsgbGluZS5sZW5ndGggKyAyLCAyKTtcbiAgICAgICAgICAgIHJlcU5ld2xpbmUgPSBsZW4gPiBDb2xsZWN0aW9uLm1heEZsb3dTdHJpbmdTaW5nbGVMaW5lTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXFOZXdsaW5lKSB7XG4gICAgICAgICAgICBzdHIgPSBzdGFydDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcylcbiAgICAgICAgICAgICAgICBzdHIgKz0gbGluZSA/IGBcXG4ke2luZGVudFN0ZXB9JHtpbmRlbnR9JHtsaW5lfWAgOiAnXFxuJztcbiAgICAgICAgICAgIHN0ciArPSBgXFxuJHtpbmRlbnR9JHtlbmR9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0ciA9IGAke3N0YXJ0fSAke2xpbmVzLmpvaW4oJyAnKX0gJHtlbmR9YDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29tbWVudCkge1xuICAgICAgICBzdHIgKz0gbGluZUNvbW1lbnQoc3RyLCBjb21tZW50U3RyaW5nKGNvbW1lbnQpLCBpbmRlbnQpO1xuICAgICAgICBpZiAob25Db21tZW50KVxuICAgICAgICAgICAgb25Db21tZW50KCk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5mdW5jdGlvbiBhZGRDb21tZW50QmVmb3JlKHsgaW5kZW50LCBvcHRpb25zOiB7IGNvbW1lbnRTdHJpbmcgfSB9LCBsaW5lcywgY29tbWVudCwgY2hvbXBLZWVwKSB7XG4gICAgaWYgKGNvbW1lbnQgJiYgY2hvbXBLZWVwKVxuICAgICAgICBjb21tZW50ID0gY29tbWVudC5yZXBsYWNlKC9eXFxuKy8sICcnKTtcbiAgICBpZiAoY29tbWVudCkge1xuICAgICAgICBjb25zdCBpYyA9IGluZGVudENvbW1lbnQoY29tbWVudFN0cmluZyhjb21tZW50KSwgaW5kZW50KTtcbiAgICAgICAgbGluZXMucHVzaChpYy50cmltU3RhcnQoKSk7IC8vIEF2b2lkIGRvdWJsZSBpbmRlbnQgb24gZmlyc3QgbGluZVxuICAgIH1cbn1cblxuZXhwb3J0IHsgc3RyaW5naWZ5Q29sbGVjdGlvbiB9O1xuIiwgImltcG9ydCB7IHN0cmluZ2lmeUNvbGxlY3Rpb24gfSBmcm9tICcuLi9zdHJpbmdpZnkvc3RyaW5naWZ5Q29sbGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBhZGRQYWlyVG9KU01hcCB9IGZyb20gJy4vYWRkUGFpclRvSlNNYXAuanMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJy4vQ29sbGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBpc1BhaXIsIGlzU2NhbGFyLCBNQVAgfSBmcm9tICcuL05vZGUuanMnO1xuaW1wb3J0IHsgUGFpciB9IGZyb20gJy4vUGFpci5qcyc7XG5pbXBvcnQgeyBpc1NjYWxhclZhbHVlIH0gZnJvbSAnLi9TY2FsYXIuanMnO1xuXG5mdW5jdGlvbiBmaW5kUGFpcihpdGVtcywga2V5KSB7XG4gICAgY29uc3QgayA9IGlzU2NhbGFyKGtleSkgPyBrZXkudmFsdWUgOiBrZXk7XG4gICAgZm9yIChjb25zdCBpdCBvZiBpdGVtcykge1xuICAgICAgICBpZiAoaXNQYWlyKGl0KSkge1xuICAgICAgICAgICAgaWYgKGl0LmtleSA9PT0ga2V5IHx8IGl0LmtleSA9PT0gaylcbiAgICAgICAgICAgICAgICByZXR1cm4gaXQ7XG4gICAgICAgICAgICBpZiAoaXNTY2FsYXIoaXQua2V5KSAmJiBpdC5rZXkudmFsdWUgPT09IGspXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5jbGFzcyBZQU1MTWFwIGV4dGVuZHMgQ29sbGVjdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioc2NoZW1hKSB7XG4gICAgICAgIHN1cGVyKE1BUCwgc2NoZW1hKTtcbiAgICAgICAgdGhpcy5pdGVtcyA9IFtdO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IHRhZ05hbWUoKSB7XG4gICAgICAgIHJldHVybiAndGFnOnlhbWwub3JnLDIwMDI6bWFwJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHZhbHVlIHRvIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIG92ZXJ3cml0ZSAtIElmIG5vdCBzZXQgYHRydWVgLCB1c2luZyBhIGtleSB0aGF0IGlzIGFscmVhZHkgaW4gdGhlXG4gICAgICogICBjb2xsZWN0aW9uIHdpbGwgdGhyb3cuIE90aGVyd2lzZSwgb3ZlcndyaXRlcyB0aGUgcHJldmlvdXMgdmFsdWUuXG4gICAgICovXG4gICAgYWRkKHBhaXIsIG92ZXJ3cml0ZSkge1xuICAgICAgICBsZXQgX3BhaXI7XG4gICAgICAgIGlmIChpc1BhaXIocGFpcikpXG4gICAgICAgICAgICBfcGFpciA9IHBhaXI7XG4gICAgICAgIGVsc2UgaWYgKCFwYWlyIHx8IHR5cGVvZiBwYWlyICE9PSAnb2JqZWN0JyB8fCAhKCdrZXknIGluIHBhaXIpKSB7XG4gICAgICAgICAgICAvLyBJbiBUeXBlU2NyaXB0LCB0aGlzIG5ldmVyIGhhcHBlbnMuXG4gICAgICAgICAgICBfcGFpciA9IG5ldyBQYWlyKHBhaXIsIHBhaXI/LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBfcGFpciA9IG5ldyBQYWlyKHBhaXIua2V5LCBwYWlyLnZhbHVlKTtcbiAgICAgICAgY29uc3QgcHJldiA9IGZpbmRQYWlyKHRoaXMuaXRlbXMsIF9wYWlyLmtleSk7XG4gICAgICAgIGNvbnN0IHNvcnRFbnRyaWVzID0gdGhpcy5zY2hlbWE/LnNvcnRNYXBFbnRyaWVzO1xuICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgICAgaWYgKCFvdmVyd3JpdGUpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBLZXkgJHtfcGFpci5rZXl9IGFscmVhZHkgc2V0YCk7XG4gICAgICAgICAgICAvLyBGb3Igc2NhbGFycywga2VlcCB0aGUgb2xkIG5vZGUgJiBpdHMgY29tbWVudHMgYW5kIGFuY2hvcnNcbiAgICAgICAgICAgIGlmIChpc1NjYWxhcihwcmV2LnZhbHVlKSAmJiBpc1NjYWxhclZhbHVlKF9wYWlyLnZhbHVlKSlcbiAgICAgICAgICAgICAgICBwcmV2LnZhbHVlLnZhbHVlID0gX3BhaXIudmFsdWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcHJldi52YWx1ZSA9IF9wYWlyLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNvcnRFbnRyaWVzKSB7XG4gICAgICAgICAgICBjb25zdCBpID0gdGhpcy5pdGVtcy5maW5kSW5kZXgoaXRlbSA9PiBzb3J0RW50cmllcyhfcGFpciwgaXRlbSkgPCAwKTtcbiAgICAgICAgICAgIGlmIChpID09PSAtMSlcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLnB1c2goX3BhaXIpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMuc3BsaWNlKGksIDAsIF9wYWlyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbXMucHVzaChfcGFpcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICBjb25zdCBpdCA9IGZpbmRQYWlyKHRoaXMuaXRlbXMsIGtleSk7XG4gICAgICAgIGlmICghaXQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGRlbCA9IHRoaXMuaXRlbXMuc3BsaWNlKHRoaXMuaXRlbXMuaW5kZXhPZihpdCksIDEpO1xuICAgICAgICByZXR1cm4gZGVsLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIGdldChrZXksIGtlZXBTY2FsYXIpIHtcbiAgICAgICAgY29uc3QgaXQgPSBmaW5kUGFpcih0aGlzLml0ZW1zLCBrZXkpO1xuICAgICAgICBjb25zdCBub2RlID0gaXQ/LnZhbHVlO1xuICAgICAgICByZXR1cm4gKCFrZWVwU2NhbGFyICYmIGlzU2NhbGFyKG5vZGUpID8gbm9kZS52YWx1ZSA6IG5vZGUpID8/IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gISFmaW5kUGFpcih0aGlzLml0ZW1zLCBrZXkpO1xuICAgIH1cbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmFkZChuZXcgUGFpcihrZXksIHZhbHVlKSwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBjdHggLSBDb252ZXJzaW9uIGNvbnRleHQsIG9yaWdpbmFsbHkgc2V0IGluIERvY3VtZW50I3RvSlMoKVxuICAgICAqIEBwYXJhbSB7Q2xhc3N9IFR5cGUgLSBJZiBzZXQsIGZvcmNlcyB0aGUgcmV0dXJuZWQgY29sbGVjdGlvbiB0eXBlXG4gICAgICogQHJldHVybnMgSW5zdGFuY2Ugb2YgVHlwZSwgTWFwLCBvciBPYmplY3RcbiAgICAgKi9cbiAgICB0b0pTT04oXywgY3R4LCBUeXBlKSB7XG4gICAgICAgIGNvbnN0IG1hcCA9IFR5cGUgPyBuZXcgVHlwZSgpIDogY3R4Py5tYXBBc01hcCA/IG5ldyBNYXAoKSA6IHt9O1xuICAgICAgICBpZiAoY3R4Py5vbkNyZWF0ZSlcbiAgICAgICAgICAgIGN0eC5vbkNyZWF0ZShtYXApO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5pdGVtcylcbiAgICAgICAgICAgIGFkZFBhaXJUb0pTTWFwKGN0eCwgbWFwLCBpdGVtKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG4gICAgdG9TdHJpbmcoY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgICAgIGlmICghY3R4KVxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5pdGVtcykge1xuICAgICAgICAgICAgaWYgKCFpc1BhaXIoaXRlbSkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNYXAgaXRlbXMgbXVzdCBhbGwgYmUgcGFpcnM7IGZvdW5kICR7SlNPTi5zdHJpbmdpZnkoaXRlbSl9IGluc3RlYWRgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWN0eC5hbGxOdWxsVmFsdWVzICYmIHRoaXMuaGFzQWxsTnVsbFZhbHVlcyhmYWxzZSkpXG4gICAgICAgICAgICBjdHggPSBPYmplY3QuYXNzaWduKHt9LCBjdHgsIHsgYWxsTnVsbFZhbHVlczogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeUNvbGxlY3Rpb24odGhpcywgY3R4LCB7XG4gICAgICAgICAgICBibG9ja0l0ZW1QcmVmaXg6ICcnLFxuICAgICAgICAgICAgZmxvd0NoYXJzOiB7IHN0YXJ0OiAneycsIGVuZDogJ30nIH0sXG4gICAgICAgICAgICBpdGVtSW5kZW50OiBjdHguaW5kZW50IHx8ICcnLFxuICAgICAgICAgICAgb25DaG9tcEtlZXAsXG4gICAgICAgICAgICBvbkNvbW1lbnRcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBZQU1MTWFwLCBmaW5kUGFpciB9O1xuIiwgImltcG9ydCB7IGlzTWFwIH0gZnJvbSAnLi4vLi4vbm9kZXMvTm9kZS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVQYWlyIH0gZnJvbSAnLi4vLi4vbm9kZXMvUGFpci5qcyc7XG5pbXBvcnQgeyBZQU1MTWFwIH0gZnJvbSAnLi4vLi4vbm9kZXMvWUFNTE1hcC5qcyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZU1hcChzY2hlbWEsIG9iaiwgY3R4KSB7XG4gICAgY29uc3QgeyBrZWVwVW5kZWZpbmVkLCByZXBsYWNlciB9ID0gY3R4O1xuICAgIGNvbnN0IG1hcCA9IG5ldyBZQU1MTWFwKHNjaGVtYSk7XG4gICAgY29uc3QgYWRkID0gKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIHZhbHVlID0gcmVwbGFjZXIuY2FsbChvYmosIGtleSwgdmFsdWUpO1xuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlcGxhY2VyKSAmJiAhcmVwbGFjZXIuaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgfHwga2VlcFVuZGVmaW5lZClcbiAgICAgICAgICAgIG1hcC5pdGVtcy5wdXNoKGNyZWF0ZVBhaXIoa2V5LCB2YWx1ZSwgY3R4KSk7XG4gICAgfTtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG9iailcbiAgICAgICAgICAgIGFkZChrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iaikpXG4gICAgICAgICAgICBhZGQoa2V5LCBvYmpba2V5XSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc2NoZW1hLnNvcnRNYXBFbnRyaWVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG1hcC5pdGVtcy5zb3J0KHNjaGVtYS5zb3J0TWFwRW50cmllcyk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG59XG5jb25zdCBtYXAgPSB7XG4gICAgY29sbGVjdGlvbjogJ21hcCcsXG4gICAgY3JlYXRlTm9kZTogY3JlYXRlTWFwLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgbm9kZUNsYXNzOiBZQU1MTWFwLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOm1hcCcsXG4gICAgcmVzb2x2ZShtYXAsIG9uRXJyb3IpIHtcbiAgICAgICAgaWYgKCFpc01hcChtYXApKVxuICAgICAgICAgICAgb25FcnJvcignRXhwZWN0ZWQgYSBtYXBwaW5nIGZvciB0aGlzIHRhZycpO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cbn07XG5cbmV4cG9ydCB7IG1hcCB9O1xuIiwgImltcG9ydCB7IHN0cmluZ2lmeUNvbGxlY3Rpb24gfSBmcm9tICcuLi9zdHJpbmdpZnkvc3RyaW5naWZ5Q29sbGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnLi9Db2xsZWN0aW9uLmpzJztcbmltcG9ydCB7IFNFUSwgaXNTY2FsYXIgfSBmcm9tICcuL05vZGUuanMnO1xuaW1wb3J0IHsgaXNTY2FsYXJWYWx1ZSB9IGZyb20gJy4vU2NhbGFyLmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuL3RvSlMuanMnO1xuXG5jbGFzcyBZQU1MU2VxIGV4dGVuZHMgQ29sbGVjdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioc2NoZW1hKSB7XG4gICAgICAgIHN1cGVyKFNFUSwgc2NoZW1hKTtcbiAgICAgICAgdGhpcy5pdGVtcyA9IFtdO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IHRhZ05hbWUoKSB7XG4gICAgICAgIHJldHVybiAndGFnOnlhbWwub3JnLDIwMDI6c2VxJztcbiAgICB9XG4gICAgYWRkKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuaXRlbXMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSB2YWx1ZSBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogYGtleWAgbXVzdCBjb250YWluIGEgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlciBmb3IgdGhpcyB0byBzdWNjZWVkLlxuICAgICAqIEl0IG1heSBiZSB3cmFwcGVkIGluIGEgYFNjYWxhcmAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGl0ZW0gd2FzIGZvdW5kIGFuZCByZW1vdmVkLlxuICAgICAqL1xuICAgIGRlbGV0ZShrZXkpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gYXNJdGVtSW5kZXgoa2V5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpZHggIT09ICdudW1iZXInKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBkZWwgPSB0aGlzLml0ZW1zLnNwbGljZShpZHgsIDEpO1xuICAgICAgICByZXR1cm4gZGVsLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIGdldChrZXksIGtlZXBTY2FsYXIpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gYXNJdGVtSW5kZXgoa2V5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpZHggIT09ICdudW1iZXInKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgaXQgPSB0aGlzLml0ZW1zW2lkeF07XG4gICAgICAgIHJldHVybiAha2VlcFNjYWxhciAmJiBpc1NjYWxhcihpdCkgPyBpdC52YWx1ZSA6IGl0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGNvbGxlY3Rpb24gaW5jbHVkZXMgYSB2YWx1ZSB3aXRoIHRoZSBrZXkgYGtleWAuXG4gICAgICpcbiAgICAgKiBga2V5YCBtdXN0IGNvbnRhaW4gYSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyIGZvciB0aGlzIHRvIHN1Y2NlZWQuXG4gICAgICogSXQgbWF5IGJlIHdyYXBwZWQgaW4gYSBgU2NhbGFyYC5cbiAgICAgKi9cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IGFzSXRlbUluZGV4KGtleSk7XG4gICAgICAgIHJldHVybiB0eXBlb2YgaWR4ID09PSAnbnVtYmVyJyAmJiBpZHggPCB0aGlzLml0ZW1zLmxlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIGluIHRoaXMgY29sbGVjdGlvbi4gRm9yIGAhIXNldGAsIGB2YWx1ZWAgbmVlZHMgdG8gYmUgYVxuICAgICAqIGJvb2xlYW4gdG8gYWRkL3JlbW92ZSB0aGUgaXRlbSBmcm9tIHRoZSBzZXQuXG4gICAgICpcbiAgICAgKiBJZiBga2V5YCBkb2VzIG5vdCBjb250YWluIGEgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlciwgdGhpcyB3aWxsIHRocm93LlxuICAgICAqIEl0IG1heSBiZSB3cmFwcGVkIGluIGEgYFNjYWxhcmAuXG4gICAgICovXG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gYXNJdGVtSW5kZXgoa2V5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpZHggIT09ICdudW1iZXInKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHZhbGlkIGluZGV4LCBub3QgJHtrZXl9LmApO1xuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy5pdGVtc1tpZHhdO1xuICAgICAgICBpZiAoaXNTY2FsYXIocHJldikgJiYgaXNTY2FsYXJWYWx1ZSh2YWx1ZSkpXG4gICAgICAgICAgICBwcmV2LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuaXRlbXNbaWR4XSA9IHZhbHVlO1xuICAgIH1cbiAgICB0b0pTT04oXywgY3R4KSB7XG4gICAgICAgIGNvbnN0IHNlcSA9IFtdO1xuICAgICAgICBpZiAoY3R4Py5vbkNyZWF0ZSlcbiAgICAgICAgICAgIGN0eC5vbkNyZWF0ZShzZXEpO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKVxuICAgICAgICAgICAgc2VxLnB1c2godG9KUyhpdGVtLCBTdHJpbmcoaSsrKSwgY3R4KSk7XG4gICAgICAgIHJldHVybiBzZXE7XG4gICAgfVxuICAgIHRvU3RyaW5nKGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgICBpZiAoIWN0eClcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeUNvbGxlY3Rpb24odGhpcywgY3R4LCB7XG4gICAgICAgICAgICBibG9ja0l0ZW1QcmVmaXg6ICctICcsXG4gICAgICAgICAgICBmbG93Q2hhcnM6IHsgc3RhcnQ6ICdbJywgZW5kOiAnXScgfSxcbiAgICAgICAgICAgIGl0ZW1JbmRlbnQ6IChjdHguaW5kZW50IHx8ICcnKSArICcgICcsXG4gICAgICAgICAgICBvbkNob21wS2VlcCxcbiAgICAgICAgICAgIG9uQ29tbWVudFxuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBhc0l0ZW1JbmRleChrZXkpIHtcbiAgICBsZXQgaWR4ID0gaXNTY2FsYXIoa2V5KSA/IGtleS52YWx1ZSA6IGtleTtcbiAgICBpZiAoaWR4ICYmIHR5cGVvZiBpZHggPT09ICdzdHJpbmcnKVxuICAgICAgICBpZHggPSBOdW1iZXIoaWR4KTtcbiAgICByZXR1cm4gdHlwZW9mIGlkeCA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzSW50ZWdlcihpZHgpICYmIGlkeCA+PSAwXG4gICAgICAgID8gaWR4XG4gICAgICAgIDogbnVsbDtcbn1cblxuZXhwb3J0IHsgWUFNTFNlcSB9O1xuIiwgImltcG9ydCB7IGNyZWF0ZU5vZGUgfSBmcm9tICcuLi8uLi9kb2MvY3JlYXRlTm9kZS5qcyc7XG5pbXBvcnQgeyBpc1NlcSB9IGZyb20gJy4uLy4uL25vZGVzL05vZGUuanMnO1xuaW1wb3J0IHsgWUFNTFNlcSB9IGZyb20gJy4uLy4uL25vZGVzL1lBTUxTZXEuanMnO1xuXG5mdW5jdGlvbiBjcmVhdGVTZXEoc2NoZW1hLCBvYmosIGN0eCkge1xuICAgIGNvbnN0IHsgcmVwbGFjZXIgfSA9IGN0eDtcbiAgICBjb25zdCBzZXEgPSBuZXcgWUFNTFNlcShzY2hlbWEpO1xuICAgIGlmIChvYmogJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChvYmopKSB7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgZm9yIChsZXQgaXQgb2Ygb2JqKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlcGxhY2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gb2JqIGluc3RhbmNlb2YgU2V0ID8gaXQgOiBTdHJpbmcoaSsrKTtcbiAgICAgICAgICAgICAgICBpdCA9IHJlcGxhY2VyLmNhbGwob2JqLCBrZXksIGl0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlcS5pdGVtcy5wdXNoKGNyZWF0ZU5vZGUoaXQsIHVuZGVmaW5lZCwgY3R4KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlcTtcbn1cbmNvbnN0IHNlcSA9IHtcbiAgICBjb2xsZWN0aW9uOiAnc2VxJyxcbiAgICBjcmVhdGVOb2RlOiBjcmVhdGVTZXEsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICBub2RlQ2xhc3M6IFlBTUxTZXEsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6c2VxJyxcbiAgICByZXNvbHZlKHNlcSwgb25FcnJvcikge1xuICAgICAgICBpZiAoIWlzU2VxKHNlcSkpXG4gICAgICAgICAgICBvbkVycm9yKCdFeHBlY3RlZCBhIHNlcXVlbmNlIGZvciB0aGlzIHRhZycpO1xuICAgICAgICByZXR1cm4gc2VxO1xuICAgIH1cbn07XG5cbmV4cG9ydCB7IHNlcSB9O1xuIiwgImltcG9ydCB7IHN0cmluZ2lmeVN0cmluZyB9IGZyb20gJy4uLy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlTdHJpbmcuanMnO1xuXG5jb25zdCBzdHJpbmcgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpzdHInLFxuICAgIHJlc29sdmU6IHN0ciA9PiBzdHIsXG4gICAgc3RyaW5naWZ5KGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgICBjdHggPSBPYmplY3QuYXNzaWduKHsgYWN0dWFsU3RyaW5nOiB0cnVlIH0sIGN0eCk7XG4gICAgICAgIHJldHVybiBzdHJpbmdpZnlTdHJpbmcoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICB9XG59O1xuXG5leHBvcnQgeyBzdHJpbmcgfTtcbiIsICJpbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9TY2FsYXIuanMnO1xuXG5jb25zdCBudWxsVGFnID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSA9PSBudWxsLFxuICAgIGNyZWF0ZU5vZGU6ICgpID0+IG5ldyBTY2FsYXIobnVsbCksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpudWxsJyxcbiAgICB0ZXN0OiAvXig/On58W05uXXVsbHxOVUxMKT8kLyxcbiAgICByZXNvbHZlOiAoKSA9PiBuZXcgU2NhbGFyKG51bGwpLFxuICAgIHN0cmluZ2lmeTogKHsgc291cmNlIH0sIGN0eCkgPT4gdHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgJiYgbnVsbFRhZy50ZXN0LnRlc3Qoc291cmNlKVxuICAgICAgICA/IHNvdXJjZVxuICAgICAgICA6IGN0eC5vcHRpb25zLm51bGxTdHJcbn07XG5cbmV4cG9ydCB7IG51bGxUYWcgfTtcbiIsICJpbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9TY2FsYXIuanMnO1xuXG5jb25zdCBib29sVGFnID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmJvb2wnLFxuICAgIHRlc3Q6IC9eKD86W1R0XXJ1ZXxUUlVFfFtGZl1hbHNlfEZBTFNFKSQvLFxuICAgIHJlc29sdmU6IHN0ciA9PiBuZXcgU2NhbGFyKHN0clswXSA9PT0gJ3QnIHx8IHN0clswXSA9PT0gJ1QnKSxcbiAgICBzdHJpbmdpZnkoeyBzb3VyY2UsIHZhbHVlIH0sIGN0eCkge1xuICAgICAgICBpZiAoc291cmNlICYmIGJvb2xUYWcudGVzdC50ZXN0KHNvdXJjZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN2ID0gc291cmNlWzBdID09PSAndCcgfHwgc291cmNlWzBdID09PSAnVCc7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHN2KVxuICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlID8gY3R4Lm9wdGlvbnMudHJ1ZVN0ciA6IGN0eC5vcHRpb25zLmZhbHNlU3RyO1xuICAgIH1cbn07XG5cbmV4cG9ydCB7IGJvb2xUYWcgfTtcbiIsICJmdW5jdGlvbiBzdHJpbmdpZnlOdW1iZXIoeyBmb3JtYXQsIG1pbkZyYWN0aW9uRGlnaXRzLCB0YWcsIHZhbHVlIH0pIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYmlnaW50JylcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgY29uc3QgbnVtID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogTnVtYmVyKHZhbHVlKTtcbiAgICBpZiAoIWlzRmluaXRlKG51bSkpXG4gICAgICAgIHJldHVybiBpc05hTihudW0pID8gJy5uYW4nIDogbnVtIDwgMCA/ICctLmluZicgOiAnLmluZic7XG4gICAgbGV0IG4gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgaWYgKCFmb3JtYXQgJiZcbiAgICAgICAgbWluRnJhY3Rpb25EaWdpdHMgJiZcbiAgICAgICAgKCF0YWcgfHwgdGFnID09PSAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnKSAmJlxuICAgICAgICAvXlxcZC8udGVzdChuKSkge1xuICAgICAgICBsZXQgaSA9IG4uaW5kZXhPZignLicpO1xuICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgIGkgPSBuLmxlbmd0aDtcbiAgICAgICAgICAgIG4gKz0gJy4nO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkID0gbWluRnJhY3Rpb25EaWdpdHMgLSAobi5sZW5ndGggLSBpIC0gMSk7XG4gICAgICAgIHdoaWxlIChkLS0gPiAwKVxuICAgICAgICAgICAgbiArPSAnMCc7XG4gICAgfVxuICAgIHJldHVybiBuO1xufVxuXG5leHBvcnQgeyBzdHJpbmdpZnlOdW1iZXIgfTtcbiIsICJpbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9TY2FsYXIuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5TnVtYmVyIH0gZnJvbSAnLi4vLi4vc3RyaW5naWZ5L3N0cmluZ2lmeU51bWJlci5qcyc7XG5cbmNvbnN0IGZsb2F0TmFOID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgIHRlc3Q6IC9eKD86Wy0rXT9cXC4oPzppbmZ8SW5mfElORnxuYW58TmFOfE5BTikpJC8sXG4gICAgcmVzb2x2ZTogc3RyID0+IHN0ci5zbGljZSgtMykudG9Mb3dlckNhc2UoKSA9PT0gJ25hbidcbiAgICAgICAgPyBOYU5cbiAgICAgICAgOiBzdHJbMF0gPT09ICctJ1xuICAgICAgICAgICAgPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFlcbiAgICAgICAgICAgIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5TnVtYmVyXG59O1xuY29uc3QgZmxvYXRFeHAgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsXG4gICAgZm9ybWF0OiAnRVhQJyxcbiAgICB0ZXN0OiAvXlstK10/KD86XFwuWzAtOV0rfFswLTldKyg/OlxcLlswLTldKik/KVtlRV1bLStdP1swLTldKyQvLFxuICAgIHJlc29sdmU6IHN0ciA9PiBwYXJzZUZsb2F0KHN0ciksXG4gICAgc3RyaW5naWZ5KG5vZGUpIHtcbiAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKG5vZGUudmFsdWUpO1xuICAgICAgICByZXR1cm4gaXNGaW5pdGUobnVtKSA/IG51bS50b0V4cG9uZW50aWFsKCkgOiBzdHJpbmdpZnlOdW1iZXIobm9kZSk7XG4gICAgfVxufTtcbmNvbnN0IGZsb2F0ID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgIHRlc3Q6IC9eWy0rXT8oPzpcXC5bMC05XSt8WzAtOV0rXFwuWzAtOV0qKSQvLFxuICAgIHJlc29sdmUoc3RyKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgU2NhbGFyKHBhcnNlRmxvYXQoc3RyKSk7XG4gICAgICAgIGNvbnN0IGRvdCA9IHN0ci5pbmRleE9mKCcuJyk7XG4gICAgICAgIGlmIChkb3QgIT09IC0xICYmIHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICcwJylcbiAgICAgICAgICAgIG5vZGUubWluRnJhY3Rpb25EaWdpdHMgPSBzdHIubGVuZ3RoIC0gZG90IC0gMTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeU51bWJlclxufTtcblxuZXhwb3J0IHsgZmxvYXQsIGZsb2F0RXhwLCBmbG9hdE5hTiB9O1xuIiwgImltcG9ydCB7IHN0cmluZ2lmeU51bWJlciB9IGZyb20gJy4uLy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlOdW1iZXIuanMnO1xuXG5jb25zdCBpbnRJZGVudGlmeSA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyB8fCBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKTtcbmNvbnN0IGludFJlc29sdmUgPSAoc3RyLCBvZmZzZXQsIHJhZGl4LCB7IGludEFzQmlnSW50IH0pID0+IChpbnRBc0JpZ0ludCA/IEJpZ0ludChzdHIpIDogcGFyc2VJbnQoc3RyLnN1YnN0cmluZyhvZmZzZXQpLCByYWRpeCkpO1xuZnVuY3Rpb24gaW50U3RyaW5naWZ5KG5vZGUsIHJhZGl4LCBwcmVmaXgpIHtcbiAgICBjb25zdCB7IHZhbHVlIH0gPSBub2RlO1xuICAgIGlmIChpbnRJZGVudGlmeSh2YWx1ZSkgJiYgdmFsdWUgPj0gMClcbiAgICAgICAgcmV0dXJuIHByZWZpeCArIHZhbHVlLnRvU3RyaW5nKHJhZGl4KTtcbiAgICByZXR1cm4gc3RyaW5naWZ5TnVtYmVyKG5vZGUpO1xufVxuY29uc3QgaW50T2N0ID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiBpbnRJZGVudGlmeSh2YWx1ZSkgJiYgdmFsdWUgPj0gMCxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgZm9ybWF0OiAnT0NUJyxcbiAgICB0ZXN0OiAvXjBvWzAtN10rJC8sXG4gICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIG9wdCkgPT4gaW50UmVzb2x2ZShzdHIsIDIsIDgsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBub2RlID0+IGludFN0cmluZ2lmeShub2RlLCA4LCAnMG8nKVxufTtcbmNvbnN0IGludCA9IHtcbiAgICBpZGVudGlmeTogaW50SWRlbnRpZnksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIHRlc3Q6IC9eWy0rXT9bMC05XSskLyxcbiAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgb3B0KSA9PiBpbnRSZXNvbHZlKHN0ciwgMCwgMTAsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlOdW1iZXJcbn07XG5jb25zdCBpbnRIZXggPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IGludElkZW50aWZ5KHZhbHVlKSAmJiB2YWx1ZSA+PSAwLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgICBmb3JtYXQ6ICdIRVgnLFxuICAgIHRlc3Q6IC9eMHhbMC05YS1mQS1GXSskLyxcbiAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgb3B0KSA9PiBpbnRSZXNvbHZlKHN0ciwgMiwgMTYsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBub2RlID0+IGludFN0cmluZ2lmeShub2RlLCAxNiwgJzB4Jylcbn07XG5cbmV4cG9ydCB7IGludCwgaW50SGV4LCBpbnRPY3QgfTtcbiIsICJpbXBvcnQgeyBtYXAgfSBmcm9tICcuLi9jb21tb24vbWFwLmpzJztcbmltcG9ydCB7IG51bGxUYWcgfSBmcm9tICcuLi9jb21tb24vbnVsbC5qcyc7XG5pbXBvcnQgeyBzZXEgfSBmcm9tICcuLi9jb21tb24vc2VxLmpzJztcbmltcG9ydCB7IHN0cmluZyB9IGZyb20gJy4uL2NvbW1vbi9zdHJpbmcuanMnO1xuaW1wb3J0IHsgYm9vbFRhZyB9IGZyb20gJy4vYm9vbC5qcyc7XG5pbXBvcnQgeyBmbG9hdE5hTiwgZmxvYXRFeHAsIGZsb2F0IH0gZnJvbSAnLi9mbG9hdC5qcyc7XG5pbXBvcnQgeyBpbnRPY3QsIGludCwgaW50SGV4IH0gZnJvbSAnLi9pbnQuanMnO1xuXG5jb25zdCBzY2hlbWEgPSBbXG4gICAgbWFwLFxuICAgIHNlcSxcbiAgICBzdHJpbmcsXG4gICAgbnVsbFRhZyxcbiAgICBib29sVGFnLFxuICAgIGludE9jdCxcbiAgICBpbnQsXG4gICAgaW50SGV4LFxuICAgIGZsb2F0TmFOLFxuICAgIGZsb2F0RXhwLFxuICAgIGZsb2F0XG5dO1xuXG5leHBvcnQgeyBzY2hlbWEgfTtcbiIsICJpbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9TY2FsYXIuanMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAnLi4vY29tbW9uL21hcC5qcyc7XG5pbXBvcnQgeyBzZXEgfSBmcm9tICcuLi9jb21tb24vc2VxLmpzJztcblxuZnVuY3Rpb24gaW50SWRlbnRpZnkodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyB8fCBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKTtcbn1cbmNvbnN0IHN0cmluZ2lmeUpTT04gPSAoeyB2YWx1ZSB9KSA9PiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG5jb25zdCBqc29uU2NhbGFycyA9IFtcbiAgICB7XG4gICAgICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpzdHInLFxuICAgICAgICByZXNvbHZlOiBzdHIgPT4gc3RyLFxuICAgICAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeUpTT05cbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWRlbnRpZnk6IHZhbHVlID0+IHZhbHVlID09IG51bGwsXG4gICAgICAgIGNyZWF0ZU5vZGU6ICgpID0+IG5ldyBTY2FsYXIobnVsbCksXG4gICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOm51bGwnLFxuICAgICAgICB0ZXN0OiAvXm51bGwkLyxcbiAgICAgICAgcmVzb2x2ZTogKCkgPT4gbnVsbCxcbiAgICAgICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlKU09OXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6Ym9vbCcsXG4gICAgICAgIHRlc3Q6IC9edHJ1ZXxmYWxzZSQvLFxuICAgICAgICByZXNvbHZlOiBzdHIgPT4gc3RyID09PSAndHJ1ZScsXG4gICAgICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5SlNPTlxuICAgIH0sXG4gICAge1xuICAgICAgICBpZGVudGlmeTogaW50SWRlbnRpZnksXG4gICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgICAgIHRlc3Q6IC9eLT8oPzowfFsxLTldWzAtOV0qKSQvLFxuICAgICAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgeyBpbnRBc0JpZ0ludCB9KSA9PiBpbnRBc0JpZ0ludCA/IEJpZ0ludChzdHIpIDogcGFyc2VJbnQoc3RyLCAxMCksXG4gICAgICAgIHN0cmluZ2lmeTogKHsgdmFsdWUgfSkgPT4gaW50SWRlbnRpZnkodmFsdWUpID8gdmFsdWUudG9TdHJpbmcoKSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgICAgICB0ZXN0OiAvXi0/KD86MHxbMS05XVswLTldKikoPzpcXC5bMC05XSopPyg/OltlRV1bLStdP1swLTldKyk/JC8sXG4gICAgICAgIHJlc29sdmU6IHN0ciA9PiBwYXJzZUZsb2F0KHN0ciksXG4gICAgICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5SlNPTlxuICAgIH1cbl07XG5jb25zdCBqc29uRXJyb3IgPSB7XG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICcnLFxuICAgIHRlc3Q6IC9eLyxcbiAgICByZXNvbHZlKHN0ciwgb25FcnJvcikge1xuICAgICAgICBvbkVycm9yKGBVbnJlc29sdmVkIHBsYWluIHNjYWxhciAke0pTT04uc3RyaW5naWZ5KHN0cil9YCk7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxufTtcbmNvbnN0IHNjaGVtYSA9IFttYXAsIHNlcV0uY29uY2F0KGpzb25TY2FsYXJzLCBqc29uRXJyb3IpO1xuXG5leHBvcnQgeyBzY2hlbWEgfTtcbiIsICJpbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9TY2FsYXIuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5U3RyaW5nIH0gZnJvbSAnLi4vLi4vc3RyaW5naWZ5L3N0cmluZ2lmeVN0cmluZy5qcyc7XG5cbmNvbnN0IGJpbmFyeSA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5LFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmJpbmFyeScsXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJ1ZmZlciBpbiBub2RlIGFuZCBhbiBVaW50OEFycmF5IGluIGJyb3dzZXJzXG4gICAgICpcbiAgICAgKiBUbyB1c2UgdGhlIHJlc3VsdGluZyBidWZmZXIgYXMgYW4gaW1hZ2UsIHlvdSdsbCB3YW50IHRvIGRvIHNvbWV0aGluZyBsaWtlOlxuICAgICAqXG4gICAgICogICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHsgdHlwZTogJ2ltYWdlL2pwZWcnIH0pXG4gICAgICogICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGhvdG8nKS5zcmMgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpXG4gICAgICovXG4gICAgcmVzb2x2ZShzcmMsIG9uRXJyb3IpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBCdWZmZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShzcmMsICdiYXNlNjQnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgYXRvYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gT24gSUUgMTEsIGF0b2IoKSBjYW4ndCBoYW5kbGUgbmV3bGluZXNcbiAgICAgICAgICAgIGNvbnN0IHN0ciA9IGF0b2Ioc3JjLnJlcGxhY2UoL1tcXG5cXHJdL2csICcnKSk7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9uRXJyb3IoJ1RoaXMgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nIGJpbmFyeSB0YWdzOyBlaXRoZXIgQnVmZmVyIG9yIGF0b2IgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgICAgIHJldHVybiBzcmM7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHN0cmluZ2lmeSh7IGNvbW1lbnQsIHR5cGUsIHZhbHVlIH0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgICBjb25zdCBidWYgPSB2YWx1ZTsgLy8gY2hlY2tlZCBlYXJsaWVyIGJ5IGJpbmFyeS5pZGVudGlmeSgpXG4gICAgICAgIGxldCBzdHI7XG4gICAgICAgIGlmICh0eXBlb2YgQnVmZmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzdHIgPVxuICAgICAgICAgICAgICAgIGJ1ZiBpbnN0YW5jZW9mIEJ1ZmZlclxuICAgICAgICAgICAgICAgICAgICA/IGJ1Zi50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgICAgICAgICAgICAgOiBCdWZmZXIuZnJvbShidWYuYnVmZmVyKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGJ0b2EgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGxldCBzID0gJyc7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKTtcbiAgICAgICAgICAgIHN0ciA9IGJ0b2Eocyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nIGJpbmFyeSB0YWdzOyBlaXRoZXIgQnVmZmVyIG9yIGJ0b2EgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXR5cGUpXG4gICAgICAgICAgICB0eXBlID0gU2NhbGFyLkJMT0NLX0xJVEVSQUw7XG4gICAgICAgIGlmICh0eXBlICE9PSBTY2FsYXIuUVVPVEVfRE9VQkxFKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lV2lkdGggPSBNYXRoLm1heChjdHgub3B0aW9ucy5saW5lV2lkdGggLSBjdHguaW5kZW50Lmxlbmd0aCwgY3R4Lm9wdGlvbnMubWluQ29udGVudFdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBNYXRoLmNlaWwoc3RyLmxlbmd0aCAvIGxpbmVXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBsaW5lcyA9IG5ldyBBcnJheShuKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBvID0gMDsgaSA8IG47ICsraSwgbyArPSBsaW5lV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBsaW5lc1tpXSA9IHN0ci5zdWJzdHIobywgbGluZVdpZHRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0ciA9IGxpbmVzLmpvaW4odHlwZSA9PT0gU2NhbGFyLkJMT0NLX0xJVEVSQUwgPyAnXFxuJyA6ICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeVN0cmluZyh7IGNvbW1lbnQsIHR5cGUsIHZhbHVlOiBzdHIgfSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICB9XG59O1xuXG5leHBvcnQgeyBiaW5hcnkgfTtcbiIsICJpbXBvcnQgeyBpc1NlcSwgaXNQYWlyLCBpc01hcCB9IGZyb20gJy4uLy4uL25vZGVzL05vZGUuanMnO1xuaW1wb3J0IHsgUGFpciwgY3JlYXRlUGFpciB9IGZyb20gJy4uLy4uL25vZGVzL1BhaXIuanMnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IFlBTUxTZXEgfSBmcm9tICcuLi8uLi9ub2Rlcy9ZQU1MU2VxLmpzJztcblxuZnVuY3Rpb24gcmVzb2x2ZVBhaXJzKHNlcSwgb25FcnJvcikge1xuICAgIGlmIChpc1NlcShzZXEpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VxLml0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgaXRlbSA9IHNlcS5pdGVtc1tpXTtcbiAgICAgICAgICAgIGlmIChpc1BhaXIoaXRlbSkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBlbHNlIGlmIChpc01hcChpdGVtKSkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLml0ZW1zLmxlbmd0aCA+IDEpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoJ0VhY2ggcGFpciBtdXN0IGhhdmUgaXRzIG93biBzZXF1ZW5jZSBpbmRpY2F0b3InKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gaXRlbS5pdGVtc1swXSB8fCBuZXcgUGFpcihuZXcgU2NhbGFyKG51bGwpKTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5jb21tZW50QmVmb3JlKVxuICAgICAgICAgICAgICAgICAgICBwYWlyLmtleS5jb21tZW50QmVmb3JlID0gcGFpci5rZXkuY29tbWVudEJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgJHtpdGVtLmNvbW1lbnRCZWZvcmV9XFxuJHtwYWlyLmtleS5jb21tZW50QmVmb3JlfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlbS5jb21tZW50QmVmb3JlO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY24gPSBwYWlyLnZhbHVlID8/IHBhaXIua2V5O1xuICAgICAgICAgICAgICAgICAgICBjbi5jb21tZW50ID0gY24uY29tbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgJHtpdGVtLmNvbW1lbnR9XFxuJHtjbi5jb21tZW50fWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlbS5jb21tZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpdGVtID0gcGFpcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlcS5pdGVtc1tpXSA9IGlzUGFpcihpdGVtKSA/IGl0ZW0gOiBuZXcgUGFpcihpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlXG4gICAgICAgIG9uRXJyb3IoJ0V4cGVjdGVkIGEgc2VxdWVuY2UgZm9yIHRoaXMgdGFnJyk7XG4gICAgcmV0dXJuIHNlcTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVBhaXJzKHNjaGVtYSwgaXRlcmFibGUsIGN0eCkge1xuICAgIGNvbnN0IHsgcmVwbGFjZXIgfSA9IGN0eDtcbiAgICBjb25zdCBwYWlycyA9IG5ldyBZQU1MU2VxKHNjaGVtYSk7XG4gICAgcGFpcnMudGFnID0gJ3RhZzp5YW1sLm9yZywyMDAyOnBhaXJzJztcbiAgICBsZXQgaSA9IDA7XG4gICAgaWYgKGl0ZXJhYmxlICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcmFibGUpKVxuICAgICAgICBmb3IgKGxldCBpdCBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICBpdCA9IHJlcGxhY2VyLmNhbGwoaXRlcmFibGUsIFN0cmluZyhpKyspLCBpdCk7XG4gICAgICAgICAgICBsZXQga2V5LCB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0KSkge1xuICAgICAgICAgICAgICAgIGlmIChpdC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gaXRbMF07XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gaXRbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgW2tleSwgdmFsdWVdIHR1cGxlOiAke2l0fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXQgJiYgaXQgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaXQpO1xuICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlzWzBdO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGl0W2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgeyBrZXk6IHZhbHVlIH0gdHVwbGU6ICR7aXR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBrZXkgPSBpdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhaXJzLml0ZW1zLnB1c2goY3JlYXRlUGFpcihrZXksIHZhbHVlLCBjdHgpKTtcbiAgICAgICAgfVxuICAgIHJldHVybiBwYWlycztcbn1cbmNvbnN0IHBhaXJzID0ge1xuICAgIGNvbGxlY3Rpb246ICdzZXEnLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOnBhaXJzJyxcbiAgICByZXNvbHZlOiByZXNvbHZlUGFpcnMsXG4gICAgY3JlYXRlTm9kZTogY3JlYXRlUGFpcnNcbn07XG5cbmV4cG9ydCB7IGNyZWF0ZVBhaXJzLCBwYWlycywgcmVzb2x2ZVBhaXJzIH07XG4iLCAiaW1wb3J0IHsgWUFNTFNlcSB9IGZyb20gJy4uLy4uL25vZGVzL1lBTUxTZXEuanMnO1xuaW1wb3J0IHsgdG9KUyB9IGZyb20gJy4uLy4uL25vZGVzL3RvSlMuanMnO1xuaW1wb3J0IHsgaXNTY2FsYXIsIGlzUGFpciB9IGZyb20gJy4uLy4uL25vZGVzL05vZGUuanMnO1xuaW1wb3J0IHsgWUFNTE1hcCB9IGZyb20gJy4uLy4uL25vZGVzL1lBTUxNYXAuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVBhaXJzLCBjcmVhdGVQYWlycyB9IGZyb20gJy4vcGFpcnMuanMnO1xuXG5jbGFzcyBZQU1MT01hcCBleHRlbmRzIFlBTUxTZXEge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmFkZCA9IFlBTUxNYXAucHJvdG90eXBlLmFkZC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmRlbGV0ZSA9IFlBTUxNYXAucHJvdG90eXBlLmRlbGV0ZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmdldCA9IFlBTUxNYXAucHJvdG90eXBlLmdldC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmhhcyA9IFlBTUxNYXAucHJvdG90eXBlLmhhcy5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNldCA9IFlBTUxNYXAucHJvdG90eXBlLnNldC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnRhZyA9IFlBTUxPTWFwLnRhZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgYGN0eGAgaXMgZ2l2ZW4sIHRoZSByZXR1cm4gdHlwZSBpcyBhY3R1YWxseSBgTWFwPHVua25vd24sIHVua25vd24+YCxcbiAgICAgKiBidXQgVHlwZVNjcmlwdCB3b24ndCBhbGxvdyB3aWRlbmluZyB0aGUgc2lnbmF0dXJlIG9mIGEgY2hpbGQgbWV0aG9kLlxuICAgICAqL1xuICAgIHRvSlNPTihfLCBjdHgpIHtcbiAgICAgICAgaWYgKCFjdHgpXG4gICAgICAgICAgICByZXR1cm4gc3VwZXIudG9KU09OKF8pO1xuICAgICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIGlmIChjdHg/Lm9uQ3JlYXRlKVxuICAgICAgICAgICAgY3R4Lm9uQ3JlYXRlKG1hcCk7XG4gICAgICAgIGZvciAoY29uc3QgcGFpciBvZiB0aGlzLml0ZW1zKSB7XG4gICAgICAgICAgICBsZXQga2V5LCB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChpc1BhaXIocGFpcikpIHtcbiAgICAgICAgICAgICAgICBrZXkgPSB0b0pTKHBhaXIua2V5LCAnJywgY3R4KTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvSlMocGFpci52YWx1ZSwga2V5LCBjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAga2V5ID0gdG9KUyhwYWlyLCAnJywgY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXAuaGFzKGtleSkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPcmRlcmVkIG1hcHMgbXVzdCBub3QgaW5jbHVkZSBkdXBsaWNhdGUga2V5cycpO1xuICAgICAgICAgICAgbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cbn1cbllBTUxPTWFwLnRhZyA9ICd0YWc6eWFtbC5vcmcsMjAwMjpvbWFwJztcbmNvbnN0IG9tYXAgPSB7XG4gICAgY29sbGVjdGlvbjogJ3NlcScsXG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHZhbHVlIGluc3RhbmNlb2YgTWFwLFxuICAgIG5vZGVDbGFzczogWUFNTE9NYXAsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6b21hcCcsXG4gICAgcmVzb2x2ZShzZXEsIG9uRXJyb3IpIHtcbiAgICAgICAgY29uc3QgcGFpcnMgPSByZXNvbHZlUGFpcnMoc2VxLCBvbkVycm9yKTtcbiAgICAgICAgY29uc3Qgc2VlbktleXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB7IGtleSB9IG9mIHBhaXJzLml0ZW1zKSB7XG4gICAgICAgICAgICBpZiAoaXNTY2FsYXIoa2V5KSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWVuS2V5cy5pbmNsdWRlcyhrZXkudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoYE9yZGVyZWQgbWFwcyBtdXN0IG5vdCBpbmNsdWRlIGR1cGxpY2F0ZSBrZXlzOiAke2tleS52YWx1ZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNlZW5LZXlzLnB1c2goa2V5LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IFlBTUxPTWFwKCksIHBhaXJzKTtcbiAgICB9LFxuICAgIGNyZWF0ZU5vZGUoc2NoZW1hLCBpdGVyYWJsZSwgY3R4KSB7XG4gICAgICAgIGNvbnN0IHBhaXJzID0gY3JlYXRlUGFpcnMoc2NoZW1hLCBpdGVyYWJsZSwgY3R4KTtcbiAgICAgICAgY29uc3Qgb21hcCA9IG5ldyBZQU1MT01hcCgpO1xuICAgICAgICBvbWFwLml0ZW1zID0gcGFpcnMuaXRlbXM7XG4gICAgICAgIHJldHVybiBvbWFwO1xuICAgIH1cbn07XG5cbmV4cG9ydCB7IFlBTUxPTWFwLCBvbWFwIH07XG4iLCAiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcblxuZnVuY3Rpb24gYm9vbFN0cmluZ2lmeSh7IHZhbHVlLCBzb3VyY2UgfSwgY3R4KSB7XG4gICAgY29uc3QgYm9vbE9iaiA9IHZhbHVlID8gdHJ1ZVRhZyA6IGZhbHNlVGFnO1xuICAgIGlmIChzb3VyY2UgJiYgYm9vbE9iai50ZXN0LnRlc3Qoc291cmNlKSlcbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICByZXR1cm4gdmFsdWUgPyBjdHgub3B0aW9ucy50cnVlU3RyIDogY3R4Lm9wdGlvbnMuZmFsc2VTdHI7XG59XG5jb25zdCB0cnVlVGFnID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSA9PT0gdHJ1ZSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmJvb2wnLFxuICAgIHRlc3Q6IC9eKD86WXx5fFtZeV1lc3xZRVN8W1R0XXJ1ZXxUUlVFfFtPb11ufE9OKSQvLFxuICAgIHJlc29sdmU6ICgpID0+IG5ldyBTY2FsYXIodHJ1ZSksXG4gICAgc3RyaW5naWZ5OiBib29sU3RyaW5naWZ5XG59O1xuY29uc3QgZmFsc2VUYWcgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHZhbHVlID09PSBmYWxzZSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmJvb2wnLFxuICAgIHRlc3Q6IC9eKD86TnxufFtObl1vfE5PfFtGZl1hbHNlfEZBTFNFfFtPb11mZnxPRkYpJC9pLFxuICAgIHJlc29sdmU6ICgpID0+IG5ldyBTY2FsYXIoZmFsc2UpLFxuICAgIHN0cmluZ2lmeTogYm9vbFN0cmluZ2lmeVxufTtcblxuZXhwb3J0IHsgZmFsc2VUYWcsIHRydWVUYWcgfTtcbiIsICJpbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9TY2FsYXIuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5TnVtYmVyIH0gZnJvbSAnLi4vLi4vc3RyaW5naWZ5L3N0cmluZ2lmeU51bWJlci5qcyc7XG5cbmNvbnN0IGZsb2F0TmFOID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgIHRlc3Q6IC9eWy0rXT9cXC4oPzppbmZ8SW5mfElORnxuYW58TmFOfE5BTikkLyxcbiAgICByZXNvbHZlOiAoc3RyKSA9PiBzdHIuc2xpY2UoLTMpLnRvTG93ZXJDYXNlKCkgPT09ICduYW4nXG4gICAgICAgID8gTmFOXG4gICAgICAgIDogc3RyWzBdID09PSAnLSdcbiAgICAgICAgICAgID8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZXG4gICAgICAgICAgICA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeU51bWJlclxufTtcbmNvbnN0IGZsb2F0RXhwID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgIGZvcm1hdDogJ0VYUCcsXG4gICAgdGVzdDogL15bLStdPyg/OlswLTldWzAtOV9dKik/KD86XFwuWzAtOV9dKik/W2VFXVstK10/WzAtOV0rJC8sXG4gICAgcmVzb2x2ZTogKHN0cikgPT4gcGFyc2VGbG9hdChzdHIucmVwbGFjZSgvXy9nLCAnJykpLFxuICAgIHN0cmluZ2lmeShub2RlKSB7XG4gICAgICAgIGNvbnN0IG51bSA9IE51bWJlcihub2RlLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGlzRmluaXRlKG51bSkgPyBudW0udG9FeHBvbmVudGlhbCgpIDogc3RyaW5naWZ5TnVtYmVyKG5vZGUpO1xuICAgIH1cbn07XG5jb25zdCBmbG9hdCA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgICB0ZXN0OiAvXlstK10/KD86WzAtOV1bMC05X10qKT9cXC5bMC05X10qJC8sXG4gICAgcmVzb2x2ZShzdHIpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBTY2FsYXIocGFyc2VGbG9hdChzdHIucmVwbGFjZSgvXy9nLCAnJykpKTtcbiAgICAgICAgY29uc3QgZG90ID0gc3RyLmluZGV4T2YoJy4nKTtcbiAgICAgICAgaWYgKGRvdCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGYgPSBzdHIuc3Vic3RyaW5nKGRvdCArIDEpLnJlcGxhY2UoL18vZywgJycpO1xuICAgICAgICAgICAgaWYgKGZbZi5sZW5ndGggLSAxXSA9PT0gJzAnKVxuICAgICAgICAgICAgICAgIG5vZGUubWluRnJhY3Rpb25EaWdpdHMgPSBmLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9LFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5TnVtYmVyXG59O1xuXG5leHBvcnQgeyBmbG9hdCwgZmxvYXRFeHAsIGZsb2F0TmFOIH07XG4iLCAiaW1wb3J0IHsgc3RyaW5naWZ5TnVtYmVyIH0gZnJvbSAnLi4vLi4vc3RyaW5naWZ5L3N0cmluZ2lmeU51bWJlci5qcyc7XG5cbmNvbnN0IGludElkZW50aWZ5ID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnIHx8IE51bWJlci5pc0ludGVnZXIodmFsdWUpO1xuZnVuY3Rpb24gaW50UmVzb2x2ZShzdHIsIG9mZnNldCwgcmFkaXgsIHsgaW50QXNCaWdJbnQgfSkge1xuICAgIGNvbnN0IHNpZ24gPSBzdHJbMF07XG4gICAgaWYgKHNpZ24gPT09ICctJyB8fCBzaWduID09PSAnKycpXG4gICAgICAgIG9mZnNldCArPSAxO1xuICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcob2Zmc2V0KS5yZXBsYWNlKC9fL2csICcnKTtcbiAgICBpZiAoaW50QXNCaWdJbnQpIHtcbiAgICAgICAgc3dpdGNoIChyYWRpeCkge1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHN0ciA9IGAwYiR7c3RyfWA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgc3RyID0gYDBvJHtzdHJ9YDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgc3RyID0gYDB4JHtzdHJ9YDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuID0gQmlnSW50KHN0cik7XG4gICAgICAgIHJldHVybiBzaWduID09PSAnLScgPyBCaWdJbnQoLTEpICogbiA6IG47XG4gICAgfVxuICAgIGNvbnN0IG4gPSBwYXJzZUludChzdHIsIHJhZGl4KTtcbiAgICByZXR1cm4gc2lnbiA9PT0gJy0nID8gLTEgKiBuIDogbjtcbn1cbmZ1bmN0aW9uIGludFN0cmluZ2lmeShub2RlLCByYWRpeCwgcHJlZml4KSB7XG4gICAgY29uc3QgeyB2YWx1ZSB9ID0gbm9kZTtcbiAgICBpZiAoaW50SWRlbnRpZnkodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHN0ciA9IHZhbHVlLnRvU3RyaW5nKHJhZGl4KTtcbiAgICAgICAgcmV0dXJuIHZhbHVlIDwgMCA/ICctJyArIHByZWZpeCArIHN0ci5zdWJzdHIoMSkgOiBwcmVmaXggKyBzdHI7XG4gICAgfVxuICAgIHJldHVybiBzdHJpbmdpZnlOdW1iZXIobm9kZSk7XG59XG5jb25zdCBpbnRCaW4gPSB7XG4gICAgaWRlbnRpZnk6IGludElkZW50aWZ5LFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgICBmb3JtYXQ6ICdCSU4nLFxuICAgIHRlc3Q6IC9eWy0rXT8wYlswLTFfXSskLyxcbiAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgb3B0KSA9PiBpbnRSZXNvbHZlKHN0ciwgMiwgMiwgb3B0KSxcbiAgICBzdHJpbmdpZnk6IG5vZGUgPT4gaW50U3RyaW5naWZ5KG5vZGUsIDIsICcwYicpXG59O1xuY29uc3QgaW50T2N0ID0ge1xuICAgIGlkZW50aWZ5OiBpbnRJZGVudGlmeSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgZm9ybWF0OiAnT0NUJyxcbiAgICB0ZXN0OiAvXlstK10/MFswLTdfXSskLyxcbiAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgb3B0KSA9PiBpbnRSZXNvbHZlKHN0ciwgMSwgOCwgb3B0KSxcbiAgICBzdHJpbmdpZnk6IG5vZGUgPT4gaW50U3RyaW5naWZ5KG5vZGUsIDgsICcwJylcbn07XG5jb25zdCBpbnQgPSB7XG4gICAgaWRlbnRpZnk6IGludElkZW50aWZ5LFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgICB0ZXN0OiAvXlstK10/WzAtOV1bMC05X10qJC8sXG4gICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIG9wdCkgPT4gaW50UmVzb2x2ZShzdHIsIDAsIDEwLCBvcHQpLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5TnVtYmVyXG59O1xuY29uc3QgaW50SGV4ID0ge1xuICAgIGlkZW50aWZ5OiBpbnRJZGVudGlmeSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgZm9ybWF0OiAnSEVYJyxcbiAgICB0ZXN0OiAvXlstK10/MHhbMC05YS1mQS1GX10rJC8sXG4gICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIG9wdCkgPT4gaW50UmVzb2x2ZShzdHIsIDIsIDE2LCBvcHQpLFxuICAgIHN0cmluZ2lmeTogbm9kZSA9PiBpbnRTdHJpbmdpZnkobm9kZSwgMTYsICcweCcpXG59O1xuXG5leHBvcnQgeyBpbnQsIGludEJpbiwgaW50SGV4LCBpbnRPY3QgfTtcbiIsICJpbXBvcnQgeyBpc01hcCwgaXNQYWlyLCBpc1NjYWxhciB9IGZyb20gJy4uLy4uL25vZGVzL05vZGUuanMnO1xuaW1wb3J0IHsgY3JlYXRlUGFpciwgUGFpciB9IGZyb20gJy4uLy4uL25vZGVzL1BhaXIuanMnO1xuaW1wb3J0IHsgWUFNTE1hcCwgZmluZFBhaXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9ZQU1MTWFwLmpzJztcblxuY2xhc3MgWUFNTFNldCBleHRlbmRzIFlBTUxNYXAge1xuICAgIGNvbnN0cnVjdG9yKHNjaGVtYSkge1xuICAgICAgICBzdXBlcihzY2hlbWEpO1xuICAgICAgICB0aGlzLnRhZyA9IFlBTUxTZXQudGFnO1xuICAgIH1cbiAgICBhZGQoa2V5KSB7XG4gICAgICAgIGxldCBwYWlyO1xuICAgICAgICBpZiAoaXNQYWlyKGtleSkpXG4gICAgICAgICAgICBwYWlyID0ga2V5O1xuICAgICAgICBlbHNlIGlmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgJ2tleScgaW4ga2V5ICYmXG4gICAgICAgICAgICAndmFsdWUnIGluIGtleSAmJlxuICAgICAgICAgICAga2V5LnZhbHVlID09PSBudWxsKVxuICAgICAgICAgICAgcGFpciA9IG5ldyBQYWlyKGtleS5rZXksIG51bGwpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwYWlyID0gbmV3IFBhaXIoa2V5LCBudWxsKTtcbiAgICAgICAgY29uc3QgcHJldiA9IGZpbmRQYWlyKHRoaXMuaXRlbXMsIHBhaXIua2V5KTtcbiAgICAgICAgaWYgKCFwcmV2KVxuICAgICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKHBhaXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiBga2VlcFBhaXJgIGlzIGB0cnVlYCwgcmV0dXJucyB0aGUgUGFpciBtYXRjaGluZyBga2V5YC5cbiAgICAgKiBPdGhlcndpc2UsIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoYXQgUGFpcidzIGtleS5cbiAgICAgKi9cbiAgICBnZXQoa2V5LCBrZWVwUGFpcikge1xuICAgICAgICBjb25zdCBwYWlyID0gZmluZFBhaXIodGhpcy5pdGVtcywga2V5KTtcbiAgICAgICAgcmV0dXJuICFrZWVwUGFpciAmJiBpc1BhaXIocGFpcilcbiAgICAgICAgICAgID8gaXNTY2FsYXIocGFpci5rZXkpXG4gICAgICAgICAgICAgICAgPyBwYWlyLmtleS52YWx1ZVxuICAgICAgICAgICAgICAgIDogcGFpci5rZXlcbiAgICAgICAgICAgIDogcGFpcjtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBib29sZWFuIHZhbHVlIGZvciBzZXQoa2V5LCB2YWx1ZSkgaW4gYSBZQU1MIHNldCwgbm90ICR7dHlwZW9mIHZhbHVlfWApO1xuICAgICAgICBjb25zdCBwcmV2ID0gZmluZFBhaXIodGhpcy5pdGVtcywga2V5KTtcbiAgICAgICAgaWYgKHByZXYgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zLnNwbGljZSh0aGlzLml0ZW1zLmluZGV4T2YocHJldiksIDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFwcmV2ICYmIHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zLnB1c2gobmV3IFBhaXIoa2V5KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9KU09OKF8sIGN0eCkge1xuICAgICAgICByZXR1cm4gc3VwZXIudG9KU09OKF8sIGN0eCwgU2V0KTtcbiAgICB9XG4gICAgdG9TdHJpbmcoY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgICAgIGlmICghY3R4KVxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5oYXNBbGxOdWxsVmFsdWVzKHRydWUpKVxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKE9iamVjdC5hc3NpZ24oe30sIGN0eCwgeyBhbGxOdWxsVmFsdWVzOiB0cnVlIH0pLCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXQgaXRlbXMgbXVzdCBhbGwgaGF2ZSBudWxsIHZhbHVlcycpO1xuICAgIH1cbn1cbllBTUxTZXQudGFnID0gJ3RhZzp5YW1sLm9yZywyMDAyOnNldCc7XG5jb25zdCBzZXQgPSB7XG4gICAgY29sbGVjdGlvbjogJ21hcCcsXG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHZhbHVlIGluc3RhbmNlb2YgU2V0LFxuICAgIG5vZGVDbGFzczogWUFNTFNldCxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpzZXQnLFxuICAgIHJlc29sdmUobWFwLCBvbkVycm9yKSB7XG4gICAgICAgIGlmIChpc01hcChtYXApKSB7XG4gICAgICAgICAgICBpZiAobWFwLmhhc0FsbE51bGxWYWx1ZXModHJ1ZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IFlBTUxTZXQoKSwgbWFwKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBvbkVycm9yKCdTZXQgaXRlbXMgbXVzdCBhbGwgaGF2ZSBudWxsIHZhbHVlcycpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG9uRXJyb3IoJ0V4cGVjdGVkIGEgbWFwcGluZyBmb3IgdGhpcyB0YWcnKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9LFxuICAgIGNyZWF0ZU5vZGUoc2NoZW1hLCBpdGVyYWJsZSwgY3R4KSB7XG4gICAgICAgIGNvbnN0IHsgcmVwbGFjZXIgfSA9IGN0eDtcbiAgICAgICAgY29uc3Qgc2V0ID0gbmV3IFlBTUxTZXQoc2NoZW1hKTtcbiAgICAgICAgaWYgKGl0ZXJhYmxlICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcmFibGUpKVxuICAgICAgICAgICAgZm9yIChsZXQgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlcGxhY2VyID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlcGxhY2VyLmNhbGwoaXRlcmFibGUsIHZhbHVlLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgc2V0Lml0ZW1zLnB1c2goY3JlYXRlUGFpcih2YWx1ZSwgbnVsbCwgY3R4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXQ7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgWUFNTFNldCwgc2V0IH07XG4iLCAiaW1wb3J0IHsgc3RyaW5naWZ5TnVtYmVyIH0gZnJvbSAnLi4vLi4vc3RyaW5naWZ5L3N0cmluZ2lmeU51bWJlci5qcyc7XG5cbi8qKiBJbnRlcm5hbCB0eXBlcyBoYW5kbGUgYmlnaW50IGFzIG51bWJlciwgYmVjYXVzZSBUUyBjYW4ndCBmaWd1cmUgaXQgb3V0LiAqL1xuZnVuY3Rpb24gcGFyc2VTZXhhZ2VzaW1hbChzdHIsIGFzQmlnSW50KSB7XG4gICAgY29uc3Qgc2lnbiA9IHN0clswXTtcbiAgICBjb25zdCBwYXJ0cyA9IHNpZ24gPT09ICctJyB8fCBzaWduID09PSAnKycgPyBzdHIuc3Vic3RyaW5nKDEpIDogc3RyO1xuICAgIGNvbnN0IG51bSA9IChuKSA9PiBhc0JpZ0ludCA/IEJpZ0ludChuKSA6IE51bWJlcihuKTtcbiAgICBjb25zdCByZXMgPSBwYXJ0c1xuICAgICAgICAucmVwbGFjZSgvXy9nLCAnJylcbiAgICAgICAgLnNwbGl0KCc6JylcbiAgICAgICAgLnJlZHVjZSgocmVzLCBwKSA9PiByZXMgKiBudW0oNjApICsgbnVtKHApLCBudW0oMCkpO1xuICAgIHJldHVybiAoc2lnbiA9PT0gJy0nID8gbnVtKC0xKSAqIHJlcyA6IHJlcyk7XG59XG4vKipcbiAqIGhoaGg6bW06c3Muc3NzXG4gKlxuICogSW50ZXJuYWwgdHlwZXMgaGFuZGxlIGJpZ2ludCBhcyBudW1iZXIsIGJlY2F1c2UgVFMgY2FuJ3QgZmlndXJlIGl0IG91dC5cbiAqL1xuZnVuY3Rpb24gc3RyaW5naWZ5U2V4YWdlc2ltYWwobm9kZSkge1xuICAgIGxldCB7IHZhbHVlIH0gPSBub2RlO1xuICAgIGxldCBudW0gPSAobikgPT4gbjtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYmlnaW50JylcbiAgICAgICAgbnVtID0gbiA9PiBCaWdJbnQobik7XG4gICAgZWxzZSBpZiAoaXNOYU4odmFsdWUpIHx8ICFpc0Zpbml0ZSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiBzdHJpbmdpZnlOdW1iZXIobm9kZSk7XG4gICAgbGV0IHNpZ24gPSAnJztcbiAgICBpZiAodmFsdWUgPCAwKSB7XG4gICAgICAgIHNpZ24gPSAnLSc7XG4gICAgICAgIHZhbHVlICo9IG51bSgtMSk7XG4gICAgfVxuICAgIGNvbnN0IF82MCA9IG51bSg2MCk7XG4gICAgY29uc3QgcGFydHMgPSBbdmFsdWUgJSBfNjBdOyAvLyBzZWNvbmRzLCBpbmNsdWRpbmcgbXNcbiAgICBpZiAodmFsdWUgPCA2MCkge1xuICAgICAgICBwYXJ0cy51bnNoaWZ0KDApOyAvLyBhdCBsZWFzdCBvbmUgOiBpcyByZXF1aXJlZFxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSAodmFsdWUgLSBwYXJ0c1swXSkgLyBfNjA7XG4gICAgICAgIHBhcnRzLnVuc2hpZnQodmFsdWUgJSBfNjApOyAvLyBtaW51dGVzXG4gICAgICAgIGlmICh2YWx1ZSA+PSA2MCkge1xuICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgLSBwYXJ0c1swXSkgLyBfNjA7XG4gICAgICAgICAgICBwYXJ0cy51bnNoaWZ0KHZhbHVlKTsgLy8gaG91cnNcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKHNpZ24gK1xuICAgICAgICBwYXJ0c1xuICAgICAgICAgICAgLm1hcChuID0+IChuIDwgMTAgPyAnMCcgKyBTdHJpbmcobikgOiBTdHJpbmcobikpKVxuICAgICAgICAgICAgLmpvaW4oJzonKVxuICAgICAgICAgICAgLnJlcGxhY2UoLzAwMDAwMFxcZCokLywgJycpIC8vICUgNjAgbWF5IGludHJvZHVjZSBlcnJvclxuICAgICk7XG59XG5jb25zdCBpbnRUaW1lID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnIHx8IE51bWJlci5pc0ludGVnZXIodmFsdWUpLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgICBmb3JtYXQ6ICdUSU1FJyxcbiAgICB0ZXN0OiAvXlstK10/WzAtOV1bMC05X10qKD86OlswLTVdP1swLTldKSskLyxcbiAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgeyBpbnRBc0JpZ0ludCB9KSA9PiBwYXJzZVNleGFnZXNpbWFsKHN0ciwgaW50QXNCaWdJbnQpLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5U2V4YWdlc2ltYWxcbn07XG5jb25zdCBmbG9hdFRpbWUgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsXG4gICAgZm9ybWF0OiAnVElNRScsXG4gICAgdGVzdDogL15bLStdP1swLTldWzAtOV9dKig/OjpbMC01XT9bMC05XSkrXFwuWzAtOV9dKiQvLFxuICAgIHJlc29sdmU6IHN0ciA9PiBwYXJzZVNleGFnZXNpbWFsKHN0ciwgZmFsc2UpLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5U2V4YWdlc2ltYWxcbn07XG5jb25zdCB0aW1lc3RhbXAgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOnRpbWVzdGFtcCcsXG4gICAgLy8gSWYgdGhlIHRpbWUgem9uZSBpcyBvbWl0dGVkLCB0aGUgdGltZXN0YW1wIGlzIGFzc3VtZWQgdG8gYmUgc3BlY2lmaWVkIGluIFVUQy4gVGhlIHRpbWUgcGFydFxuICAgIC8vIG1heSBiZSBvbWl0dGVkIGFsdG9nZXRoZXIsIHJlc3VsdGluZyBpbiBhIGRhdGUgZm9ybWF0LiBJbiBzdWNoIGEgY2FzZSwgdGhlIHRpbWUgcGFydCBpc1xuICAgIC8vIGFzc3VtZWQgdG8gYmUgMDA6MDA6MDBaIChzdGFydCBvZiBkYXksIFVUQykuXG4gICAgdGVzdDogUmVnRXhwKCdeKFswLTldezR9KS0oWzAtOV17MSwyfSktKFswLTldezEsMn0pJyArIC8vIFlZWVktTW0tRGRcbiAgICAgICAgJyg/OicgKyAvLyB0aW1lIGlzIG9wdGlvbmFsXG4gICAgICAgICcoPzp0fFR8WyBcXFxcdF0rKScgKyAvLyB0IHwgVCB8IHdoaXRlc3BhY2VcbiAgICAgICAgJyhbMC05XXsxLDJ9KTooWzAtOV17MSwyfSk6KFswLTldezEsMn0oXFxcXC5bMC05XSspPyknICsgLy8gSGg6TW06U3MoLnNzKT9cbiAgICAgICAgJyg/OlsgXFxcXHRdKihafFstK11bMDEyXT9bMC05XSg/OjpbMC05XXsyfSk/KSk/JyArIC8vIFogfCArNSB8IC0wMzozMFxuICAgICAgICAnKT8kJyksXG4gICAgcmVzb2x2ZShzdHIpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBzdHIubWF0Y2godGltZXN0YW1wLnRlc3QpO1xuICAgICAgICBpZiAoIW1hdGNoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCchIXRpbWVzdGFtcCBleHBlY3RzIGEgZGF0ZSwgc3RhcnRpbmcgd2l0aCB5eXl5LW1tLWRkJyk7XG4gICAgICAgIGNvbnN0IFssIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kXSA9IG1hdGNoLm1hcChOdW1iZXIpO1xuICAgICAgICBjb25zdCBtaWxsaXNlYyA9IG1hdGNoWzddID8gTnVtYmVyKChtYXRjaFs3XSArICcwMCcpLnN1YnN0cigxLCAzKSkgOiAwO1xuICAgICAgICBsZXQgZGF0ZSA9IERhdGUuVVRDKHllYXIsIG1vbnRoIC0gMSwgZGF5LCBob3VyIHx8IDAsIG1pbnV0ZSB8fCAwLCBzZWNvbmQgfHwgMCwgbWlsbGlzZWMpO1xuICAgICAgICBjb25zdCB0eiA9IG1hdGNoWzhdO1xuICAgICAgICBpZiAodHogJiYgdHogIT09ICdaJykge1xuICAgICAgICAgICAgbGV0IGQgPSBwYXJzZVNleGFnZXNpbWFsKHR6LCBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoZCkgPCAzMClcbiAgICAgICAgICAgICAgICBkICo9IDYwO1xuICAgICAgICAgICAgZGF0ZSAtPSA2MDAwMCAqIGQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUpO1xuICAgIH0sXG4gICAgc3RyaW5naWZ5OiAoeyB2YWx1ZSB9KSA9PiB2YWx1ZS50b0lTT1N0cmluZygpLnJlcGxhY2UoLygoVDAwOjAwKT86MDApP1xcLjAwMFokLywgJycpXG59O1xuXG5leHBvcnQgeyBmbG9hdFRpbWUsIGludFRpbWUsIHRpbWVzdGFtcCB9O1xuIiwgImltcG9ydCB7IG1hcCB9IGZyb20gJy4uL2NvbW1vbi9tYXAuanMnO1xuaW1wb3J0IHsgbnVsbFRhZyB9IGZyb20gJy4uL2NvbW1vbi9udWxsLmpzJztcbmltcG9ydCB7IHNlcSB9IGZyb20gJy4uL2NvbW1vbi9zZXEuanMnO1xuaW1wb3J0IHsgc3RyaW5nIH0gZnJvbSAnLi4vY29tbW9uL3N0cmluZy5qcyc7XG5pbXBvcnQgeyBiaW5hcnkgfSBmcm9tICcuL2JpbmFyeS5qcyc7XG5pbXBvcnQgeyB0cnVlVGFnLCBmYWxzZVRhZyB9IGZyb20gJy4vYm9vbC5qcyc7XG5pbXBvcnQgeyBmbG9hdE5hTiwgZmxvYXRFeHAsIGZsb2F0IH0gZnJvbSAnLi9mbG9hdC5qcyc7XG5pbXBvcnQgeyBpbnRCaW4sIGludE9jdCwgaW50LCBpbnRIZXggfSBmcm9tICcuL2ludC5qcyc7XG5pbXBvcnQgeyBvbWFwIH0gZnJvbSAnLi9vbWFwLmpzJztcbmltcG9ydCB7IHBhaXJzIH0gZnJvbSAnLi9wYWlycy5qcyc7XG5pbXBvcnQgeyBzZXQgfSBmcm9tICcuL3NldC5qcyc7XG5pbXBvcnQgeyBpbnRUaW1lLCBmbG9hdFRpbWUsIHRpbWVzdGFtcCB9IGZyb20gJy4vdGltZXN0YW1wLmpzJztcblxuY29uc3Qgc2NoZW1hID0gW1xuICAgIG1hcCxcbiAgICBzZXEsXG4gICAgc3RyaW5nLFxuICAgIG51bGxUYWcsXG4gICAgdHJ1ZVRhZyxcbiAgICBmYWxzZVRhZyxcbiAgICBpbnRCaW4sXG4gICAgaW50T2N0LFxuICAgIGludCxcbiAgICBpbnRIZXgsXG4gICAgZmxvYXROYU4sXG4gICAgZmxvYXRFeHAsXG4gICAgZmxvYXQsXG4gICAgYmluYXJ5LFxuICAgIG9tYXAsXG4gICAgcGFpcnMsXG4gICAgc2V0LFxuICAgIGludFRpbWUsXG4gICAgZmxvYXRUaW1lLFxuICAgIHRpbWVzdGFtcFxuXTtcblxuZXhwb3J0IHsgc2NoZW1hIH07XG4iLCAiaW1wb3J0IHsgbWFwIH0gZnJvbSAnLi9jb21tb24vbWFwLmpzJztcbmltcG9ydCB7IG51bGxUYWcgfSBmcm9tICcuL2NvbW1vbi9udWxsLmpzJztcbmltcG9ydCB7IHNlcSB9IGZyb20gJy4vY29tbW9uL3NlcS5qcyc7XG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tICcuL2NvbW1vbi9zdHJpbmcuanMnO1xuaW1wb3J0IHsgYm9vbFRhZyB9IGZyb20gJy4vY29yZS9ib29sLmpzJztcbmltcG9ydCB7IGZsb2F0LCBmbG9hdEV4cCwgZmxvYXROYU4gfSBmcm9tICcuL2NvcmUvZmxvYXQuanMnO1xuaW1wb3J0IHsgaW50LCBpbnRIZXgsIGludE9jdCB9IGZyb20gJy4vY29yZS9pbnQuanMnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi9jb3JlL3NjaGVtYS5qcyc7XG5pbXBvcnQgeyBzY2hlbWEgYXMgc2NoZW1hJDEgfSBmcm9tICcuL2pzb24vc2NoZW1hLmpzJztcbmltcG9ydCB7IGJpbmFyeSB9IGZyb20gJy4veWFtbC0xLjEvYmluYXJ5LmpzJztcbmltcG9ydCB7IG9tYXAgfSBmcm9tICcuL3lhbWwtMS4xL29tYXAuanMnO1xuaW1wb3J0IHsgcGFpcnMgfSBmcm9tICcuL3lhbWwtMS4xL3BhaXJzLmpzJztcbmltcG9ydCB7IHNjaGVtYSBhcyBzY2hlbWEkMiB9IGZyb20gJy4veWFtbC0xLjEvc2NoZW1hLmpzJztcbmltcG9ydCB7IHNldCB9IGZyb20gJy4veWFtbC0xLjEvc2V0LmpzJztcbmltcG9ydCB7IGZsb2F0VGltZSwgaW50VGltZSwgdGltZXN0YW1wIH0gZnJvbSAnLi95YW1sLTEuMS90aW1lc3RhbXAuanMnO1xuXG5jb25zdCBzY2hlbWFzID0gbmV3IE1hcChbXG4gICAgWydjb3JlJywgc2NoZW1hXSxcbiAgICBbJ2ZhaWxzYWZlJywgW21hcCwgc2VxLCBzdHJpbmddXSxcbiAgICBbJ2pzb24nLCBzY2hlbWEkMV0sXG4gICAgWyd5YW1sMTEnLCBzY2hlbWEkMl0sXG4gICAgWyd5YW1sLTEuMScsIHNjaGVtYSQyXVxuXSk7XG5jb25zdCB0YWdzQnlOYW1lID0ge1xuICAgIGJpbmFyeSxcbiAgICBib29sOiBib29sVGFnLFxuICAgIGZsb2F0LFxuICAgIGZsb2F0RXhwLFxuICAgIGZsb2F0TmFOLFxuICAgIGZsb2F0VGltZSxcbiAgICBpbnQsXG4gICAgaW50SGV4LFxuICAgIGludE9jdCxcbiAgICBpbnRUaW1lLFxuICAgIG1hcCxcbiAgICBudWxsOiBudWxsVGFnLFxuICAgIG9tYXAsXG4gICAgcGFpcnMsXG4gICAgc2VxLFxuICAgIHNldCxcbiAgICB0aW1lc3RhbXBcbn07XG5jb25zdCBjb3JlS25vd25UYWdzID0ge1xuICAgICd0YWc6eWFtbC5vcmcsMjAwMjpiaW5hcnknOiBiaW5hcnksXG4gICAgJ3RhZzp5YW1sLm9yZywyMDAyOm9tYXAnOiBvbWFwLFxuICAgICd0YWc6eWFtbC5vcmcsMjAwMjpwYWlycyc6IHBhaXJzLFxuICAgICd0YWc6eWFtbC5vcmcsMjAwMjpzZXQnOiBzZXQsXG4gICAgJ3RhZzp5YW1sLm9yZywyMDAyOnRpbWVzdGFtcCc6IHRpbWVzdGFtcFxufTtcbmZ1bmN0aW9uIGdldFRhZ3MoY3VzdG9tVGFncywgc2NoZW1hTmFtZSkge1xuICAgIGxldCB0YWdzID0gc2NoZW1hcy5nZXQoc2NoZW1hTmFtZSk7XG4gICAgaWYgKCF0YWdzKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1c3RvbVRhZ3MpKVxuICAgICAgICAgICAgdGFncyA9IFtdO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBBcnJheS5mcm9tKHNjaGVtYXMua2V5cygpKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoa2V5ID0+IGtleSAhPT0gJ3lhbWwxMScpXG4gICAgICAgICAgICAgICAgLm1hcChrZXkgPT4gSlNPTi5zdHJpbmdpZnkoa2V5KSlcbiAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzY2hlbWEgXCIke3NjaGVtYU5hbWV9XCI7IHVzZSBvbmUgb2YgJHtrZXlzfSBvciBkZWZpbmUgY3VzdG9tVGFncyBhcnJheWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGN1c3RvbVRhZ3MpKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGFnIG9mIGN1c3RvbVRhZ3MpXG4gICAgICAgICAgICB0YWdzID0gdGFncy5jb25jYXQodGFnKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGN1c3RvbVRhZ3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGFncyA9IGN1c3RvbVRhZ3ModGFncy5zbGljZSgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhZ3MubWFwKHRhZyA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdGFnICE9PSAnc3RyaW5nJylcbiAgICAgICAgICAgIHJldHVybiB0YWc7XG4gICAgICAgIGNvbnN0IHRhZ09iaiA9IHRhZ3NCeU5hbWVbdGFnXTtcbiAgICAgICAgaWYgKHRhZ09iailcbiAgICAgICAgICAgIHJldHVybiB0YWdPYmo7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0YWdzQnlOYW1lKVxuICAgICAgICAgICAgLm1hcChrZXkgPT4gSlNPTi5zdHJpbmdpZnkoa2V5KSlcbiAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY3VzdG9tIHRhZyBcIiR7dGFnfVwiOyB1c2Ugb25lIG9mICR7a2V5c31gKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IHsgY29yZUtub3duVGFncywgZ2V0VGFncyB9O1xuIiwgImltcG9ydCB7IE1BUCwgU0NBTEFSLCBTRVEgfSBmcm9tICcuLi9ub2Rlcy9Ob2RlLmpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJy4vY29tbW9uL21hcC5qcyc7XG5pbXBvcnQgeyBzZXEgfSBmcm9tICcuL2NvbW1vbi9zZXEuanMnO1xuaW1wb3J0IHsgc3RyaW5nIH0gZnJvbSAnLi9jb21tb24vc3RyaW5nLmpzJztcbmltcG9ydCB7IGdldFRhZ3MsIGNvcmVLbm93blRhZ3MgfSBmcm9tICcuL3RhZ3MuanMnO1xuXG5jb25zdCBzb3J0TWFwRW50cmllc0J5S2V5ID0gKGEsIGIpID0+IGEua2V5IDwgYi5rZXkgPyAtMSA6IGEua2V5ID4gYi5rZXkgPyAxIDogMDtcbmNsYXNzIFNjaGVtYSB7XG4gICAgY29uc3RydWN0b3IoeyBjb21wYXQsIGN1c3RvbVRhZ3MsIG1lcmdlLCByZXNvbHZlS25vd25UYWdzLCBzY2hlbWEsIHNvcnRNYXBFbnRyaWVzLCB0b1N0cmluZ0RlZmF1bHRzIH0pIHtcbiAgICAgICAgdGhpcy5jb21wYXQgPSBBcnJheS5pc0FycmF5KGNvbXBhdClcbiAgICAgICAgICAgID8gZ2V0VGFncyhjb21wYXQsICdjb21wYXQnKVxuICAgICAgICAgICAgOiBjb21wYXRcbiAgICAgICAgICAgICAgICA/IGdldFRhZ3MobnVsbCwgY29tcGF0KVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgdGhpcy5tZXJnZSA9ICEhbWVyZ2U7XG4gICAgICAgIHRoaXMubmFtZSA9ICh0eXBlb2Ygc2NoZW1hID09PSAnc3RyaW5nJyAmJiBzY2hlbWEpIHx8ICdjb3JlJztcbiAgICAgICAgdGhpcy5rbm93blRhZ3MgPSByZXNvbHZlS25vd25UYWdzID8gY29yZUtub3duVGFncyA6IHt9O1xuICAgICAgICB0aGlzLnRhZ3MgPSBnZXRUYWdzKGN1c3RvbVRhZ3MsIHRoaXMubmFtZSk7XG4gICAgICAgIHRoaXMudG9TdHJpbmdPcHRpb25zID0gdG9TdHJpbmdEZWZhdWx0cyA/PyBudWxsO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgTUFQLCB7IHZhbHVlOiBtYXAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBTQ0FMQVIsIHsgdmFsdWU6IHN0cmluZyB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFNFUSwgeyB2YWx1ZTogc2VxIH0pO1xuICAgICAgICAvLyBVc2VkIGJ5IGNyZWF0ZU1hcCgpXG4gICAgICAgIHRoaXMuc29ydE1hcEVudHJpZXMgPVxuICAgICAgICAgICAgdHlwZW9mIHNvcnRNYXBFbnRyaWVzID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAgICAgPyBzb3J0TWFwRW50cmllc1xuICAgICAgICAgICAgICAgIDogc29ydE1hcEVudHJpZXMgPT09IHRydWVcbiAgICAgICAgICAgICAgICAgICAgPyBzb3J0TWFwRW50cmllc0J5S2V5XG4gICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IGNvcHkgPSBPYmplY3QuY3JlYXRlKFNjaGVtYS5wcm90b3R5cGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHRoaXMpKTtcbiAgICAgICAgY29weS50YWdzID0gdGhpcy50YWdzLnNsaWNlKCk7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbn1cblxuZXhwb3J0IHsgU2NoZW1hIH07XG4iLCAiaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSAnLi4vbm9kZXMvTm9kZS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTdHJpbmdpZnlDb250ZXh0LCBzdHJpbmdpZnkgfSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5pbXBvcnQgeyBpbmRlbnRDb21tZW50LCBsaW5lQ29tbWVudCB9IGZyb20gJy4vc3RyaW5naWZ5Q29tbWVudC5qcyc7XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeURvY3VtZW50KGRvYywgb3B0aW9ucykge1xuICAgIGNvbnN0IGxpbmVzID0gW107XG4gICAgbGV0IGhhc0RpcmVjdGl2ZXMgPSBvcHRpb25zLmRpcmVjdGl2ZXMgPT09IHRydWU7XG4gICAgaWYgKG9wdGlvbnMuZGlyZWN0aXZlcyAhPT0gZmFsc2UgJiYgZG9jLmRpcmVjdGl2ZXMpIHtcbiAgICAgICAgY29uc3QgZGlyID0gZG9jLmRpcmVjdGl2ZXMudG9TdHJpbmcoZG9jKTtcbiAgICAgICAgaWYgKGRpcikge1xuICAgICAgICAgICAgbGluZXMucHVzaChkaXIpO1xuICAgICAgICAgICAgaGFzRGlyZWN0aXZlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZG9jLmRpcmVjdGl2ZXMuZG9jU3RhcnQpXG4gICAgICAgICAgICBoYXNEaXJlY3RpdmVzID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGhhc0RpcmVjdGl2ZXMpXG4gICAgICAgIGxpbmVzLnB1c2goJy0tLScpO1xuICAgIGNvbnN0IGN0eCA9IGNyZWF0ZVN0cmluZ2lmeUNvbnRleHQoZG9jLCBvcHRpb25zKTtcbiAgICBjb25zdCB7IGNvbW1lbnRTdHJpbmcgfSA9IGN0eC5vcHRpb25zO1xuICAgIGlmIChkb2MuY29tbWVudEJlZm9yZSkge1xuICAgICAgICBpZiAobGluZXMubGVuZ3RoICE9PSAxKVxuICAgICAgICAgICAgbGluZXMudW5zaGlmdCgnJyk7XG4gICAgICAgIGNvbnN0IGNzID0gY29tbWVudFN0cmluZyhkb2MuY29tbWVudEJlZm9yZSk7XG4gICAgICAgIGxpbmVzLnVuc2hpZnQoaW5kZW50Q29tbWVudChjcywgJycpKTtcbiAgICB9XG4gICAgbGV0IGNob21wS2VlcCA9IGZhbHNlO1xuICAgIGxldCBjb250ZW50Q29tbWVudCA9IG51bGw7XG4gICAgaWYgKGRvYy5jb250ZW50cykge1xuICAgICAgICBpZiAoaXNOb2RlKGRvYy5jb250ZW50cykpIHtcbiAgICAgICAgICAgIGlmIChkb2MuY29udGVudHMuc3BhY2VCZWZvcmUgJiYgaGFzRGlyZWN0aXZlcylcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgICAgICAgIGlmIChkb2MuY29udGVudHMuY29tbWVudEJlZm9yZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNzID0gY29tbWVudFN0cmluZyhkb2MuY29udGVudHMuY29tbWVudEJlZm9yZSk7XG4gICAgICAgICAgICAgICAgbGluZXMucHVzaChpbmRlbnRDb21tZW50KGNzLCAnJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdG9wLWxldmVsIGJsb2NrIHNjYWxhcnMgbmVlZCB0byBiZSBpbmRlbnRlZCBpZiBmb2xsb3dlZCBieSBhIGNvbW1lbnRcbiAgICAgICAgICAgIGN0eC5mb3JjZUJsb2NrSW5kZW50ID0gISFkb2MuY29tbWVudDtcbiAgICAgICAgICAgIGNvbnRlbnRDb21tZW50ID0gZG9jLmNvbnRlbnRzLmNvbW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb25DaG9tcEtlZXAgPSBjb250ZW50Q29tbWVudCA/IHVuZGVmaW5lZCA6ICgpID0+IChjaG9tcEtlZXAgPSB0cnVlKTtcbiAgICAgICAgbGV0IGJvZHkgPSBzdHJpbmdpZnkoZG9jLmNvbnRlbnRzLCBjdHgsICgpID0+IChjb250ZW50Q29tbWVudCA9IG51bGwpLCBvbkNob21wS2VlcCk7XG4gICAgICAgIGlmIChjb250ZW50Q29tbWVudClcbiAgICAgICAgICAgIGJvZHkgKz0gbGluZUNvbW1lbnQoYm9keSwgJycsIGNvbW1lbnRTdHJpbmcoY29udGVudENvbW1lbnQpKTtcbiAgICAgICAgaWYgKChib2R5WzBdID09PSAnfCcgfHwgYm9keVswXSA9PT0gJz4nKSAmJlxuICAgICAgICAgICAgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPT09ICctLS0nKSB7XG4gICAgICAgICAgICAvLyBUb3AtbGV2ZWwgYmxvY2sgc2NhbGFycyB3aXRoIGEgcHJlY2VkaW5nIGRvYyBtYXJrZXIgb3VnaHQgdG8gdXNlIHRoZVxuICAgICAgICAgICAgLy8gc2FtZSBsaW5lIGZvciB0aGVpciBoZWFkZXIuXG4gICAgICAgICAgICBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9IGAtLS0gJHtib2R5fWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGluZXMucHVzaChib2R5KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxpbmVzLnB1c2goc3RyaW5naWZ5KGRvYy5jb250ZW50cywgY3R4KSk7XG4gICAgfVxuICAgIGlmIChkb2MuZGlyZWN0aXZlcz8uZG9jRW5kKSB7XG4gICAgICAgIGlmIChkb2MuY29tbWVudCkge1xuICAgICAgICAgICAgY29uc3QgY3MgPSBjb21tZW50U3RyaW5nKGRvYy5jb21tZW50KTtcbiAgICAgICAgICAgIGlmIChjcy5pbmNsdWRlcygnXFxuJykpIHtcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKCcuLi4nKTtcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKGluZGVudENvbW1lbnQoY3MsICcnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKGAuLi4gJHtjc31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goJy4uLicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgZGMgPSBkb2MuY29tbWVudDtcbiAgICAgICAgaWYgKGRjICYmIGNob21wS2VlcClcbiAgICAgICAgICAgIGRjID0gZGMucmVwbGFjZSgvXlxcbisvLCAnJyk7XG4gICAgICAgIGlmIChkYykge1xuICAgICAgICAgICAgaWYgKCghY2hvbXBLZWVwIHx8IGNvbnRlbnRDb21tZW50KSAmJiBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSAhPT0gJycpXG4gICAgICAgICAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGluZGVudENvbW1lbnQoY29tbWVudFN0cmluZyhkYyksICcnKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpICsgJ1xcbic7XG59XG5cbmV4cG9ydCB7IHN0cmluZ2lmeURvY3VtZW50IH07XG4iLCAiLyoqXG4gKiBBcHBsaWVzIHRoZSBKU09OLnBhcnNlIHJldml2ZXIgYWxnb3JpdGhtIGFzIGRlZmluZWQgaW4gdGhlIEVDTUEtMjYyIHNwZWMsXG4gKiBpbiBzZWN0aW9uIDI0LjUuMS4xIFwiUnVudGltZSBTZW1hbnRpY3M6IEludGVybmFsaXplSlNPTlByb3BlcnR5XCIgb2YgdGhlXG4gKiAyMDIxIGVkaXRpb246IGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtanNvbi5wYXJzZVxuICpcbiAqIEluY2x1ZGVzIGV4dGVuc2lvbnMgZm9yIGhhbmRsaW5nIE1hcCBhbmQgU2V0IG9iamVjdHMuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5UmV2aXZlcihyZXZpdmVyLCBvYmosIGtleSwgdmFsKSB7XG4gICAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdmFsLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdjAgPSB2YWxbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgdjEgPSBhcHBseVJldml2ZXIocmV2aXZlciwgdmFsLCBTdHJpbmcoaSksIHYwKTtcbiAgICAgICAgICAgICAgICBpZiAodjEgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHZhbFtpXTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2MSAhPT0gdjApXG4gICAgICAgICAgICAgICAgICAgIHZhbFtpXSA9IHYxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrIG9mIEFycmF5LmZyb20odmFsLmtleXMoKSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2MCA9IHZhbC5nZXQoayk7XG4gICAgICAgICAgICAgICAgY29uc3QgdjEgPSBhcHBseVJldml2ZXIocmV2aXZlciwgdmFsLCBrLCB2MCk7XG4gICAgICAgICAgICAgICAgaWYgKHYxID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHZhbC5kZWxldGUoayk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodjEgIT09IHYwKVxuICAgICAgICAgICAgICAgICAgICB2YWwuc2V0KGssIHYxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdjAgb2YgQXJyYXkuZnJvbSh2YWwpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdjEgPSBhcHBseVJldml2ZXIocmV2aXZlciwgdmFsLCB2MCwgdjApO1xuICAgICAgICAgICAgICAgIGlmICh2MSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB2YWwuZGVsZXRlKHYwKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2MSAhPT0gdjApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsLmRlbGV0ZSh2MCk7XG4gICAgICAgICAgICAgICAgICAgIHZhbC5hZGQodjEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIHYwXSBvZiBPYmplY3QuZW50cmllcyh2YWwpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdjEgPSBhcHBseVJldml2ZXIocmV2aXZlciwgdmFsLCBrLCB2MCk7XG4gICAgICAgICAgICAgICAgaWYgKHYxID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWxba107XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodjEgIT09IHYwKVxuICAgICAgICAgICAgICAgICAgICB2YWxba10gPSB2MTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV2aXZlci5jYWxsKG9iaiwga2V5LCB2YWwpO1xufVxuXG5leHBvcnQgeyBhcHBseVJldml2ZXIgfTtcbiIsICJpbXBvcnQgeyBBbGlhcyB9IGZyb20gJy4uL25vZGVzL0FsaWFzLmpzJztcbmltcG9ydCB7IGlzRW1wdHlQYXRoLCBjb2xsZWN0aW9uRnJvbVBhdGggfSBmcm9tICcuLi9ub2Rlcy9Db2xsZWN0aW9uLmpzJztcbmltcG9ydCB7IE5PREVfVFlQRSwgRE9DLCBpc05vZGUsIGlzQ29sbGVjdGlvbiwgaXNTY2FsYXIgfSBmcm9tICcuLi9ub2Rlcy9Ob2RlLmpzJztcbmltcG9ydCB7IFBhaXIgfSBmcm9tICcuLi9ub2Rlcy9QYWlyLmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuLi9ub2Rlcy90b0pTLmpzJztcbmltcG9ydCB7IFNjaGVtYSB9IGZyb20gJy4uL3NjaGVtYS9TY2hlbWEuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5IH0gZnJvbSAnLi4vc3RyaW5naWZ5L3N0cmluZ2lmeS5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlEb2N1bWVudCB9IGZyb20gJy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlEb2N1bWVudC5qcyc7XG5pbXBvcnQgeyBhbmNob3JOYW1lcywgZmluZE5ld0FuY2hvciwgY3JlYXRlTm9kZUFuY2hvcnMgfSBmcm9tICcuL2FuY2hvcnMuanMnO1xuaW1wb3J0IHsgYXBwbHlSZXZpdmVyIH0gZnJvbSAnLi9hcHBseVJldml2ZXIuanMnO1xuaW1wb3J0IHsgY3JlYXRlTm9kZSB9IGZyb20gJy4vY3JlYXRlTm9kZS5qcyc7XG5pbXBvcnQgeyBEaXJlY3RpdmVzIH0gZnJvbSAnLi9kaXJlY3RpdmVzLmpzJztcblxuY2xhc3MgRG9jdW1lbnQge1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlLCByZXBsYWNlciwgb3B0aW9ucykge1xuICAgICAgICAvKiogQSBjb21tZW50IGJlZm9yZSB0aGlzIERvY3VtZW50ICovXG4gICAgICAgIHRoaXMuY29tbWVudEJlZm9yZSA9IG51bGw7XG4gICAgICAgIC8qKiBBIGNvbW1lbnQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBEb2N1bWVudCAqL1xuICAgICAgICB0aGlzLmNvbW1lbnQgPSBudWxsO1xuICAgICAgICAvKiogRXJyb3JzIGVuY291bnRlcmVkIGR1cmluZyBwYXJzaW5nLiAqL1xuICAgICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgICAgICAvKiogV2FybmluZ3MgZW5jb3VudGVyZWQgZHVyaW5nIHBhcnNpbmcuICovXG4gICAgICAgIHRoaXMud2FybmluZ3MgPSBbXTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIE5PREVfVFlQRSwgeyB2YWx1ZTogRE9DIH0pO1xuICAgICAgICBsZXQgX3JlcGxhY2VyID0gbnVsbDtcbiAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlciA9PT0gJ2Z1bmN0aW9uJyB8fCBBcnJheS5pc0FycmF5KHJlcGxhY2VyKSkge1xuICAgICAgICAgICAgX3JlcGxhY2VyID0gcmVwbGFjZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkICYmIHJlcGxhY2VyKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gcmVwbGFjZXI7XG4gICAgICAgICAgICByZXBsYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHQgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIGludEFzQmlnSW50OiBmYWxzZSxcbiAgICAgICAgICAgIGtlZXBTb3VyY2VUb2tlbnM6IGZhbHNlLFxuICAgICAgICAgICAgbG9nTGV2ZWw6ICd3YXJuJyxcbiAgICAgICAgICAgIHByZXR0eUVycm9yczogdHJ1ZSxcbiAgICAgICAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICAgICAgICAgIHVuaXF1ZUtleXM6IHRydWUsXG4gICAgICAgICAgICB2ZXJzaW9uOiAnMS4yJ1xuICAgICAgICB9LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0O1xuICAgICAgICBsZXQgeyB2ZXJzaW9uIH0gPSBvcHQ7XG4gICAgICAgIGlmIChvcHRpb25zPy5fZGlyZWN0aXZlcykge1xuICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gb3B0aW9ucy5fZGlyZWN0aXZlcy5hdERvY3VtZW50KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5kaXJlY3RpdmVzLnlhbWwuZXhwbGljaXQpXG4gICAgICAgICAgICAgICAgdmVyc2lvbiA9IHRoaXMuZGlyZWN0aXZlcy55YW1sLnZlcnNpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gbmV3IERpcmVjdGl2ZXMoeyB2ZXJzaW9uIH0pO1xuICAgICAgICB0aGlzLnNldFNjaGVtYSh2ZXJzaW9uLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzID0gbnVsbDtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzID0gdGhpcy5jcmVhdGVOb2RlKHZhbHVlLCBfcmVwbGFjZXIsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGRlZXAgY29weSBvZiB0aGlzIERvY3VtZW50IGFuZCBpdHMgY29udGVudHMuXG4gICAgICpcbiAgICAgKiBDdXN0b20gTm9kZSB2YWx1ZXMgdGhhdCBpbmhlcml0IGZyb20gYE9iamVjdGAgc3RpbGwgcmVmZXIgdG8gdGhlaXIgb3JpZ2luYWwgaW5zdGFuY2VzLlxuICAgICAqL1xuICAgIGNsb25lKCkge1xuICAgICAgICBjb25zdCBjb3B5ID0gT2JqZWN0LmNyZWF0ZShEb2N1bWVudC5wcm90b3R5cGUsIHtcbiAgICAgICAgICAgIFtOT0RFX1RZUEVdOiB7IHZhbHVlOiBET0MgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29weS5jb21tZW50QmVmb3JlID0gdGhpcy5jb21tZW50QmVmb3JlO1xuICAgICAgICBjb3B5LmNvbW1lbnQgPSB0aGlzLmNvbW1lbnQ7XG4gICAgICAgIGNvcHkuZXJyb3JzID0gdGhpcy5lcnJvcnMuc2xpY2UoKTtcbiAgICAgICAgY29weS53YXJuaW5ncyA9IHRoaXMud2FybmluZ3Muc2xpY2UoKTtcbiAgICAgICAgY29weS5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgaWYgKHRoaXMuZGlyZWN0aXZlcylcbiAgICAgICAgICAgIGNvcHkuZGlyZWN0aXZlcyA9IHRoaXMuZGlyZWN0aXZlcy5jbG9uZSgpO1xuICAgICAgICBjb3B5LnNjaGVtYSA9IHRoaXMuc2NoZW1hLmNsb25lKCk7XG4gICAgICAgIGNvcHkuY29udGVudHMgPSBpc05vZGUodGhpcy5jb250ZW50cylcbiAgICAgICAgICAgID8gdGhpcy5jb250ZW50cy5jbG9uZShjb3B5LnNjaGVtYSlcbiAgICAgICAgICAgIDogdGhpcy5jb250ZW50cztcbiAgICAgICAgaWYgKHRoaXMucmFuZ2UpXG4gICAgICAgICAgICBjb3B5LnJhbmdlID0gdGhpcy5yYW5nZS5zbGljZSgpO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gICAgLyoqIEFkZHMgYSB2YWx1ZSB0byB0aGUgZG9jdW1lbnQuICovXG4gICAgYWRkKHZhbHVlKSB7XG4gICAgICAgIGlmIChhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpKVxuICAgICAgICAgICAgdGhpcy5jb250ZW50cy5hZGQodmFsdWUpO1xuICAgIH1cbiAgICAvKiogQWRkcyBhIHZhbHVlIHRvIHRoZSBkb2N1bWVudC4gKi9cbiAgICBhZGRJbihwYXRoLCB2YWx1ZSkge1xuICAgICAgICBpZiAoYXNzZXJ0Q29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKSlcbiAgICAgICAgICAgIHRoaXMuY29udGVudHMuYWRkSW4ocGF0aCwgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgYEFsaWFzYCBub2RlLCBlbnN1cmluZyB0aGF0IHRoZSB0YXJnZXQgYG5vZGVgIGhhcyB0aGUgcmVxdWlyZWQgYW5jaG9yLlxuICAgICAqXG4gICAgICogSWYgYG5vZGVgIGFscmVhZHkgaGFzIGFuIGFuY2hvciwgYG5hbWVgIGlzIGlnbm9yZWQuXG4gICAgICogT3RoZXJ3aXNlLCB0aGUgYG5vZGUuYW5jaG9yYCB2YWx1ZSB3aWxsIGJlIHNldCB0byBgbmFtZWAsXG4gICAgICogb3IgaWYgYW4gYW5jaG9yIHdpdGggdGhhdCBuYW1lIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgZG9jdW1lbnQsXG4gICAgICogYG5hbWVgIHdpbGwgYmUgdXNlZCBhcyBhIHByZWZpeCBmb3IgYSBuZXcgdW5pcXVlIGFuY2hvci5cbiAgICAgKiBJZiBgbmFtZWAgaXMgdW5kZWZpbmVkLCB0aGUgZ2VuZXJhdGVkIGFuY2hvciB3aWxsIHVzZSAnYScgYXMgYSBwcmVmaXguXG4gICAgICovXG4gICAgY3JlYXRlQWxpYXMobm9kZSwgbmFtZSkge1xuICAgICAgICBpZiAoIW5vZGUuYW5jaG9yKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2ID0gYW5jaG9yTmFtZXModGhpcyk7XG4gICAgICAgICAgICBub2RlLmFuY2hvciA9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgICAgICAgICAgICAgIW5hbWUgfHwgcHJldi5oYXMobmFtZSkgPyBmaW5kTmV3QW5jaG9yKG5hbWUgfHwgJ2EnLCBwcmV2KSA6IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBBbGlhcyhub2RlLmFuY2hvcik7XG4gICAgfVxuICAgIGNyZWF0ZU5vZGUodmFsdWUsIHJlcGxhY2VyLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBfcmVwbGFjZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhbHVlID0gcmVwbGFjZXIuY2FsbCh7ICcnOiB2YWx1ZSB9LCAnJywgdmFsdWUpO1xuICAgICAgICAgICAgX3JlcGxhY2VyID0gcmVwbGFjZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXBsYWNlcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleVRvU3RyID0gKHYpID0+IHR5cGVvZiB2ID09PSAnbnVtYmVyJyB8fCB2IGluc3RhbmNlb2YgU3RyaW5nIHx8IHYgaW5zdGFuY2VvZiBOdW1iZXI7XG4gICAgICAgICAgICBjb25zdCBhc1N0ciA9IHJlcGxhY2VyLmZpbHRlcihrZXlUb1N0cikubWFwKFN0cmluZyk7XG4gICAgICAgICAgICBpZiAoYXNTdHIubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICByZXBsYWNlciA9IHJlcGxhY2VyLmNvbmNhdChhc1N0cik7XG4gICAgICAgICAgICBfcmVwbGFjZXIgPSByZXBsYWNlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQgJiYgcmVwbGFjZXIpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSByZXBsYWNlcjtcbiAgICAgICAgICAgIHJlcGxhY2VyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgYWxpYXNEdXBsaWNhdGVPYmplY3RzLCBhbmNob3JQcmVmaXgsIGZsb3csIGtlZXBVbmRlZmluZWQsIG9uVGFnT2JqLCB0YWcgfSA9IG9wdGlvbnMgPz8ge307XG4gICAgICAgIGNvbnN0IHsgb25BbmNob3IsIHNldEFuY2hvcnMsIHNvdXJjZU9iamVjdHMgfSA9IGNyZWF0ZU5vZGVBbmNob3JzKHRoaXMsIFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICAgICAgYW5jaG9yUHJlZml4IHx8ICdhJyk7XG4gICAgICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgICAgIGFsaWFzRHVwbGljYXRlT2JqZWN0czogYWxpYXNEdXBsaWNhdGVPYmplY3RzID8/IHRydWUsXG4gICAgICAgICAgICBrZWVwVW5kZWZpbmVkOiBrZWVwVW5kZWZpbmVkID8/IGZhbHNlLFxuICAgICAgICAgICAgb25BbmNob3IsXG4gICAgICAgICAgICBvblRhZ09iaixcbiAgICAgICAgICAgIHJlcGxhY2VyOiBfcmVwbGFjZXIsXG4gICAgICAgICAgICBzY2hlbWE6IHRoaXMuc2NoZW1hLFxuICAgICAgICAgICAgc291cmNlT2JqZWN0c1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBub2RlID0gY3JlYXRlTm9kZSh2YWx1ZSwgdGFnLCBjdHgpO1xuICAgICAgICBpZiAoZmxvdyAmJiBpc0NvbGxlY3Rpb24obm9kZSkpXG4gICAgICAgICAgICBub2RlLmZsb3cgPSB0cnVlO1xuICAgICAgICBzZXRBbmNob3JzKCk7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGEga2V5IGFuZCBhIHZhbHVlIGludG8gYSBgUGFpcmAgdXNpbmcgdGhlIGN1cnJlbnQgc2NoZW1hLFxuICAgICAqIHJlY3Vyc2l2ZWx5IHdyYXBwaW5nIGFsbCB2YWx1ZXMgYXMgYFNjYWxhcmAgb3IgYENvbGxlY3Rpb25gIG5vZGVzLlxuICAgICAqL1xuICAgIGNyZWF0ZVBhaXIoa2V5LCB2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGsgPSB0aGlzLmNyZWF0ZU5vZGUoa2V5LCBudWxsLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgdiA9IHRoaXMuY3JlYXRlTm9kZSh2YWx1ZSwgbnVsbCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBuZXcgUGFpcihrLCB2KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHZhbHVlIGZyb20gdGhlIGRvY3VtZW50LlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgaXRlbSB3YXMgZm91bmQgYW5kIHJlbW92ZWQuXG4gICAgICovXG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gYXNzZXJ0Q29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKSA/IHRoaXMuY29udGVudHMuZGVsZXRlKGtleSkgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHZhbHVlIGZyb20gdGhlIGRvY3VtZW50LlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgaXRlbSB3YXMgZm91bmQgYW5kIHJlbW92ZWQuXG4gICAgICovXG4gICAgZGVsZXRlSW4ocGF0aCkge1xuICAgICAgICBpZiAoaXNFbXB0eVBhdGgocGF0aCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRzID09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jb250ZW50cyA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXNzZXJ0Q29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKVxuICAgICAgICAgICAgPyB0aGlzLmNvbnRlbnRzLmRlbGV0ZUluKHBhdGgpXG4gICAgICAgICAgICA6IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGl0ZW0gYXQgYGtleWAsIG9yIGB1bmRlZmluZWRgIGlmIG5vdCBmb3VuZC4gQnkgZGVmYXVsdCB1bndyYXBzXG4gICAgICogc2NhbGFyIHZhbHVlcyBmcm9tIHRoZWlyIHN1cnJvdW5kaW5nIG5vZGU7IHRvIGRpc2FibGUgc2V0IGBrZWVwU2NhbGFyYCB0b1xuICAgICAqIGB0cnVlYCAoY29sbGVjdGlvbnMgYXJlIGFsd2F5cyByZXR1cm5lZCBpbnRhY3QpLlxuICAgICAqL1xuICAgIGdldChrZXksIGtlZXBTY2FsYXIpIHtcbiAgICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKVxuICAgICAgICAgICAgPyB0aGlzLmNvbnRlbnRzLmdldChrZXksIGtlZXBTY2FsYXIpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpdGVtIGF0IGBwYXRoYCwgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kLiBCeSBkZWZhdWx0IHVud3JhcHNcbiAgICAgKiBzY2FsYXIgdmFsdWVzIGZyb20gdGhlaXIgc3Vycm91bmRpbmcgbm9kZTsgdG8gZGlzYWJsZSBzZXQgYGtlZXBTY2FsYXJgIHRvXG4gICAgICogYHRydWVgIChjb2xsZWN0aW9ucyBhcmUgYWx3YXlzIHJldHVybmVkIGludGFjdCkuXG4gICAgICovXG4gICAgZ2V0SW4ocGF0aCwga2VlcFNjYWxhcikge1xuICAgICAgICBpZiAoaXNFbXB0eVBhdGgocGF0aCkpXG4gICAgICAgICAgICByZXR1cm4gIWtlZXBTY2FsYXIgJiYgaXNTY2FsYXIodGhpcy5jb250ZW50cylcbiAgICAgICAgICAgICAgICA/IHRoaXMuY29udGVudHMudmFsdWVcbiAgICAgICAgICAgICAgICA6IHRoaXMuY29udGVudHM7XG4gICAgICAgIHJldHVybiBpc0NvbGxlY3Rpb24odGhpcy5jb250ZW50cylcbiAgICAgICAgICAgID8gdGhpcy5jb250ZW50cy5nZXRJbihwYXRoLCBrZWVwU2NhbGFyKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZG9jdW1lbnQgaW5jbHVkZXMgYSB2YWx1ZSB3aXRoIHRoZSBrZXkgYGtleWAuXG4gICAgICovXG4gICAgaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gaXNDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpID8gdGhpcy5jb250ZW50cy5oYXMoa2V5KSA6IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGRvY3VtZW50IGluY2x1ZGVzIGEgdmFsdWUgYXQgYHBhdGhgLlxuICAgICAqL1xuICAgIGhhc0luKHBhdGgpIHtcbiAgICAgICAgaWYgKGlzRW1wdHlQYXRoKHBhdGgpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudHMgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKSA/IHRoaXMuY29udGVudHMuaGFzSW4ocGF0aCkgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIGluIHRoaXMgZG9jdW1lbnQuIEZvciBgISFzZXRgLCBgdmFsdWVgIG5lZWRzIHRvIGJlIGFcbiAgICAgKiBib29sZWFuIHRvIGFkZC9yZW1vdmUgdGhlIGl0ZW0gZnJvbSB0aGUgc2V0LlxuICAgICAqL1xuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRzID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudHMgPSBjb2xsZWN0aW9uRnJvbVBhdGgodGhpcy5zY2hlbWEsIFtrZXldLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXNzZXJ0Q29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50cy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIGluIHRoaXMgZG9jdW1lbnQuIEZvciBgISFzZXRgLCBgdmFsdWVgIG5lZWRzIHRvIGJlIGFcbiAgICAgKiBib29sZWFuIHRvIGFkZC9yZW1vdmUgdGhlIGl0ZW0gZnJvbSB0aGUgc2V0LlxuICAgICAqL1xuICAgIHNldEluKHBhdGgsIHZhbHVlKSB7XG4gICAgICAgIGlmIChpc0VtcHR5UGF0aChwYXRoKSlcbiAgICAgICAgICAgIHRoaXMuY29udGVudHMgPSB2YWx1ZTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy5jb250ZW50cyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzID0gY29sbGVjdGlvbkZyb21QYXRoKHRoaXMuc2NoZW1hLCBBcnJheS5mcm9tKHBhdGgpLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXNzZXJ0Q29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50cy5zZXRJbihwYXRoLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBZQU1MIHZlcnNpb24gYW5kIHNjaGVtYSB1c2VkIGJ5IHRoZSBkb2N1bWVudC5cbiAgICAgKiBBIGBudWxsYCB2ZXJzaW9uIGRpc2FibGVzIHN1cHBvcnQgZm9yIGRpcmVjdGl2ZXMsIGV4cGxpY2l0IHRhZ3MsIGFuY2hvcnMsIGFuZCBhbGlhc2VzLlxuICAgICAqIEl0IGFsc28gcmVxdWlyZXMgdGhlIGBzY2hlbWFgIG9wdGlvbiB0byBiZSBnaXZlbiBhcyBhIGBTY2hlbWFgIGluc3RhbmNlIHZhbHVlLlxuICAgICAqXG4gICAgICogT3ZlcnJpZGVzIGFsbCBwcmV2aW91c2x5IHNldCBzY2hlbWEgb3B0aW9ucy5cbiAgICAgKi9cbiAgICBzZXRTY2hlbWEodmVyc2lvbiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ251bWJlcicpXG4gICAgICAgICAgICB2ZXJzaW9uID0gU3RyaW5nKHZlcnNpb24pO1xuICAgICAgICBsZXQgb3B0O1xuICAgICAgICBzd2l0Y2ggKHZlcnNpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJzEuMSc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlyZWN0aXZlcylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzLnlhbWwudmVyc2lvbiA9ICcxLjEnO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gbmV3IERpcmVjdGl2ZXMoeyB2ZXJzaW9uOiAnMS4xJyB9KTtcbiAgICAgICAgICAgICAgICBvcHQgPSB7IG1lcmdlOiB0cnVlLCByZXNvbHZlS25vd25UYWdzOiBmYWxzZSwgc2NoZW1hOiAneWFtbC0xLjEnIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcxLjInOlxuICAgICAgICAgICAgY2FzZSAnbmV4dCc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlyZWN0aXZlcylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzLnlhbWwudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBuZXcgRGlyZWN0aXZlcyh7IHZlcnNpb24gfSk7XG4gICAgICAgICAgICAgICAgb3B0ID0geyBtZXJnZTogZmFsc2UsIHJlc29sdmVLbm93blRhZ3M6IHRydWUsIHNjaGVtYTogJ2NvcmUnIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIG51bGw6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlyZWN0aXZlcylcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZGlyZWN0aXZlcztcbiAgICAgICAgICAgICAgICBvcHQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN2ID0gSlNPTi5zdHJpbmdpZnkodmVyc2lvbik7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAnMS4xJywgJzEuMicgb3IgbnVsbCBhcyBmaXJzdCBhcmd1bWVudCwgYnV0IGZvdW5kOiAke3N2fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE5vdCB1c2luZyBgaW5zdGFuY2VvZiBTY2hlbWFgIHRvIGFsbG93IGZvciBkdWNrIHR5cGluZ1xuICAgICAgICBpZiAob3B0aW9ucy5zY2hlbWEgaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICAgICAgICB0aGlzLnNjaGVtYSA9IG9wdGlvbnMuc2NoZW1hO1xuICAgICAgICBlbHNlIGlmIChvcHQpXG4gICAgICAgICAgICB0aGlzLnNjaGVtYSA9IG5ldyBTY2hlbWEoT2JqZWN0LmFzc2lnbihvcHQsIG9wdGlvbnMpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXaXRoIGEgbnVsbCBZQU1MIHZlcnNpb24sIHRoZSB7IHNjaGVtYTogU2NoZW1hIH0gb3B0aW9uIGlzIHJlcXVpcmVkYCk7XG4gICAgfVxuICAgIC8vIGpzb24gJiBqc29uQXJnIGFyZSBvbmx5IHVzZWQgZnJvbSB0b0pTT04oKVxuICAgIHRvSlMoeyBqc29uLCBqc29uQXJnLCBtYXBBc01hcCwgbWF4QWxpYXNDb3VudCwgb25BbmNob3IsIHJldml2ZXIgfSA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgICAgIGFuY2hvcnM6IG5ldyBNYXAoKSxcbiAgICAgICAgICAgIGRvYzogdGhpcyxcbiAgICAgICAgICAgIGtlZXA6ICFqc29uLFxuICAgICAgICAgICAgbWFwQXNNYXA6IG1hcEFzTWFwID09PSB0cnVlLFxuICAgICAgICAgICAgbWFwS2V5V2FybmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG1heEFsaWFzQ291bnQ6IHR5cGVvZiBtYXhBbGlhc0NvdW50ID09PSAnbnVtYmVyJyA/IG1heEFsaWFzQ291bnQgOiAxMDAsXG4gICAgICAgICAgICBzdHJpbmdpZnlcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzID0gdG9KUyh0aGlzLmNvbnRlbnRzLCBqc29uQXJnID8/ICcnLCBjdHgpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQW5jaG9yID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgZm9yIChjb25zdCB7IGNvdW50LCByZXMgfSBvZiBjdHguYW5jaG9ycy52YWx1ZXMoKSlcbiAgICAgICAgICAgICAgICBvbkFuY2hvcihyZXMsIGNvdW50KTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiByZXZpdmVyID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IGFwcGx5UmV2aXZlcihyZXZpdmVyLCB7ICcnOiByZXMgfSwgJycsIHJlcylcbiAgICAgICAgICAgIDogcmVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIGRvY3VtZW50IGBjb250ZW50c2AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ganNvbkFyZyBVc2VkIGJ5IGBKU09OLnN0cmluZ2lmeWAgdG8gaW5kaWNhdGUgdGhlIGFycmF5IGluZGV4IG9yXG4gICAgICogICBwcm9wZXJ0eSBuYW1lLlxuICAgICAqL1xuICAgIHRvSlNPTihqc29uQXJnLCBvbkFuY2hvcikge1xuICAgICAgICByZXR1cm4gdGhpcy50b0pTKHsganNvbjogdHJ1ZSwganNvbkFyZywgbWFwQXNNYXA6IGZhbHNlLCBvbkFuY2hvciB9KTtcbiAgICB9XG4gICAgLyoqIEEgWUFNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZG9jdW1lbnQuICovXG4gICAgdG9TdHJpbmcob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLmVycm9ycy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEb2N1bWVudCB3aXRoIGVycm9ycyBjYW5ub3QgYmUgc3RyaW5naWZpZWQnKTtcbiAgICAgICAgaWYgKCdpbmRlbnQnIGluIG9wdGlvbnMgJiZcbiAgICAgICAgICAgICghTnVtYmVyLmlzSW50ZWdlcihvcHRpb25zLmluZGVudCkgfHwgTnVtYmVyKG9wdGlvbnMuaW5kZW50KSA8PSAwKSkge1xuICAgICAgICAgICAgY29uc3QgcyA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuaW5kZW50KTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJpbmRlbnRcIiBvcHRpb24gbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIsIG5vdCAke3N9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeURvY3VtZW50KHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFzc2VydENvbGxlY3Rpb24oY29udGVudHMpIHtcbiAgICBpZiAoaXNDb2xsZWN0aW9uKGNvbnRlbnRzKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBhIFlBTUwgY29sbGVjdGlvbiBhcyBkb2N1bWVudCBjb250ZW50cycpO1xufVxuXG5leHBvcnQgeyBEb2N1bWVudCB9O1xuIiwgImNvbnN0IEJSRUFLID0gU3ltYm9sKCdicmVhayB2aXNpdCcpO1xuY29uc3QgU0tJUCA9IFN5bWJvbCgnc2tpcCBjaGlsZHJlbicpO1xuY29uc3QgUkVNT1ZFID0gU3ltYm9sKCdyZW1vdmUgaXRlbScpO1xuLyoqXG4gKiBBcHBseSBhIHZpc2l0b3IgdG8gYSBDU1QgZG9jdW1lbnQgb3IgaXRlbS5cbiAqXG4gKiBXYWxrcyB0aHJvdWdoIHRoZSB0cmVlIChkZXB0aC1maXJzdCkgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdCwgY2FsbGluZyBhXG4gKiBgdmlzaXRvcmAgZnVuY3Rpb24gd2l0aCB0d28gYXJndW1lbnRzIHdoZW4gZW50ZXJpbmcgZWFjaCBpdGVtOlxuICogICAtIGBpdGVtYDogVGhlIGN1cnJlbnQgaXRlbSwgd2hpY2ggaW5jbHVkZWQgdGhlIGZvbGxvd2luZyBtZW1iZXJzOlxuICogICAgIC0gYHN0YXJ0OiBTb3VyY2VUb2tlbltdYCBcdTIwMTMgU291cmNlIHRva2VucyBiZWZvcmUgdGhlIGtleSBvciB2YWx1ZSxcbiAqICAgICAgIHBvc3NpYmx5IGluY2x1ZGluZyBpdHMgYW5jaG9yIG9yIHRhZy5cbiAqICAgICAtIGBrZXk/OiBUb2tlbiB8IG51bGxgIFx1MjAxMyBTZXQgZm9yIHBhaXIgdmFsdWVzLiBNYXkgdGhlbiBiZSBgbnVsbGAsIGlmXG4gKiAgICAgICB0aGUga2V5IGJlZm9yZSB0aGUgYDpgIHNlcGFyYXRvciBpcyBlbXB0eS5cbiAqICAgICAtIGBzZXA/OiBTb3VyY2VUb2tlbltdYCBcdTIwMTMgU291cmNlIHRva2VucyBiZXR3ZWVuIHRoZSBrZXkgYW5kIHRoZSB2YWx1ZSxcbiAqICAgICAgIHdoaWNoIHNob3VsZCBpbmNsdWRlIHRoZSBgOmAgbWFwIHZhbHVlIGluZGljYXRvciBpZiBgdmFsdWVgIGlzIHNldC5cbiAqICAgICAtIGB2YWx1ZT86IFRva2VuYCBcdTIwMTMgVGhlIHZhbHVlIG9mIGEgc2VxdWVuY2UgaXRlbSwgb3Igb2YgYSBtYXAgcGFpci5cbiAqICAgLSBgcGF0aGA6IFRoZSBzdGVwcyBmcm9tIHRoZSByb290IHRvIHRoZSBjdXJyZW50IG5vZGUsIGFzIGFuIGFycmF5IG9mXG4gKiAgICAgYFsna2V5JyB8ICd2YWx1ZScsIG51bWJlcl1gIHR1cGxlcy5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSB2aXNpdG9yIG1heSBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIHRyYXZlcnNhbDpcbiAqICAgLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IERvIG5vdGhpbmcgYW5kIGNvbnRpbnVlXG4gKiAgIC0gYHZpc2l0LlNLSVBgOiBEbyBub3QgdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoaXMgdG9rZW4sIGNvbnRpbnVlIHdpdGhcbiAqICAgICAgbmV4dCBzaWJsaW5nXG4gKiAgIC0gYHZpc2l0LkJSRUFLYDogVGVybWluYXRlIHRyYXZlcnNhbCBjb21wbGV0ZWx5XG4gKiAgIC0gYHZpc2l0LlJFTU9WRWA6IFJlbW92ZSB0aGUgY3VycmVudCBpdGVtLCB0aGVuIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgb25lXG4gKiAgIC0gYG51bWJlcmA6IFNldCB0aGUgaW5kZXggb2YgdGhlIG5leHQgc3RlcC4gVGhpcyBpcyB1c2VmdWwgZXNwZWNpYWxseSBpZlxuICogICAgIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCB0b2tlbiBoYXMgY2hhbmdlZC5cbiAqICAgLSBgZnVuY3Rpb25gOiBEZWZpbmUgdGhlIG5leHQgdmlzaXRvciBmb3IgdGhpcyBpdGVtLiBBZnRlciB0aGUgb3JpZ2luYWxcbiAqICAgICB2aXNpdG9yIGlzIGNhbGxlZCBvbiBpdGVtIGVudHJ5LCBuZXh0IHZpc2l0b3JzIGFyZSBjYWxsZWQgYWZ0ZXIgaGFuZGxpbmdcbiAqICAgICBhIG5vbi1lbXB0eSBga2V5YCBhbmQgd2hlbiBleGl0aW5nIHRoZSBpdGVtLlxuICovXG5mdW5jdGlvbiB2aXNpdChjc3QsIHZpc2l0b3IpIHtcbiAgICBpZiAoJ3R5cGUnIGluIGNzdCAmJiBjc3QudHlwZSA9PT0gJ2RvY3VtZW50JylcbiAgICAgICAgY3N0ID0geyBzdGFydDogY3N0LnN0YXJ0LCB2YWx1ZTogY3N0LnZhbHVlIH07XG4gICAgX3Zpc2l0KE9iamVjdC5mcmVlemUoW10pLCBjc3QsIHZpc2l0b3IpO1xufVxuLy8gV2l0aG91dCB0aGUgYGFzIHN5bWJvbGAgY2FzdHMsIFRTIGRlY2xhcmVzIHRoZXNlIGluIHRoZSBgdmlzaXRgXG4vLyBuYW1lc3BhY2UgdXNpbmcgYHZhcmAsIGJ1dCB0aGVuIGNvbXBsYWlucyBhYm91dCB0aGF0IGJlY2F1c2Vcbi8vIGB1bmlxdWUgc3ltYm9sYCBtdXN0IGJlIGBjb25zdGAuXG4vKiogVGVybWluYXRlIHZpc2l0IHRyYXZlcnNhbCBjb21wbGV0ZWx5ICovXG52aXNpdC5CUkVBSyA9IEJSRUFLO1xuLyoqIERvIG5vdCB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgaXRlbSAqL1xudmlzaXQuU0tJUCA9IFNLSVA7XG4vKiogUmVtb3ZlIHRoZSBjdXJyZW50IGl0ZW0gKi9cbnZpc2l0LlJFTU9WRSA9IFJFTU9WRTtcbi8qKiBGaW5kIHRoZSBpdGVtIGF0IGBwYXRoYCBmcm9tIGBjc3RgIGFzIHRoZSByb290ICovXG52aXNpdC5pdGVtQXRQYXRoID0gKGNzdCwgcGF0aCkgPT4ge1xuICAgIGxldCBpdGVtID0gY3N0O1xuICAgIGZvciAoY29uc3QgW2ZpZWxkLCBpbmRleF0gb2YgcGF0aCkge1xuICAgICAgICBjb25zdCB0b2sgPSBpdGVtPy5bZmllbGRdO1xuICAgICAgICBpZiAodG9rICYmICdpdGVtcycgaW4gdG9rKSB7XG4gICAgICAgICAgICBpdGVtID0gdG9rLml0ZW1zW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbTtcbn07XG4vKipcbiAqIEdldCB0aGUgaW1tZWRpYXRlIHBhcmVudCBjb2xsZWN0aW9uIG9mIHRoZSBpdGVtIGF0IGBwYXRoYCBmcm9tIGBjc3RgIGFzIHRoZSByb290LlxuICpcbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgY29sbGVjdGlvbiBpcyBub3QgZm91bmQsIHdoaWNoIHNob3VsZCBuZXZlciBoYXBwZW4gaWYgdGhlIGl0ZW0gaXRzZWxmIGV4aXN0cy5cbiAqL1xudmlzaXQucGFyZW50Q29sbGVjdGlvbiA9IChjc3QsIHBhdGgpID0+IHtcbiAgICBjb25zdCBwYXJlbnQgPSB2aXNpdC5pdGVtQXRQYXRoKGNzdCwgcGF0aC5zbGljZSgwLCAtMSkpO1xuICAgIGNvbnN0IGZpZWxkID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdWzBdO1xuICAgIGNvbnN0IGNvbGwgPSBwYXJlbnQ/LltmaWVsZF07XG4gICAgaWYgKGNvbGwgJiYgJ2l0ZW1zJyBpbiBjb2xsKVxuICAgICAgICByZXR1cm4gY29sbDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmVudCBjb2xsZWN0aW9uIG5vdCBmb3VuZCcpO1xufTtcbmZ1bmN0aW9uIF92aXNpdChwYXRoLCBpdGVtLCB2aXNpdG9yKSB7XG4gICAgbGV0IGN0cmwgPSB2aXNpdG9yKGl0ZW0sIHBhdGgpO1xuICAgIGlmICh0eXBlb2YgY3RybCA9PT0gJ3N5bWJvbCcpXG4gICAgICAgIHJldHVybiBjdHJsO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgWydrZXknLCAndmFsdWUnXSkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IGl0ZW1bZmllbGRdO1xuICAgICAgICBpZiAodG9rZW4gJiYgJ2l0ZW1zJyBpbiB0b2tlbikge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbi5pdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNpID0gX3Zpc2l0KE9iamVjdC5mcmVlemUocGF0aC5jb25jYXQoW1tmaWVsZCwgaV1dKSksIHRva2VuLml0ZW1zW2ldLCB2aXNpdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNpID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgICAgICAgICAgaSA9IGNpIC0gMTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaSA9PT0gQlJFQUspXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSztcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaSA9PT0gUkVNT1ZFKSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuLml0ZW1zLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3RybCA9PT0gJ2Z1bmN0aW9uJyAmJiBmaWVsZCA9PT0gJ2tleScpXG4gICAgICAgICAgICAgICAgY3RybCA9IGN0cmwoaXRlbSwgcGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBjdHJsID09PSAnZnVuY3Rpb24nID8gY3RybChpdGVtLCBwYXRoKSA6IGN0cmw7XG59XG5cbmV4cG9ydCB7IHZpc2l0IH07XG4iLCAiaW1wb3J0IHsgQk9NLCBET0NVTUVOVCwgRkxPV19FTkQsIFNDQUxBUiB9IGZyb20gJy4vY3N0LmpzJztcblxuLypcblNUQVJUIC0+IHN0cmVhbVxuXG5zdHJlYW1cbiAgZGlyZWN0aXZlIC0+IGxpbmUtZW5kIC0+IHN0cmVhbVxuICBpbmRlbnQgKyBsaW5lLWVuZCAtPiBzdHJlYW1cbiAgW2Vsc2VdIC0+IGxpbmUtc3RhcnRcblxubGluZS1lbmRcbiAgY29tbWVudCAtPiBsaW5lLWVuZFxuICBuZXdsaW5lIC0+IC5cbiAgaW5wdXQtZW5kIC0+IEVORFxuXG5saW5lLXN0YXJ0XG4gIGRvYy1zdGFydCAtPiBkb2NcbiAgZG9jLWVuZCAtPiBzdHJlYW1cbiAgW2Vsc2VdIC0+IGluZGVudCAtPiBibG9jay1zdGFydFxuXG5ibG9jay1zdGFydFxuICBzZXEtaXRlbS1zdGFydCAtPiBibG9jay1zdGFydFxuICBleHBsaWNpdC1rZXktc3RhcnQgLT4gYmxvY2stc3RhcnRcbiAgbWFwLXZhbHVlLXN0YXJ0IC0+IGJsb2NrLXN0YXJ0XG4gIFtlbHNlXSAtPiBkb2NcblxuZG9jXG4gIGxpbmUtZW5kIC0+IGxpbmUtc3RhcnRcbiAgc3BhY2VzIC0+IGRvY1xuICBhbmNob3IgLT4gZG9jXG4gIHRhZyAtPiBkb2NcbiAgZmxvdy1zdGFydCAtPiBmbG93IC0+IGRvY1xuICBmbG93LWVuZCAtPiBlcnJvciAtPiBkb2NcbiAgc2VxLWl0ZW0tc3RhcnQgLT4gZXJyb3IgLT4gZG9jXG4gIGV4cGxpY2l0LWtleS1zdGFydCAtPiBlcnJvciAtPiBkb2NcbiAgbWFwLXZhbHVlLXN0YXJ0IC0+IGRvY1xuICBhbGlhcyAtPiBkb2NcbiAgcXVvdGUtc3RhcnQgLT4gcXVvdGVkLXNjYWxhciAtPiBkb2NcbiAgYmxvY2stc2NhbGFyLWhlYWRlciAtPiBsaW5lLWVuZCAtPiBibG9jay1zY2FsYXIobWluKSAtPiBsaW5lLXN0YXJ0XG4gIFtlbHNlXSAtPiBwbGFpbi1zY2FsYXIoZmFsc2UsIG1pbikgLT4gZG9jXG5cbmZsb3dcbiAgbGluZS1lbmQgLT4gZmxvd1xuICBzcGFjZXMgLT4gZmxvd1xuICBhbmNob3IgLT4gZmxvd1xuICB0YWcgLT4gZmxvd1xuICBmbG93LXN0YXJ0IC0+IGZsb3cgLT4gZmxvd1xuICBmbG93LWVuZCAtPiAuXG4gIHNlcS1pdGVtLXN0YXJ0IC0+IGVycm9yIC0+IGZsb3dcbiAgZXhwbGljaXQta2V5LXN0YXJ0IC0+IGZsb3dcbiAgbWFwLXZhbHVlLXN0YXJ0IC0+IGZsb3dcbiAgYWxpYXMgLT4gZmxvd1xuICBxdW90ZS1zdGFydCAtPiBxdW90ZWQtc2NhbGFyIC0+IGZsb3dcbiAgY29tbWEgLT4gZmxvd1xuICBbZWxzZV0gLT4gcGxhaW4tc2NhbGFyKHRydWUsIDApIC0+IGZsb3dcblxucXVvdGVkLXNjYWxhclxuICBxdW90ZS1lbmQgLT4gLlxuICBbZWxzZV0gLT4gcXVvdGVkLXNjYWxhclxuXG5ibG9jay1zY2FsYXIobWluKVxuICBuZXdsaW5lICsgcGVlayhpbmRlbnQgPCBtaW4pIC0+IC5cbiAgW2Vsc2VdIC0+IGJsb2NrLXNjYWxhcihtaW4pXG5cbnBsYWluLXNjYWxhcihpcy1mbG93LCBtaW4pXG4gIHNjYWxhci1lbmQoaXMtZmxvdykgLT4gLlxuICBwZWVrKG5ld2xpbmUgKyAoaW5kZW50IDwgbWluKSkgLT4gLlxuICBbZWxzZV0gLT4gcGxhaW4tc2NhbGFyKG1pbilcbiovXG5mdW5jdGlvbiBpc0VtcHR5KGNoKSB7XG4gICAgc3dpdGNoIChjaCkge1xuICAgICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgY2FzZSAnICc6XG4gICAgICAgIGNhc2UgJ1xcbic6XG4gICAgICAgIGNhc2UgJ1xccic6XG4gICAgICAgIGNhc2UgJ1xcdCc6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5jb25zdCBoZXhEaWdpdHMgPSAnMDEyMzQ1Njc4OUFCQ0RFRmFiY2RlZicuc3BsaXQoJycpO1xuY29uc3QgdGFnQ2hhcnMgPSBcIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LSM7Lz86QCY9KyRfLiF+KicoKVwiLnNwbGl0KCcnKTtcbmNvbnN0IGludmFsaWRGbG93U2NhbGFyQ2hhcnMgPSAnLFtde30nLnNwbGl0KCcnKTtcbmNvbnN0IGludmFsaWRBbmNob3JDaGFycyA9ICcgLFtde31cXG5cXHJcXHQnLnNwbGl0KCcnKTtcbmNvbnN0IGlzTm90QW5jaG9yQ2hhciA9IChjaCkgPT4gIWNoIHx8IGludmFsaWRBbmNob3JDaGFycy5pbmNsdWRlcyhjaCk7XG4vKipcbiAqIFNwbGl0cyBhbiBpbnB1dCBzdHJpbmcgaW50byBsZXhpY2FsIHRva2VucywgaS5lLiBzbWFsbGVyIHN0cmluZ3MgdGhhdCBhcmVcbiAqIGVhc2lseSBpZGVudGlmaWFibGUgYnkgYHRva2Vucy50b2tlblR5cGUoKWAuXG4gKlxuICogTGV4aW5nIHN0YXJ0cyBhbHdheXMgaW4gYSBcInN0cmVhbVwiIGNvbnRleHQuIEluY29tcGxldGUgaW5wdXQgbWF5IGJlIGJ1ZmZlcmVkXG4gKiB1bnRpbCBhIGNvbXBsZXRlIHRva2VuIGNhbiBiZSBlbWl0dGVkLlxuICpcbiAqIEluIGFkZGl0aW9uIHRvIHNsaWNlcyBvZiB0aGUgb3JpZ2luYWwgaW5wdXQsIHRoZSBmb2xsb3dpbmcgY29udHJvbCBjaGFyYWN0ZXJzXG4gKiBtYXkgYWxzbyBiZSBlbWl0dGVkOlxuICpcbiAqIC0gYFxceDAyYCAoU3RhcnQgb2YgVGV4dCk6IEEgZG9jdW1lbnQgc3RhcnRzIHdpdGggdGhlIG5leHQgdG9rZW5cbiAqIC0gYFxceDE4YCAoQ2FuY2VsKTogVW5leHBlY3RlZCBlbmQgb2YgZmxvdy1tb2RlIChpbmRpY2F0ZXMgYW4gZXJyb3IpXG4gKiAtIGBcXHgxZmAgKFVuaXQgU2VwYXJhdG9yKTogTmV4dCB0b2tlbiBpcyBhIHNjYWxhciB2YWx1ZVxuICogLSBgXFx1e0ZFRkZ9YCAoQnl0ZSBvcmRlciBtYXJrKTogRW1pdHRlZCBzZXBhcmF0ZWx5IG91dHNpZGUgZG9jdW1lbnRzXG4gKi9cbmNsYXNzIExleGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgYnVmZmVyIG1hcmtzIHRoZSBlbmQgb2ZcbiAgICAgICAgICogYWxsIGlucHV0XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmF0RW5kID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeHBsaWNpdCBpbmRlbnQgc2V0IGluIGJsb2NrIHNjYWxhciBoZWFkZXIsIGFzIGFuIG9mZnNldCBmcm9tIHRoZSBjdXJyZW50XG4gICAgICAgICAqIG1pbmltdW0gaW5kZW50LCBzbyBlLmcuIHNldCB0byAxIGZyb20gYSBoZWFkZXIgYHwyK2AuIFNldCB0byAtMSBpZiBub3RcbiAgICAgICAgICogZXhwbGljaXRseSBzZXQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmJsb2NrU2NhbGFySW5kZW50ID0gLTE7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCbG9jayBzY2FsYXJzIHRoYXQgaW5jbHVkZSBhICsgKGtlZXApIGNob21waW5nIGluZGljYXRvciBpbiB0aGVpciBoZWFkZXJcbiAgICAgICAgICogaW5jbHVkZSB0cmFpbGluZyBlbXB0eSBsaW5lcywgd2hpY2ggYXJlIG90aGVyd2lzZSBleGNsdWRlZCBmcm9tIHRoZVxuICAgICAgICAgKiBzY2FsYXIncyBjb250ZW50cy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYmxvY2tTY2FsYXJLZWVwID0gZmFsc2U7XG4gICAgICAgIC8qKiBDdXJyZW50IGlucHV0ICovXG4gICAgICAgIHRoaXMuYnVmZmVyID0gJyc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGbGFnIG5vdGluZyB3aGV0aGVyIHRoZSBtYXAgdmFsdWUgaW5kaWNhdG9yIDogY2FuIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGlzXG4gICAgICAgICAqIG5vZGUgd2l0aGluIGEgZmxvdyBjb250ZXh0LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgIC8qKiBDb3VudCBvZiBzdXJyb3VuZGluZyBmbG93IGNvbGxlY3Rpb24gbGV2ZWxzLiAqL1xuICAgICAgICB0aGlzLmZsb3dMZXZlbCA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNaW5pbXVtIGxldmVsIG9mIGluZGVudGF0aW9uIHJlcXVpcmVkIGZvciBuZXh0IGxpbmVzIHRvIGJlIHBhcnNlZCBhcyBhXG4gICAgICAgICAqIHBhcnQgb2YgdGhlIGN1cnJlbnQgc2NhbGFyIHZhbHVlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbmRlbnROZXh0ID0gMDtcbiAgICAgICAgLyoqIEluZGVudGF0aW9uIGxldmVsIG9mIHRoZSBjdXJyZW50IGxpbmUuICovXG4gICAgICAgIHRoaXMuaW5kZW50VmFsdWUgPSAwO1xuICAgICAgICAvKiogUG9zaXRpb24gb2YgdGhlIG5leHQgXFxuIGNoYXJhY3Rlci4gKi9cbiAgICAgICAgdGhpcy5saW5lRW5kUG9zID0gbnVsbDtcbiAgICAgICAgLyoqIFN0b3JlcyB0aGUgc3RhdGUgb2YgdGhlIGxleGVyIGlmIHJlYWNoaW5nIHRoZSBlbmQgb2YgaW5jcG9tcGxldGUgaW5wdXQgKi9cbiAgICAgICAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgICAgICAgLyoqIEEgcG9pbnRlciB0byBgYnVmZmVyYDsgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGxleGVyLiAqL1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIFlBTUwgdG9rZW5zIGZyb20gdGhlIGBzb3VyY2VgIHN0cmluZy4gSWYgYGluY29tcGxldGVgLFxuICAgICAqIGEgcGFydCBvZiB0aGUgbGFzdCBsaW5lIG1heSBiZSBsZWZ0IGFzIGEgYnVmZmVyIGZvciB0aGUgbmV4dCBjYWxsLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBnZW5lcmF0b3Igb2YgbGV4aWNhbCB0b2tlbnNcbiAgICAgKi9cbiAgICAqbGV4KHNvdXJjZSwgaW5jb21wbGV0ZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gdGhpcy5idWZmZXIgPyB0aGlzLmJ1ZmZlciArIHNvdXJjZSA6IHNvdXJjZTtcbiAgICAgICAgICAgIHRoaXMubGluZUVuZFBvcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hdEVuZCA9ICFpbmNvbXBsZXRlO1xuICAgICAgICBsZXQgbmV4dCA9IHRoaXMubmV4dCA/PyAnc3RyZWFtJztcbiAgICAgICAgd2hpbGUgKG5leHQgJiYgKGluY29tcGxldGUgfHwgdGhpcy5oYXNDaGFycygxKSkpXG4gICAgICAgICAgICBuZXh0ID0geWllbGQqIHRoaXMucGFyc2VOZXh0KG5leHQpO1xuICAgIH1cbiAgICBhdExpbmVFbmQoKSB7XG4gICAgICAgIGxldCBpID0gdGhpcy5wb3M7XG4gICAgICAgIGxldCBjaCA9IHRoaXMuYnVmZmVyW2ldO1xuICAgICAgICB3aGlsZSAoY2ggPT09ICcgJyB8fCBjaCA9PT0gJ1xcdCcpXG4gICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgIGlmICghY2ggfHwgY2ggPT09ICcjJyB8fCBjaCA9PT0gJ1xcbicpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGNoID09PSAnXFxyJylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlcltpICsgMV0gPT09ICdcXG4nO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNoYXJBdChuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLnBvcyArIG5dO1xuICAgIH1cbiAgICBjb250aW51ZVNjYWxhcihvZmZzZXQpIHtcbiAgICAgICAgbGV0IGNoID0gdGhpcy5idWZmZXJbb2Zmc2V0XTtcbiAgICAgICAgaWYgKHRoaXMuaW5kZW50TmV4dCA+IDApIHtcbiAgICAgICAgICAgIGxldCBpbmRlbnQgPSAwO1xuICAgICAgICAgICAgd2hpbGUgKGNoID09PSAnICcpXG4gICAgICAgICAgICAgICAgY2ggPSB0aGlzLmJ1ZmZlclsrK2luZGVudCArIG9mZnNldF07XG4gICAgICAgICAgICBpZiAoY2ggPT09ICdcXHInKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuYnVmZmVyW2luZGVudCArIG9mZnNldCArIDFdO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0ID09PSAnXFxuJyB8fCAoIW5leHQgJiYgIXRoaXMuYXRFbmQpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0ICsgaW5kZW50ICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjaCA9PT0gJ1xcbicgfHwgaW5kZW50ID49IHRoaXMuaW5kZW50TmV4dCB8fCAoIWNoICYmICF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgICAgID8gb2Zmc2V0ICsgaW5kZW50XG4gICAgICAgICAgICAgICAgOiAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJy4nKSB7XG4gICAgICAgICAgICBjb25zdCBkdCA9IHRoaXMuYnVmZmVyLnN1YnN0cihvZmZzZXQsIDMpO1xuICAgICAgICAgICAgaWYgKChkdCA9PT0gJy0tLScgfHwgZHQgPT09ICcuLi4nKSAmJiBpc0VtcHR5KHRoaXMuYnVmZmVyW29mZnNldCArIDNdKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgZ2V0TGluZSgpIHtcbiAgICAgICAgbGV0IGVuZCA9IHRoaXMubGluZUVuZFBvcztcbiAgICAgICAgaWYgKHR5cGVvZiBlbmQgIT09ICdudW1iZXInIHx8IChlbmQgIT09IC0xICYmIGVuZCA8IHRoaXMucG9zKSkge1xuICAgICAgICAgICAgZW5kID0gdGhpcy5idWZmZXIuaW5kZXhPZignXFxuJywgdGhpcy5wb3MpO1xuICAgICAgICAgICAgdGhpcy5saW5lRW5kUG9zID0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQgPT09IC0xKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXRFbmQgPyB0aGlzLmJ1ZmZlci5zdWJzdHJpbmcodGhpcy5wb3MpIDogbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyW2VuZCAtIDFdID09PSAnXFxyJylcbiAgICAgICAgICAgIGVuZCAtPSAxO1xuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIuc3Vic3RyaW5nKHRoaXMucG9zLCBlbmQpO1xuICAgIH1cbiAgICBoYXNDaGFycyhuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvcyArIG4gPD0gdGhpcy5idWZmZXIubGVuZ3RoO1xuICAgIH1cbiAgICBzZXROZXh0KHN0YXRlKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gdGhpcy5idWZmZXIuc3Vic3RyaW5nKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgICB0aGlzLmxpbmVFbmRQb3MgPSBudWxsO1xuICAgICAgICB0aGlzLm5leHQgPSBzdGF0ZTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHBlZWsobikge1xuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIuc3Vic3RyKHRoaXMucG9zLCBuKTtcbiAgICB9XG4gICAgKnBhcnNlTmV4dChuZXh0KSB7XG4gICAgICAgIHN3aXRjaCAobmV4dCkge1xuICAgICAgICAgICAgY2FzZSAnc3RyZWFtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VTdHJlYW0oKTtcbiAgICAgICAgICAgIGNhc2UgJ2xpbmUtc3RhcnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZUxpbmVTdGFydCgpO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stc3RhcnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZUJsb2NrU3RhcnQoKTtcbiAgICAgICAgICAgIGNhc2UgJ2RvYyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlRG9jdW1lbnQoKTtcbiAgICAgICAgICAgIGNhc2UgJ2Zsb3cnOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZUZsb3dDb2xsZWN0aW9uKCk7XG4gICAgICAgICAgICBjYXNlICdxdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VRdW90ZWRTY2FsYXIoKTtcbiAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlQmxvY2tTY2FsYXIoKTtcbiAgICAgICAgICAgIGNhc2UgJ3BsYWluLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlUGxhaW5TY2FsYXIoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAqcGFyc2VTdHJlYW0oKSB7XG4gICAgICAgIGxldCBsaW5lID0gdGhpcy5nZXRMaW5lKCk7XG4gICAgICAgIGlmIChsaW5lID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgnc3RyZWFtJyk7XG4gICAgICAgIGlmIChsaW5lWzBdID09PSBCT00pIHtcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZygxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGluZVswXSA9PT0gJyUnKSB7XG4gICAgICAgICAgICBsZXQgZGlyRW5kID0gbGluZS5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBjcyA9IGxpbmUuaW5kZXhPZignIycpO1xuICAgICAgICAgICAgaWYgKGNzICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoID0gbGluZVtjcyAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0JylcbiAgICAgICAgICAgICAgICAgICAgZGlyRW5kID0gY3MgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaCA9IGxpbmVbZGlyRW5kIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAnICcgfHwgY2ggPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgICAgICBkaXJFbmQgLT0gMTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbiA9ICh5aWVsZCogdGhpcy5wdXNoQ291bnQoZGlyRW5kKSkgKyAoeWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKSk7XG4gICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQobGluZS5sZW5ndGggLSBuKTsgLy8gcG9zc2libGUgY29tbWVudFxuICAgICAgICAgICAgdGhpcy5wdXNoTmV3bGluZSgpO1xuICAgICAgICAgICAgcmV0dXJuICdzdHJlYW0nO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmF0TGluZUVuZCgpKSB7XG4gICAgICAgICAgICBjb25zdCBzcCA9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQobGluZS5sZW5ndGggLSBzcCk7XG4gICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoTmV3bGluZSgpO1xuICAgICAgICAgICAgcmV0dXJuICdzdHJlYW0nO1xuICAgICAgICB9XG4gICAgICAgIHlpZWxkIERPQ1VNRU5UO1xuICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VMaW5lU3RhcnQoKTtcbiAgICB9XG4gICAgKnBhcnNlTGluZVN0YXJ0KCkge1xuICAgICAgICBjb25zdCBjaCA9IHRoaXMuY2hhckF0KDApO1xuICAgICAgICBpZiAoIWNoICYmICF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgnbGluZS1zdGFydCcpO1xuICAgICAgICBpZiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJy4nKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYXRFbmQgJiYgIXRoaXMuaGFzQ2hhcnMoNCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgnbGluZS1zdGFydCcpO1xuICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMucGVlaygzKTtcbiAgICAgICAgICAgIGlmIChzID09PSAnLS0tJyAmJiBpc0VtcHR5KHRoaXMuY2hhckF0KDMpKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudFZhbHVlID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudE5leHQgPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybiAnZG9jJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHMgPT09ICcuLi4nICYmIGlzRW1wdHkodGhpcy5jaGFyQXQoMykpKSB7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KDMpO1xuICAgICAgICAgICAgICAgIHJldHVybiAnc3RyZWFtJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGVudFZhbHVlID0geWllbGQqIHRoaXMucHVzaFNwYWNlcyhmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLmluZGVudE5leHQgPiB0aGlzLmluZGVudFZhbHVlICYmICFpc0VtcHR5KHRoaXMuY2hhckF0KDEpKSlcbiAgICAgICAgICAgIHRoaXMuaW5kZW50TmV4dCA9IHRoaXMuaW5kZW50VmFsdWU7XG4gICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZUJsb2NrU3RhcnQoKTtcbiAgICB9XG4gICAgKnBhcnNlQmxvY2tTdGFydCgpIHtcbiAgICAgICAgY29uc3QgW2NoMCwgY2gxXSA9IHRoaXMucGVlaygyKTtcbiAgICAgICAgaWYgKCFjaDEgJiYgIXRoaXMuYXRFbmQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdibG9jay1zdGFydCcpO1xuICAgICAgICBpZiAoKGNoMCA9PT0gJy0nIHx8IGNoMCA9PT0gJz8nIHx8IGNoMCA9PT0gJzonKSAmJiBpc0VtcHR5KGNoMSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSAoeWllbGQqIHRoaXMucHVzaENvdW50KDEpKSArICh5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpKTtcbiAgICAgICAgICAgIHRoaXMuaW5kZW50TmV4dCA9IHRoaXMuaW5kZW50VmFsdWUgKyAxO1xuICAgICAgICAgICAgdGhpcy5pbmRlbnRWYWx1ZSArPSBuO1xuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlQmxvY2tTdGFydCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnZG9jJztcbiAgICB9XG4gICAgKnBhcnNlRG9jdW1lbnQoKSB7XG4gICAgICAgIHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLmdldExpbmUoKTtcbiAgICAgICAgaWYgKGxpbmUgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdkb2MnKTtcbiAgICAgICAgbGV0IG4gPSB5aWVsZCogdGhpcy5wdXNoSW5kaWNhdG9ycygpO1xuICAgICAgICBzd2l0Y2ggKGxpbmVbbl0pIHtcbiAgICAgICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudChsaW5lLmxlbmd0aCAtIG4pO1xuICAgICAgICAgICAgLy8gZmFsbHRocm91Z2hcbiAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hOZXdsaW5lKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlTGluZVN0YXJ0KCk7XG4gICAgICAgICAgICBjYXNlICd7JzpcbiAgICAgICAgICAgIGNhc2UgJ1snOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dMZXZlbCA9IDE7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdmbG93JztcbiAgICAgICAgICAgIGNhc2UgJ30nOlxuICAgICAgICAgICAgY2FzZSAnXSc6XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlcnJvclxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RvYyc7XG4gICAgICAgICAgICBjYXNlICcqJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoVW50aWwoaXNOb3RBbmNob3JDaGFyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RvYyc7XG4gICAgICAgICAgICBjYXNlICdcIic6XG4gICAgICAgICAgICBjYXNlIFwiJ1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVF1b3RlZFNjYWxhcigpO1xuICAgICAgICAgICAgY2FzZSAnfCc6XG4gICAgICAgICAgICBjYXNlICc+JzpcbiAgICAgICAgICAgICAgICBuICs9IHlpZWxkKiB0aGlzLnBhcnNlQmxvY2tTY2FsYXJIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBuICs9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KGxpbmUubGVuZ3RoIC0gbik7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VCbG9ja1NjYWxhcigpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VQbGFpblNjYWxhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwYXJzZUZsb3dDb2xsZWN0aW9uKCkge1xuICAgICAgICBsZXQgbmwsIHNwO1xuICAgICAgICBsZXQgaW5kZW50ID0gLTE7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIG5sID0geWllbGQqIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgIGlmIChubCA+IDApIHtcbiAgICAgICAgICAgICAgICBzcCA9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXMoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50VmFsdWUgPSBpbmRlbnQgPSBzcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNwID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNwICs9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgIH0gd2hpbGUgKG5sICsgc3AgPiAwKTtcbiAgICAgICAgY29uc3QgbGluZSA9IHRoaXMuZ2V0TGluZSgpO1xuICAgICAgICBpZiAobGluZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2Zsb3cnKTtcbiAgICAgICAgaWYgKChpbmRlbnQgIT09IC0xICYmIGluZGVudCA8IHRoaXMuaW5kZW50TmV4dCAmJiBsaW5lWzBdICE9PSAnIycpIHx8XG4gICAgICAgICAgICAoaW5kZW50ID09PSAwICYmXG4gICAgICAgICAgICAgICAgKGxpbmUuc3RhcnRzV2l0aCgnLS0tJykgfHwgbGluZS5zdGFydHNXaXRoKCcuLi4nKSkgJiZcbiAgICAgICAgICAgICAgICBpc0VtcHR5KGxpbmVbM10pKSkge1xuICAgICAgICAgICAgLy8gQWxsb3dpbmcgZm9yIHRoZSB0ZXJtaW5hbCBdIG9yIH0gYXQgdGhlIHNhbWUgKHJhdGhlciB0aGFuIGdyZWF0ZXIpXG4gICAgICAgICAgICAvLyBpbmRlbnQgbGV2ZWwgYXMgdGhlIGluaXRpYWwgWyBvciB7IGlzIHRlY2huaWNhbGx5IGludmFsaWQsIGJ1dFxuICAgICAgICAgICAgLy8gZmFpbGluZyBoZXJlIHdvdWxkIGJlIHN1cnByaXNpbmcgdG8gdXNlcnMuXG4gICAgICAgICAgICBjb25zdCBhdEZsb3dFbmRNYXJrZXIgPSBpbmRlbnQgPT09IHRoaXMuaW5kZW50TmV4dCAtIDEgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dMZXZlbCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgIChsaW5lWzBdID09PSAnXScgfHwgbGluZVswXSA9PT0gJ30nKTtcbiAgICAgICAgICAgIGlmICghYXRGbG93RW5kTWFya2VyKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlcnJvclxuICAgICAgICAgICAgICAgIHRoaXMuZmxvd0xldmVsID0gMDtcbiAgICAgICAgICAgICAgICB5aWVsZCBGTE9XX0VORDtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VMaW5lU3RhcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbiA9IDA7XG4gICAgICAgIHdoaWxlIChsaW5lW25dID09PSAnLCcpIHtcbiAgICAgICAgICAgIG4gKz0geWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoSW5kaWNhdG9ycygpO1xuICAgICAgICBzd2l0Y2ggKGxpbmVbbl0pIHtcbiAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZmxvdyc7XG4gICAgICAgICAgICBjYXNlICcjJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQobGluZS5sZW5ndGggLSBuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Zsb3cnO1xuICAgICAgICAgICAgY2FzZSAneyc6XG4gICAgICAgICAgICBjYXNlICdbJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQoMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93TGV2ZWwgKz0gMTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Zsb3cnO1xuICAgICAgICAgICAgY2FzZSAnfSc6XG4gICAgICAgICAgICBjYXNlICddJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQoMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dMZXZlbCAtPSAxO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dMZXZlbCA/ICdmbG93JyA6ICdkb2MnO1xuICAgICAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaFVudGlsKGlzTm90QW5jaG9yQ2hhcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdmbG93JztcbiAgICAgICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VRdW90ZWRTY2FsYXIoKTtcbiAgICAgICAgICAgIGNhc2UgJzonOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuY2hhckF0KDEpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZsb3dLZXkgfHwgaXNFbXB0eShuZXh0KSB8fCBuZXh0ID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmbG93JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VQbGFpblNjYWxhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwYXJzZVF1b3RlZFNjYWxhcigpIHtcbiAgICAgICAgY29uc3QgcXVvdGUgPSB0aGlzLmNoYXJBdCgwKTtcbiAgICAgICAgbGV0IGVuZCA9IHRoaXMuYnVmZmVyLmluZGV4T2YocXVvdGUsIHRoaXMucG9zICsgMSk7XG4gICAgICAgIGlmIChxdW90ZSA9PT0gXCInXCIpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbmQgIT09IC0xICYmIHRoaXMuYnVmZmVyW2VuZCArIDFdID09PSBcIidcIilcbiAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlci5pbmRleE9mKFwiJ1wiLCBlbmQgKyAyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGRvdWJsZS1xdW90ZVxuICAgICAgICAgICAgd2hpbGUgKGVuZCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBsZXQgbiA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuYnVmZmVyW2VuZCAtIDEgLSBuXSA9PT0gJ1xcXFwnKVxuICAgICAgICAgICAgICAgICAgICBuICs9IDE7XG4gICAgICAgICAgICAgICAgaWYgKG4gJSAyID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlci5pbmRleE9mKCdcIicsIGVuZCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgbG9va2luZyBmb3IgbmV3bGluZXMgd2l0aGluIHRoZSBxdW90ZXNcbiAgICAgICAgY29uc3QgcWIgPSB0aGlzLmJ1ZmZlci5zdWJzdHJpbmcoMCwgZW5kKTtcbiAgICAgICAgbGV0IG5sID0gcWIuaW5kZXhPZignXFxuJywgdGhpcy5wb3MpO1xuICAgICAgICBpZiAobmwgIT09IC0xKSB7XG4gICAgICAgICAgICB3aGlsZSAobmwgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3MgPSB0aGlzLmNvbnRpbnVlU2NhbGFyKG5sICsgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGNzID09PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgbmwgPSBxYi5pbmRleE9mKCdcXG4nLCBjcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmwgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlcnJvciBjYXVzZWQgYnkgYW4gdW5leHBlY3RlZCB1bmluZGVudFxuICAgICAgICAgICAgICAgIGVuZCA9IG5sIC0gKHFiW25sIC0gMV0gPT09ICdcXHInID8gMiA6IDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYXRFbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgncXVvdGVkLXNjYWxhcicpO1xuICAgICAgICAgICAgZW5kID0gdGhpcy5idWZmZXIubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHlpZWxkKiB0aGlzLnB1c2hUb0luZGV4KGVuZCArIDEsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxvd0xldmVsID8gJ2Zsb3cnIDogJ2RvYyc7XG4gICAgfVxuICAgICpwYXJzZUJsb2NrU2NhbGFySGVhZGVyKCkge1xuICAgICAgICB0aGlzLmJsb2NrU2NhbGFySW5kZW50ID0gLTE7XG4gICAgICAgIHRoaXMuYmxvY2tTY2FsYXJLZWVwID0gZmFsc2U7XG4gICAgICAgIGxldCBpID0gdGhpcy5wb3M7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgICAgICBpZiAoY2ggPT09ICcrJylcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrU2NhbGFyS2VlcCA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmIChjaCA+ICcwJyAmJiBjaCA8PSAnOScpXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja1NjYWxhckluZGVudCA9IE51bWJlcihjaCkgLSAxO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2ggIT09ICctJylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaFVudGlsKGNoID0+IGlzRW1wdHkoY2gpIHx8IGNoID09PSAnIycpO1xuICAgIH1cbiAgICAqcGFyc2VCbG9ja1NjYWxhcigpIHtcbiAgICAgICAgbGV0IG5sID0gdGhpcy5wb3MgLSAxOyAvLyBtYXkgYmUgLTEgaWYgdGhpcy5wb3MgPT09IDBcbiAgICAgICAgbGV0IGluZGVudCA9IDA7XG4gICAgICAgIGxldCBjaDtcbiAgICAgICAgbG9vcDogZm9yIChsZXQgaSA9IHRoaXMucG9zOyAoY2ggPSB0aGlzLmJ1ZmZlcltpXSk7ICsraSkge1xuICAgICAgICAgICAgc3dpdGNoIChjaCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnXFxuJzpcbiAgICAgICAgICAgICAgICAgICAgbmwgPSBpO1xuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdcXHInOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmJ1ZmZlcltpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV4dCAmJiAhdGhpcy5hdEVuZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2Jsb2NrLXNjYWxhcicpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PT0gJ1xcbicpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IC8vIGZhbGx0aHJvdWdoXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoICYmICF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgnYmxvY2stc2NhbGFyJyk7XG4gICAgICAgIGlmIChpbmRlbnQgPj0gdGhpcy5pbmRlbnROZXh0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ibG9ja1NjYWxhckluZGVudCA9PT0gLTEpXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRlbnROZXh0ID0gaW5kZW50O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50TmV4dCArPSB0aGlzLmJsb2NrU2NhbGFySW5kZW50O1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNzID0gdGhpcy5jb250aW51ZVNjYWxhcihubCArIDEpO1xuICAgICAgICAgICAgICAgIGlmIChjcyA9PT0gLTEpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIG5sID0gdGhpcy5idWZmZXIuaW5kZXhPZignXFxuJywgY3MpO1xuICAgICAgICAgICAgfSB3aGlsZSAobmwgIT09IC0xKTtcbiAgICAgICAgICAgIGlmIChubCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXRFbmQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2Jsb2NrLXNjYWxhcicpO1xuICAgICAgICAgICAgICAgIG5sID0gdGhpcy5idWZmZXIubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5ibG9ja1NjYWxhcktlZXApIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBsZXQgaSA9IG5sIC0gMTtcbiAgICAgICAgICAgICAgICBsZXQgY2ggPSB0aGlzLmJ1ZmZlcltpXTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXHInKVxuICAgICAgICAgICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWy0taV07XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdENoYXIgPSBpOyAvLyBEcm9wIHRoZSBsaW5lIGlmIGxhc3QgY2hhciBub3QgbW9yZSBpbmRlbnRlZFxuICAgICAgICAgICAgICAgIHdoaWxlIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0JylcbiAgICAgICAgICAgICAgICAgICAgY2ggPSB0aGlzLmJ1ZmZlclstLWldO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xcbicgJiYgaSA+PSB0aGlzLnBvcyAmJiBpICsgMSArIGluZGVudCA+IGxhc3RDaGFyKVxuICAgICAgICAgICAgICAgICAgICBubCA9IGk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHlpZWxkIFNDQUxBUjtcbiAgICAgICAgeWllbGQqIHRoaXMucHVzaFRvSW5kZXgobmwgKyAxLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlTGluZVN0YXJ0KCk7XG4gICAgfVxuICAgICpwYXJzZVBsYWluU2NhbGFyKCkge1xuICAgICAgICBjb25zdCBpbkZsb3cgPSB0aGlzLmZsb3dMZXZlbCA+IDA7XG4gICAgICAgIGxldCBlbmQgPSB0aGlzLnBvcyAtIDE7XG4gICAgICAgIGxldCBpID0gdGhpcy5wb3MgLSAxO1xuICAgICAgICBsZXQgY2g7XG4gICAgICAgIHdoaWxlICgoY2ggPSB0aGlzLmJ1ZmZlclsrK2ldKSkge1xuICAgICAgICAgICAgaWYgKGNoID09PSAnOicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5idWZmZXJbaSArIDFdO1xuICAgICAgICAgICAgICAgIGlmIChpc0VtcHR5KG5leHQpIHx8IChpbkZsb3cgJiYgbmV4dCA9PT0gJywnKSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzRW1wdHkoY2gpKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLmJ1ZmZlcltpICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxyJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gJ1xcbic7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gdGhpcy5idWZmZXJbaSArIDFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZXh0ID09PSAnIycgfHwgKGluRmxvdyAmJiBpbnZhbGlkRmxvd1NjYWxhckNoYXJzLmluY2x1ZGVzKG5leHQpKSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjcyA9IHRoaXMuY29udGludWVTY2FsYXIoaSArIDEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3MgPT09IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGkgPSBNYXRoLm1heChpLCBjcyAtIDIpOyAvLyB0byBhZHZhbmNlLCBidXQgc3RpbGwgYWNjb3VudCBmb3IgJyAjJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpbkZsb3cgJiYgaW52YWxpZEZsb3dTY2FsYXJDaGFycy5pbmNsdWRlcyhjaCkpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGVuZCA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjaCAmJiAhdGhpcy5hdEVuZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ3BsYWluLXNjYWxhcicpO1xuICAgICAgICB5aWVsZCBTQ0FMQVI7XG4gICAgICAgIHlpZWxkKiB0aGlzLnB1c2hUb0luZGV4KGVuZCArIDEsIHRydWUpO1xuICAgICAgICByZXR1cm4gaW5GbG93ID8gJ2Zsb3cnIDogJ2RvYyc7XG4gICAgfVxuICAgICpwdXNoQ291bnQobikge1xuICAgICAgICBpZiAobiA+IDApIHtcbiAgICAgICAgICAgIHlpZWxkIHRoaXMuYnVmZmVyLnN1YnN0cih0aGlzLnBvcywgbik7XG4gICAgICAgICAgICB0aGlzLnBvcyArPSBuO1xuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgICpwdXNoVG9JbmRleChpLCBhbGxvd0VtcHR5KSB7XG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLmJ1ZmZlci5zbGljZSh0aGlzLnBvcywgaSk7XG4gICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICB5aWVsZCBzO1xuICAgICAgICAgICAgdGhpcy5wb3MgKz0gcy5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYWxsb3dFbXB0eSlcbiAgICAgICAgICAgIHlpZWxkICcnO1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgKnB1c2hJbmRpY2F0b3JzKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuY2hhckF0KDApKSB7XG4gICAgICAgICAgICBjYXNlICchJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gKCh5aWVsZCogdGhpcy5wdXNoVGFnKCkpICtcbiAgICAgICAgICAgICAgICAgICAgKHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSkpICtcbiAgICAgICAgICAgICAgICAgICAgKHlpZWxkKiB0aGlzLnB1c2hJbmRpY2F0b3JzKCkpKTtcbiAgICAgICAgICAgIGNhc2UgJyYnOlxuICAgICAgICAgICAgICAgIHJldHVybiAoKHlpZWxkKiB0aGlzLnB1c2hVbnRpbChpc05vdEFuY2hvckNoYXIpKSArXG4gICAgICAgICAgICAgICAgICAgICh5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpKSArXG4gICAgICAgICAgICAgICAgICAgICh5aWVsZCogdGhpcy5wdXNoSW5kaWNhdG9ycygpKSk7XG4gICAgICAgICAgICBjYXNlICctJzogLy8gdGhpcyBpcyBhbiBlcnJvclxuICAgICAgICAgICAgY2FzZSAnPyc6IC8vIHRoaXMgaXMgYW4gZXJyb3Igb3V0c2lkZSBmbG93IGNvbGxlY3Rpb25zXG4gICAgICAgICAgICBjYXNlICc6Jzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluRmxvdyA9IHRoaXMuZmxvd0xldmVsID4gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBjaDEgPSB0aGlzLmNoYXJBdCgxKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eShjaDEpIHx8IChpbkZsb3cgJiYgaW52YWxpZEZsb3dTY2FsYXJDaGFycy5pbmNsdWRlcyhjaDEpKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWluRmxvdylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50TmV4dCA9IHRoaXMuaW5kZW50VmFsdWUgKyAxO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmZsb3dLZXkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoeWllbGQqIHRoaXMucHVzaENvdW50KDEpKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAoeWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKHlpZWxkKiB0aGlzLnB1c2hJbmRpY2F0b3JzKCkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgICpwdXNoVGFnKCkge1xuICAgICAgICBpZiAodGhpcy5jaGFyQXQoMSkgPT09ICc8Jykge1xuICAgICAgICAgICAgbGV0IGkgPSB0aGlzLnBvcyArIDI7XG4gICAgICAgICAgICBsZXQgY2ggPSB0aGlzLmJ1ZmZlcltpXTtcbiAgICAgICAgICAgIHdoaWxlICghaXNFbXB0eShjaCkgJiYgY2ggIT09ICc+JylcbiAgICAgICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaFRvSW5kZXgoY2ggPT09ICc+JyA/IGkgKyAxIDogaSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGkgPSB0aGlzLnBvcyArIDE7XG4gICAgICAgICAgICBsZXQgY2ggPSB0aGlzLmJ1ZmZlcltpXTtcbiAgICAgICAgICAgIHdoaWxlIChjaCkge1xuICAgICAgICAgICAgICAgIGlmICh0YWdDaGFycy5pbmNsdWRlcyhjaCkpXG4gICAgICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbKytpXTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gJyUnICYmXG4gICAgICAgICAgICAgICAgICAgIGhleERpZ2l0cy5pbmNsdWRlcyh0aGlzLmJ1ZmZlcltpICsgMV0pICYmXG4gICAgICAgICAgICAgICAgICAgIGhleERpZ2l0cy5pbmNsdWRlcyh0aGlzLmJ1ZmZlcltpICsgMl0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbKGkgKz0gMyldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnB1c2hUb0luZGV4KGksIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAqcHVzaE5ld2xpbmUoKSB7XG4gICAgICAgIGNvbnN0IGNoID0gdGhpcy5idWZmZXJbdGhpcy5wb3NdO1xuICAgICAgICBpZiAoY2ggPT09ICdcXG4nKVxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgZWxzZSBpZiAoY2ggPT09ICdcXHInICYmIHRoaXMuY2hhckF0KDEpID09PSAnXFxuJylcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wdXNoQ291bnQoMik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAqcHVzaFNwYWNlcyhhbGxvd1RhYnMpIHtcbiAgICAgICAgbGV0IGkgPSB0aGlzLnBvcyAtIDE7XG4gICAgICAgIGxldCBjaDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgY2ggPSB0aGlzLmJ1ZmZlclsrK2ldO1xuICAgICAgICB9IHdoaWxlIChjaCA9PT0gJyAnIHx8IChhbGxvd1RhYnMgJiYgY2ggPT09ICdcXHQnKSk7XG4gICAgICAgIGNvbnN0IG4gPSBpIC0gdGhpcy5wb3M7XG4gICAgICAgIGlmIChuID4gMCkge1xuICAgICAgICAgICAgeWllbGQgdGhpcy5idWZmZXIuc3Vic3RyKHRoaXMucG9zLCBuKTtcbiAgICAgICAgICAgIHRoaXMucG9zID0gaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgKnB1c2hVbnRpbCh0ZXN0KSB7XG4gICAgICAgIGxldCBpID0gdGhpcy5wb3M7XG4gICAgICAgIGxldCBjaCA9IHRoaXMuYnVmZmVyW2ldO1xuICAgICAgICB3aGlsZSAoIXRlc3QoY2gpKVxuICAgICAgICAgICAgY2ggPSB0aGlzLmJ1ZmZlclsrK2ldO1xuICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaFRvSW5kZXgoaSwgZmFsc2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgTGV4ZXIgfTtcbiIsICJpbXBvcnQgeyBDb21wb3NlciB9IGZyb20gJy4vY29tcG9zZS9jb21wb3Nlci5qcyc7XG5pbXBvcnQgeyBEb2N1bWVudCB9IGZyb20gJy4vZG9jL0RvY3VtZW50LmpzJztcbmltcG9ydCB7IHByZXR0aWZ5RXJyb3IsIFlBTUxQYXJzZUVycm9yIH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuaW1wb3J0IHsgd2FybiB9IGZyb20gJy4vbG9nLmpzJztcbmltcG9ydCB7IExpbmVDb3VudGVyIH0gZnJvbSAnLi9wYXJzZS9saW5lLWNvdW50ZXIuanMnO1xuaW1wb3J0IHsgUGFyc2VyIH0gZnJvbSAnLi9wYXJzZS9wYXJzZXIuanMnO1xuXG5mdW5jdGlvbiBwYXJzZU9wdGlvbnMob3B0aW9ucykge1xuICAgIGNvbnN0IHByZXR0eUVycm9ycyA9IG9wdGlvbnMucHJldHR5RXJyb3JzICE9PSBmYWxzZTtcbiAgICBjb25zdCBsaW5lQ291bnRlciA9IG9wdGlvbnMubGluZUNvdW50ZXIgfHwgKHByZXR0eUVycm9ycyAmJiBuZXcgTGluZUNvdW50ZXIoKSkgfHwgbnVsbDtcbiAgICByZXR1cm4geyBsaW5lQ291bnRlciwgcHJldHR5RXJyb3JzIH07XG59XG4vKipcbiAqIFBhcnNlIHRoZSBpbnB1dCBhcyBhIHN0cmVhbSBvZiBZQU1MIGRvY3VtZW50cy5cbiAqXG4gKiBEb2N1bWVudHMgc2hvdWxkIGJlIHNlcGFyYXRlZCBmcm9tIGVhY2ggb3RoZXIgYnkgYC4uLmAgb3IgYC0tLWAgbWFya2VyIGxpbmVzLlxuICpcbiAqIEByZXR1cm5zIElmIGFuIGVtcHR5IGBkb2NzYCBhcnJheSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBvZiB0eXBlXG4gKiAgIEVtcHR5U3RyZWFtIGFuZCBjb250YWluIGFkZGl0aW9uYWwgc3RyZWFtIGluZm9ybWF0aW9uLiBJblxuICogICBUeXBlU2NyaXB0LCB5b3Ugc2hvdWxkIHVzZSBgJ2VtcHR5JyBpbiBkb2NzYCBhcyBhIHR5cGUgZ3VhcmQgZm9yIGl0LlxuICovXG5mdW5jdGlvbiBwYXJzZUFsbERvY3VtZW50cyhzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgbGluZUNvdW50ZXIsIHByZXR0eUVycm9ycyB9ID0gcGFyc2VPcHRpb25zKG9wdGlvbnMpO1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIobGluZUNvdW50ZXI/LmFkZE5ld0xpbmUpO1xuICAgIGNvbnN0IGNvbXBvc2VyID0gbmV3IENvbXBvc2VyKG9wdGlvbnMpO1xuICAgIGNvbnN0IGRvY3MgPSBBcnJheS5mcm9tKGNvbXBvc2VyLmNvbXBvc2UocGFyc2VyLnBhcnNlKHNvdXJjZSkpKTtcbiAgICBpZiAocHJldHR5RXJyb3JzICYmIGxpbmVDb3VudGVyKVxuICAgICAgICBmb3IgKGNvbnN0IGRvYyBvZiBkb2NzKSB7XG4gICAgICAgICAgICBkb2MuZXJyb3JzLmZvckVhY2gocHJldHRpZnlFcnJvcihzb3VyY2UsIGxpbmVDb3VudGVyKSk7XG4gICAgICAgICAgICBkb2Mud2FybmluZ3MuZm9yRWFjaChwcmV0dGlmeUVycm9yKHNvdXJjZSwgbGluZUNvdW50ZXIpKTtcbiAgICAgICAgfVxuICAgIGlmIChkb2NzLmxlbmd0aCA+IDApXG4gICAgICAgIHJldHVybiBkb2NzO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKFtdLCB7IGVtcHR5OiB0cnVlIH0sIGNvbXBvc2VyLnN0cmVhbUluZm8oKSk7XG59XG4vKiogUGFyc2UgYW4gaW5wdXQgc3RyaW5nIGludG8gYSBzaW5nbGUgWUFNTC5Eb2N1bWVudCAqL1xuZnVuY3Rpb24gcGFyc2VEb2N1bWVudChzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgbGluZUNvdW50ZXIsIHByZXR0eUVycm9ycyB9ID0gcGFyc2VPcHRpb25zKG9wdGlvbnMpO1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIobGluZUNvdW50ZXI/LmFkZE5ld0xpbmUpO1xuICAgIGNvbnN0IGNvbXBvc2VyID0gbmV3IENvbXBvc2VyKG9wdGlvbnMpO1xuICAgIC8vIGBkb2NgIGlzIGFsd2F5cyBzZXQgYnkgY29tcG9zZS5lbmQodHJ1ZSkgYXQgdGhlIHZlcnkgbGF0ZXN0XG4gICAgbGV0IGRvYyA9IG51bGw7XG4gICAgZm9yIChjb25zdCBfZG9jIG9mIGNvbXBvc2VyLmNvbXBvc2UocGFyc2VyLnBhcnNlKHNvdXJjZSksIHRydWUsIHNvdXJjZS5sZW5ndGgpKSB7XG4gICAgICAgIGlmICghZG9jKVxuICAgICAgICAgICAgZG9jID0gX2RvYztcbiAgICAgICAgZWxzZSBpZiAoZG9jLm9wdGlvbnMubG9nTGV2ZWwgIT09ICdzaWxlbnQnKSB7XG4gICAgICAgICAgICBkb2MuZXJyb3JzLnB1c2gobmV3IFlBTUxQYXJzZUVycm9yKF9kb2MucmFuZ2Uuc2xpY2UoMCwgMiksICdNVUxUSVBMRV9ET0NTJywgJ1NvdXJjZSBjb250YWlucyBtdWx0aXBsZSBkb2N1bWVudHM7IHBsZWFzZSB1c2UgWUFNTC5wYXJzZUFsbERvY3VtZW50cygpJykpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByZXR0eUVycm9ycyAmJiBsaW5lQ291bnRlcikge1xuICAgICAgICBkb2MuZXJyb3JzLmZvckVhY2gocHJldHRpZnlFcnJvcihzb3VyY2UsIGxpbmVDb3VudGVyKSk7XG4gICAgICAgIGRvYy53YXJuaW5ncy5mb3JFYWNoKHByZXR0aWZ5RXJyb3Ioc291cmNlLCBsaW5lQ291bnRlcikpO1xuICAgIH1cbiAgICByZXR1cm4gZG9jO1xufVxuZnVuY3Rpb24gcGFyc2Uoc3JjLCByZXZpdmVyLCBvcHRpb25zKSB7XG4gICAgbGV0IF9yZXZpdmVyID0gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgcmV2aXZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBfcmV2aXZlciA9IHJldml2ZXI7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCAmJiByZXZpdmVyICYmIHR5cGVvZiByZXZpdmVyID09PSAnb2JqZWN0Jykge1xuICAgICAgICBvcHRpb25zID0gcmV2aXZlcjtcbiAgICB9XG4gICAgY29uc3QgZG9jID0gcGFyc2VEb2N1bWVudChzcmMsIG9wdGlvbnMpO1xuICAgIGlmICghZG9jKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBkb2Mud2FybmluZ3MuZm9yRWFjaCh3YXJuaW5nID0+IHdhcm4oZG9jLm9wdGlvbnMubG9nTGV2ZWwsIHdhcm5pbmcpKTtcbiAgICBpZiAoZG9jLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChkb2Mub3B0aW9ucy5sb2dMZXZlbCAhPT0gJ3NpbGVudCcpXG4gICAgICAgICAgICB0aHJvdyBkb2MuZXJyb3JzWzBdO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBkb2MuZXJyb3JzID0gW107XG4gICAgfVxuICAgIHJldHVybiBkb2MudG9KUyhPYmplY3QuYXNzaWduKHsgcmV2aXZlcjogX3Jldml2ZXIgfSwgb3B0aW9ucykpO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5KHZhbHVlLCByZXBsYWNlciwgb3B0aW9ucykge1xuICAgIGxldCBfcmVwbGFjZXIgPSBudWxsO1xuICAgIGlmICh0eXBlb2YgcmVwbGFjZXIgPT09ICdmdW5jdGlvbicgfHwgQXJyYXkuaXNBcnJheShyZXBsYWNlcikpIHtcbiAgICAgICAgX3JlcGxhY2VyID0gcmVwbGFjZXI7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCAmJiByZXBsYWNlcikge1xuICAgICAgICBvcHRpb25zID0gcmVwbGFjZXI7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zLmxlbmd0aDtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbnN0IGluZGVudCA9IE1hdGgucm91bmQob3B0aW9ucyk7XG4gICAgICAgIG9wdGlvbnMgPSBpbmRlbnQgPCAxID8gdW5kZWZpbmVkIDogaW5kZW50ID4gOCA/IHsgaW5kZW50OiA4IH0gOiB7IGluZGVudCB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB7IGtlZXBVbmRlZmluZWQgfSA9IG9wdGlvbnMgPz8gcmVwbGFjZXIgPz8ge307XG4gICAgICAgIGlmICgha2VlcFVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRG9jdW1lbnQodmFsdWUsIF9yZXBsYWNlciwgb3B0aW9ucykudG9TdHJpbmcob3B0aW9ucyk7XG59XG5cbmV4cG9ydCB7IHBhcnNlLCBwYXJzZUFsbERvY3VtZW50cywgcGFyc2VEb2N1bWVudCwgc3RyaW5naWZ5IH07XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBRUEsWUFBTyxVQUFVO0FBRWpCLGtCQUFjLEtBQUs7QUFDakIsVUFBSSxLQUFLO0FBQ1AsY0FBTTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNOVjtBQUFBO0FBT0EsWUFBTyxVQUFVLGtCQUFtQixLQUFLO0FBQ3ZDLGFBQU8sT0FBTyxRQUFRLElBQUksZUFBZSxRQUN2QyxPQUFPLElBQUksWUFBWSxhQUFhLGNBQWMsSUFBSSxZQUFZLFNBQVM7QUFBQTtBQUFBO0FBQUE7OztBQ1QvRTtBQUFBO0FBQUE7QUFFQSxRQUFJLFNBQVMsT0FBTyxVQUFVO0FBQzlCLFFBQUksUUFBUSxPQUFPLFVBQVU7QUFDN0IsUUFBSSxpQkFBaUIsT0FBTztBQUM1QixRQUFJLE9BQU8sT0FBTztBQUVsQixRQUFJLFVBQVUsa0JBQWlCLEtBQUs7QUFDbkMsVUFBSSxPQUFPLE1BQU0sWUFBWSxZQUFZO0FBQ3hDLGVBQU8sTUFBTSxRQUFRO0FBQUE7QUFHdEIsYUFBTyxNQUFNLEtBQUssU0FBUztBQUFBO0FBRzVCLFFBQUksZ0JBQWdCLHdCQUF1QixLQUFLO0FBQy9DLFVB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QUEsZUFDVDtBQUNMLGNBQUksd0JBQU8sR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLYiwwQkFBMEIsS0FBVTtBQUFBO0FBQ3pDLFlBQU0sVUFBVSxJQUFJLFVBQVU7QUFDOUIsVUFBSSxTQUFTO0FBQ1osY0FBTSxXQUFtQixRQUFRO0FBRWpDLGNBQU0sV0FBbUIsUUFBUSxNQUFNLFFBQVE7QUFDL0MsY0FBTSxXQUFXLHNCQUFLLFVBQVU7QUFDaEMsZ0JBQVEsSUFBSSxZQUFZO0FBQ3hCLGNBQU0sV0FBVyxBQUFHLGlCQUFhLFVBQVU7QUFDM0MsZUFBTztBQUFBLFVBQ047QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBO0FBQUEsYUFFSztBQUNOLFlBQUksd0JBQU87QUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUksZUFBZTtBQUFBO0FBQ3BCLFdBQUssV0FBVyxPQUFPLE9BQ3RCLElBQ0Esa0JBQ0EsTUFBTSxLQUFLO0FBQUE7QUFBQTtBQUFBLEVBSVAsZUFBZTtBQUFBO0FBQ3BCLFlBQU0sS0FBSyxTQUFTLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFvQjNCLHFDQUErQixrQ0FBaUI7QUFBQSxFQUcvQyxZQUFZLEtBQVUsUUFBa0I7QUFDdkMsVUFBTSxLQUFLO0FBQ1gsU0FBSyxTQUFTO0FBQUE7QUFBQSxFQUdmLFVBQWdCO0FBQ2YsVUFBTSxFQUFFLGdCQUFnQjtBQUV4QixnQkFBWTtBQUVaLGdCQUFZLFNBQVMsTUFBTTtBQUFBLE1BQzFCLE1BQU07QUFBQTtBQUdQLFFBQUkseUJBQVEsYUFDVixRQUFRLG9CQUNSLFFBQVEsaUJBQ1IsUUFBUSxDQUFDLFNBQ1QsS0FDRSxlQUFlLCtCQUNmLFNBQVMsS0FBSyxPQUFPLFNBQVMsV0FDOUIsU0FBUyxDQUFPLFVBQVU7QUFDMUIsY0FBUSxJQUFJLGFBQWE7QUFDekIsV0FBSyxPQUFPLFNBQVMsWUFBWTtBQUNqQyxZQUFNLEtBQUssT0FBTztBQUFBO0FBSXRCLFFBQUkseUJBQVEsYUFDVixRQUFRLGVBQ1IsUUFBUSxpQkFDUixRQUFRLENBQUMsU0FDVCxLQUNFLGVBQWUsMEJBQ2YsU0FBUyxLQUFLLE9BQU8sU0FBUyxZQUM5QixTQUFTLENBQU8sVUFBVTtBQUMxQixjQUFRLElBQUksYUFBYTtBQUN6QixXQUFLLE9BQU8sU0FBUyxhQUFhO0FBQ2xDLFlBQU0sS0FBSyxPQUFPO0FBQUE7QUFBQTtBQUFBOyIsCiAgIm5hbWVzIjogW10KfQo=