From 6f78fa1f2044c53a301d95379df916817c0a3ff3 Mon Sep 17 00:00:00 2001 From: chris Date: Tue, 24 May 2022 14:29:22 +0800 Subject: [PATCH] Update show main.js --- .gitignore | 2 +- main.js | 14931 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 14932 insertions(+), 1 deletion(-) create mode 100644 main.js diff --git a/.gitignore b/.gitignore index e09a007..b5b913d 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,7 @@ node_modules # Don't include the compiled main.js file in the repo. # They should be uploaded to GitHub releases instead. -main.js +# main.js # Exclude sourcemaps *.map diff --git a/main.js b/main.js new file mode 100644 index 0000000..bdb7c6e --- /dev/null +++ b/main.js @@ -0,0 +1,14931 @@ +/* +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/Jykge1xuICAgICAgICB3cml0ZVNjYWxhcihzdGF0ZSwgc3RhdGUuZHVtcCwgbGV2ZWwsIGlza2V5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXRlLnNraXBJbnZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbigndW5hY2NlcHRhYmxlIGtpbmQgb2YgYW4gb2JqZWN0IHRvIGR1bXAgJyArIHR5cGUpO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS50YWcgIT09IG51bGwgJiYgc3RhdGUudGFnICE9PSAnPycpIHtcbiAgICAgIHN0YXRlLmR1bXAgPSAnITwnICsgc3RhdGUudGFnICsgJz4gJyArIHN0YXRlLmR1bXA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldER1cGxpY2F0ZVJlZmVyZW5jZXMob2JqZWN0LCBzdGF0ZSkge1xuICB2YXIgb2JqZWN0cyA9IFtdLFxuICAgICAgZHVwbGljYXRlc0luZGV4ZXMgPSBbXSxcbiAgICAgIGluZGV4LFxuICAgICAgbGVuZ3RoO1xuXG4gIGluc3BlY3ROb2RlKG9iamVjdCwgb2JqZWN0cywgZHVwbGljYXRlc0luZGV4ZXMpO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBkdXBsaWNhdGVzSW5kZXhlcy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgc3RhdGUuZHVwbGljYXRlcy5wdXNoKG9iamVjdHNbZHVwbGljYXRlc0luZGV4ZXNbaW5kZXhdXSk7XG4gIH1cbiAgc3RhdGUudXNlZER1cGxpY2F0ZXMgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24gaW5zcGVjdE5vZGUob2JqZWN0LCBvYmplY3RzLCBkdXBsaWNhdGVzSW5kZXhlcykge1xuICB2YXIgb2JqZWN0S2V5TGlzdCxcbiAgICAgIGluZGV4LFxuICAgICAgbGVuZ3RoO1xuXG4gIGlmIChvYmplY3QgIT09IG51bGwgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcpIHtcbiAgICBpbmRleCA9IG9iamVjdHMuaW5kZXhPZihvYmplY3QpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIGlmIChkdXBsaWNhdGVzSW5kZXhlcy5pbmRleE9mKGluZGV4KSA9PT0gLTEpIHtcbiAgICAgICAgZHVwbGljYXRlc0luZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG9iamVjdHMucHVzaChvYmplY3QpO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgIGluc3BlY3ROb2RlKG9iamVjdFtpbmRleF0sIG9iamVjdHMsIGR1cGxpY2F0ZXNJbmRleGVzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqZWN0S2V5TGlzdCA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgICAgICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdEtleUxpc3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgIGluc3BlY3ROb2RlKG9iamVjdFtvYmplY3RLZXlMaXN0W2luZGV4XV0sIG9iamVjdHMsIGR1cGxpY2F0ZXNJbmRleGVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkdW1wKGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIHZhciBzdGF0ZSA9IG5ldyBTdGF0ZShvcHRpb25zKTtcblxuICBpZiAoIXN0YXRlLm5vUmVmcykgZ2V0RHVwbGljYXRlUmVmZXJlbmNlcyhpbnB1dCwgc3RhdGUpO1xuXG4gIGlmICh3cml0ZU5vZGUoc3RhdGUsIDAsIGlucHV0LCB0cnVlLCB0cnVlKSkgcmV0dXJuIHN0YXRlLmR1bXAgKyAnXFxuJztcblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIHNhZmVEdW1wKGlucHV0LCBvcHRpb25zKSB7XG4gIHJldHVybiBkdW1wKGlucHV0LCBjb21tb24uZXh0ZW5kKHsgc2NoZW1hOiBERUZBVUxUX1NBRkVfU0NIRU1BIH0sIG9wdGlvbnMpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMuZHVtcCAgICAgPSBkdW1wO1xubW9kdWxlLmV4cG9ydHMuc2FmZUR1bXAgPSBzYWZlRHVtcDtcbiIsICIndXNlIHN0cmljdCc7XG5cblxudmFyIGxvYWRlciA9IHJlcXVpcmUoJy4vanMteWFtbC9sb2FkZXInKTtcbnZhciBkdW1wZXIgPSByZXF1aXJlKCcuL2pzLXlhbWwvZHVtcGVyJyk7XG5cblxuZnVuY3Rpb24gZGVwcmVjYXRlZChuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGdW5jdGlvbiAnICsgbmFtZSArICcgaXMgZGVwcmVjYXRlZCBhbmQgY2Fubm90IGJlIHVzZWQuJyk7XG4gIH07XG59XG5cblxubW9kdWxlLmV4cG9ydHMuVHlwZSAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC90eXBlJyk7XG5tb2R1bGUuZXhwb3J0cy5TY2hlbWEgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYScpO1xubW9kdWxlLmV4cG9ydHMuRkFJTFNBRkVfU0NIRU1BICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZmFpbHNhZmUnKTtcbm1vZHVsZS5leHBvcnRzLkpTT05fU0NIRU1BICAgICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2pzb24nKTtcbm1vZHVsZS5leHBvcnRzLkNPUkVfU0NIRU1BICAgICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2NvcmUnKTtcbm1vZHVsZS5leHBvcnRzLkRFRkFVTFRfU0FGRV9TQ0hFTUEgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfc2FmZScpO1xubW9kdWxlLmV4cG9ydHMuREVGQVVMVF9GVUxMX1NDSEVNQSA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZGVmYXVsdF9mdWxsJyk7XG5tb2R1bGUuZXhwb3J0cy5sb2FkICAgICAgICAgICAgICAgID0gbG9hZGVyLmxvYWQ7XG5tb2R1bGUuZXhwb3J0cy5sb2FkQWxsICAgICAgICAgICAgID0gbG9hZGVyLmxvYWRBbGw7XG5tb2R1bGUuZXhwb3J0cy5zYWZlTG9hZCAgICAgICAgICAgID0gbG9hZGVyLnNhZmVMb2FkO1xubW9kdWxlLmV4cG9ydHMuc2FmZUxvYWRBbGwgICAgICAgICA9IGxvYWRlci5zYWZlTG9hZEFsbDtcbm1vZHVsZS5leHBvcnRzLmR1bXAgICAgICAgICAgICAgICAgPSBkdW1wZXIuZHVtcDtcbm1vZHVsZS5leHBvcnRzLnNhZmVEdW1wICAgICAgICAgICAgPSBkdW1wZXIuc2FmZUR1bXA7XG5tb2R1bGUuZXhwb3J0cy5ZQU1MRXhjZXB0aW9uICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL2V4Y2VwdGlvbicpO1xuXG4vLyBEZXByZWNhdGVkIHNjaGVtYSBuYW1lcyBmcm9tIEpTLVlBTUwgMi4wLnhcbm1vZHVsZS5leHBvcnRzLk1JTklNQUxfU0NIRU1BID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9mYWlsc2FmZScpO1xubW9kdWxlLmV4cG9ydHMuU0FGRV9TQ0hFTUEgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfc2FmZScpO1xubW9kdWxlLmV4cG9ydHMuREVGQVVMVF9TQ0hFTUEgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfZnVsbCcpO1xuXG4vLyBEZXByZWNhdGVkIGZ1bmN0aW9ucyBmcm9tIEpTLVlBTUwgMS54Lnhcbm1vZHVsZS5leHBvcnRzLnNjYW4gICAgICAgICAgID0gZGVwcmVjYXRlZCgnc2NhbicpO1xubW9kdWxlLmV4cG9ydHMucGFyc2UgICAgICAgICAgPSBkZXByZWNhdGVkKCdwYXJzZScpO1xubW9kdWxlLmV4cG9ydHMuY29tcG9zZSAgICAgICAgPSBkZXByZWNhdGVkKCdjb21wb3NlJyk7XG5tb2R1bGUuZXhwb3J0cy5hZGRDb25zdHJ1Y3RvciA9IGRlcHJlY2F0ZWQoJ2FkZENvbnN0cnVjdG9yJyk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB5YW1sID0gcmVxdWlyZSgnLi9saWIvanMteWFtbC5qcycpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0geWFtbDtcbiIsICJpbXBvcnQgeyB0aW1pbmdTYWZlRXF1YWwgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQge1xuXHRBcHAsXG5cdEVkaXRhYmxlRmlsZVZpZXcsXG5cdHJlcXVlc3RVcmwsXG5cdEVkaXRvcixcblx0TWFya2Rvd25WaWV3LFxuXHRNb2RhbCxcblx0Tm90aWNlLFxuXHRQbHVnaW4sXG5cdFBsdWdpblNldHRpbmdUYWIsXG5cdFNldHRpbmcsXG59IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7YWRkSWNvbnN9ICBmcm9tICdpY29uJztcbmltcG9ydCB7IFVwbG9hZDJOb3Rpb24gfSBmcm9tIFwiVXBsb2FkMk5vdGlvblwiO1xuXG4vLyBSZW1lbWJlciB0byByZW5hbWUgdGhlc2UgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyFcblxuaW50ZXJmYWNlIE15UGx1Z2luU2V0dGluZ3Mge1xuXHRub3Rpb25BUEk6IHN0cmluZztcblx0ZGF0YWJhc2VJRDogc3RyaW5nO1xuXHRwcm94eTogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUX1NFVFRJTkdTOiBNeVBsdWdpblNldHRpbmdzID0ge1xuXHRub3Rpb25BUEk6IFwiXCIsXG5cdGRhdGFiYXNlSUQ6IFwiXCIsXG5cdHByb3h5OiBcIlwiLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTXlQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuXHRzZXR0aW5nczogTXlQbHVnaW5TZXR0aW5ncztcblx0XG5cdGFzeW5jIG9ubG9hZCgpIHtcblx0XHRhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xuXHRcdGFkZEljb25zKCk7XG5cdFx0Ly8gVGhpcyBjcmVhdGVzIGFuIGljb24gaW4gdGhlIGxlZnQgcmliYm9uLlxuXHRcdGNvbnN0IHJpYmJvbkljb25FbCA9IHRoaXMuYWRkUmliYm9uSWNvbihcblx0XHRcdFwibm90aW9uLWxvZ29cIixcblx0XHRcdFwiU2hhcmUgdG8gbm90aW9uXCIsXG5cdFx0XHRhc3luYyAoZXZ0OiBNb3VzZUV2ZW50KSA9PiB7XG5cdFx0XHRcdC8vIENhbGxlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgaWNvbi5cblx0XHRcdFx0dGhpcy51cGxvYWQoKTtcblx0XHRcdH1cblx0XHQpO1xuXHRcdC8vIFBlcmZvcm0gYWRkaXRpb25hbCB0aGluZ3Mgd2l0aCB0aGUgcmliYm9uXG5cdFx0cmliYm9uSWNvbkVsLmFkZENsYXNzKFwibXktcGx1Z2luLXJpYmJvbi1jbGFzc1wiKTtcblxuXHRcdC8vIFRoaXMgYWRkcyBhIHN0YXR1cyBiYXIgaXRlbSB0byB0aGUgYm90dG9tIG9mIHRoZSBhcHAuIERvZXMgbm90IHdvcmsgb24gbW9iaWxlIGFwcHMuXG5cdFx0Y29uc3Qgc3RhdHVzQmFySXRlbUVsID0gdGhpcy5hZGRTdGF0dXNCYXJJdGVtKCk7XG5cdFx0Ly8gc3RhdHVzQmFySXRlbUVsLnNldFRleHQoXCJzaGFyZSB0byBub3Rpb25cIik7XG5cblx0XHR0aGlzLmFkZENvbW1hbmQoe1xuXHRcdFx0aWQ6IFwic2hhcmUtdG8tbm90aW9uXCIsXG5cdFx0XHRuYW1lOiBcInNoYXJlIHRvIG5vdGlvblwiLFxuXHRcdFx0ZWRpdG9yQ2FsbGJhY2s6IGFzeW5jIChlZGl0b3I6IEVkaXRvciwgdmlldzogTWFya2Rvd25WaWV3KSA9PiB7XG5cdFx0XHRcdHRoaXMudXBsb2FkKClcblx0XHRcdH0sXG5cdFx0fSk7XG5cblxuXHRcdC8vIFRoaXMgYWRkcyBhIHNldHRpbmdzIHRhYiBzbyB0aGUgdXNlciBjYW4gY29uZmlndXJlIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgcGx1Z2luXG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBTYW1wbGVTZXR0aW5nVGFiKHRoaXMuYXBwLCB0aGlzKSk7XG5cblx0fVxuXG5cdG9udW5sb2FkKCkge31cblxuXHRhc3luYyB1cGxvYWQoKXtcblx0XHRjb25zdCB7IG5vdGlvbkFQSSwgZGF0YWJhc2VJRCB9ID0gdGhpcy5zZXR0aW5ncztcblx0XHRcdFx0aWYgKG5vdGlvbkFQSSA9PT0gXCJcIiB8fCBkYXRhYmFzZUlEID09PSBcIlwiKSB7XG5cdFx0XHRcdFx0bmV3IE5vdGljZShcblx0XHRcdFx0XHRcdFwiUGxlYXNlIHNldCB1cCB0aGUgbm90aW9uIEFQSSBhbmQgZGF0YWJhc2UgSUQgaW4gdGhlIHNldHRpbmdzIHRhYi5cIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IHsgbm93RmlsZSwgZmlsZURhdGEsZnVsbFBhdGggfSA9XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5nZXROb3dGaWxlTWFya2R3b25Db250ZW50KHRoaXMuYXBwKTtcblx0XHRcdFx0Y29uc3QgeyBiYXNlbmFtZSB9ID0gbm93RmlsZTtcblx0XHRcdFx0aWYgKGZpbGVEYXRhKSB7XG5cdFx0XHRcdFx0Y29uc3QgdXBsb2FkID0gbmV3IFVwbG9hZDJOb3Rpb24odGhpcyk7XG5cdFx0XHRcdFx0Y29uc3QgcmVzID0gYXdhaXQgdXBsb2FkLnN5bmNNYXJrZG93blRvTm90aW9uKGJhc2VuYW1lLGZpbGVEYXRhLCBmdWxsUGF0aClcblx0XHRcdFx0XHRjb25zb2xlLmxvZyhyZXMpXG5cdFx0XHRcdFx0aWYocmVzLnN0YXR1cyA9PT0gMjAwKXtcblx0XHRcdFx0XHRcdG5ldyBOb3RpY2UoYCR7YmFzZW5hbWV9IFx1NTQwQ1x1NkI2NVx1NjIxMFx1NTI5RmApXG5cdFx0XHRcdFx0fWVsc2Uge1xuXHRcdFx0XHRcdFx0bmV3IE5vdGljZShgJHtiYXNlbmFtZX0gXHU1NDBDXHU2QjY1XHU1OTMxXHU4RDI1YClcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0fVxuXG5cdGFzeW5jIGdldE5vd0ZpbGVNYXJrZHdvbkNvbnRlbnQoYXBwOiBBcHApIHtcblx0XHRjb25zdCBub3dGaWxlID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKCk7XG5cdFx0aWYgKG5vd0ZpbGUpIHtcblx0XHRcdGNvbnN0IGZpbGVQYXRoOiBzdHJpbmcgPSBub3dGaWxlLnBhdGg7XG5cdFx0XHRjb25zdCBiYXNlUGF0aDogc3RyaW5nID0gbm93RmlsZS52YXVsdC5hZGFwdGVyLmJhc2VQYXRoO1xuXHRcdFx0Y29uc3QgZnVsbFBhdGggPSBqb2luKGJhc2VQYXRoLCBmaWxlUGF0aCk7XG5cdFx0XHRjb25zb2xlLmxvZyhcImZ1bGxwYXRoXCIsIGZ1bGxQYXRoKTtcblx0XHRcdGNvbnN0IGZpbGVEYXRhID0gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCBcInV0ZjhcIik7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRmaWxlRGF0YSxcblx0XHRcdFx0bm93RmlsZSxcblx0XHRcdFx0ZnVsbFBhdGgsXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRuZXcgTm90aWNlKFwiXHU4QkY3XHU2MjUzXHU1RjAwXHU5NzAwXHU4OTgxXHU1NDBDXHU2QjY1XHU3Njg0XHU2NTg3XHU0RUY2XCIpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbihcblx0XHRcdHt9LFxuXHRcdFx0REVGQVVMVF9TRVRUSU5HUyxcblx0XHRcdGF3YWl0IHRoaXMubG9hZERhdGEoKVxuXHRcdCk7XG5cdH1cblxuXHRhc3luYyBzYXZlU2V0dGluZ3MoKSB7XG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcblx0fVxufVxuXG5jbGFzcyBTYW1wbGVNb2RhbCBleHRlbmRzIE1vZGFsIHtcblx0Y29uc3RydWN0b3IoYXBwOiBBcHApIHtcblx0XHRzdXBlcihhcHApO1xuXHR9XG5cblx0b25PcGVuKCkge1xuXHRcdGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xuXHRcdGNvbnRlbnRFbC5zZXRUZXh0KFwiV29haCFcIik7XG5cdH1cblxuXHRvbkNsb3NlKCkge1xuXHRcdGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xuXHRcdGNvbnRlbnRFbC5lbXB0eSgpO1xuXHR9XG59XG5cbmNsYXNzIFNhbXBsZVNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcblx0cGx1Z2luOiBNeVBsdWdpbjtcblxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBNeVBsdWdpbikge1xuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblx0fVxuXG5cdGRpc3BsYXkoKTogdm9pZCB7XG5cdFx0Y29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpcztcblxuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcImgyXCIsIHtcblx0XHRcdHRleHQ6IFwiU2V0dGluZ3MgZm9yIG9ic2lkaWFuIHRvIG5vdGlvbiBwbHVnaW4uXCIsXG5cdFx0fSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiTm90aW9uIEFQSSBUb2tlblwiKVxuXHRcdFx0LnNldERlc2MoXCJJdCdzIGEgc2VjcmV0XCIpXG5cdFx0XHQuYWRkVGV4dCgodGV4dCkgPT5cblx0XHRcdFx0dGV4dFxuXHRcdFx0XHRcdC5zZXRQbGFjZWhvbGRlcihcIkVudGVyIHlvdXIgTm90aW9uIEFQSSBUb2tlblwiKVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5ub3Rpb25BUEkpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc29sZS5sb2coXCJTZWNyZXQ6IFwiICsgdmFsdWUpO1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Mubm90aW9uQVBJID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoXCJEYXRhYmFzZSBJRFwiKVxuXHRcdFx0LnNldERlc2MoXCJJdCdzIGEgc2VjcmV0XCIpXG5cdFx0XHQuYWRkVGV4dCgodGV4dCkgPT5cblx0XHRcdFx0dGV4dFxuXHRcdFx0XHRcdC5zZXRQbGFjZWhvbGRlcihcIkVudGVyIHlvdXIgRGF0YWJhc2UgSURcIilcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGF0YWJhc2VJRClcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhcIlNlY3JldDogXCIgKyB2YWx1ZSk7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5kYXRhYmFzZUlEID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHR9XG59XG4iLCAiaW1wb3J0IHsgYWRkSWNvbiB9IGZyb20gJ29ic2lkaWFuJztcblxuY29uc3QgaWNvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICdub3Rpb24tbG9nbyc6IGBcbiAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgd2lkdGg9XCIxMDBweFwiIGhlaWdodD1cIjEwMHB4XCIgdmlld0JveD1cIjAgMCAxMDAgMTAwXCIgdmVyc2lvbj1cIjEuMVwiPlxuPGcgaWQ9XCJzdXJmYWNlMVwiPlxuPHBhdGggc3R5bGU9XCIgc3Ryb2tlOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7ZmlsbDpjdXJyZW50Q29sb3I7ZmlsbC1vcGFjaXR5OjE7XCIgZD1cIk0gMTguNzM4MjgxIDE3Ljc5Njg3NSBDIDIxLjgzMjAzMSAyMC4zMDg1OTQgMjIuOTk2MDk0IDIwLjExNzE4OCAyOC44MDQ2ODggMTkuNzMwNDY5IEwgODMuNTgyMDMxIDE2LjQ0MTQwNiBDIDg0Ljc0NjA5NCAxNi40NDE0MDYgODMuNzgxMjUgMTUuMjgxMjUgODMuMzkwNjI1IDE1LjA4OTg0NCBMIDc0LjI5Mjk2OSA4LjUxMTcxOSBDIDcyLjU1MDc4MSA3LjE2MDE1NiA3MC4yMzA0NjkgNS42MDkzNzUgNjUuNzc3MzQ0IDUuOTk2MDk0IEwgMTIuNzM0Mzc1IDkuODY3MTg4IEMgMTAuODAwNzgxIDEwLjA1ODU5NCAxMC40MTQwNjIgMTEuMDIzNDM4IDExLjE4MzU5NCAxMS44MDA3ODEgWiBNIDIyLjAyNzM0NCAzMC41NjI1IEwgMjIuMDI3MzQ0IDg4LjE5OTIxOSBDIDIyLjAyNzM0NCA5MS4yOTY4NzUgMjMuNTc0MjE5IDkyLjQ1NzAzMSAyNy4wNTg1OTQgOTIuMjY1NjI1IEwgODcuMjYxNzE5IDg4Ljc4MTI1IEMgOTAuNzQ2MDk0IDg4LjU4OTg0NCA5MS4xMzY3MTkgODYuNDU3MDMxIDkxLjEzNjcxOSA4My45NDE0MDYgTCA5MS4xMzY3MTkgMjYuNjkxNDA2IEMgOTEuMTM2NzE5IDI0LjE3OTY4OCA5MC4xNjc5NjkgMjIuODI0MjE5IDg4LjAzNTE1NiAyMy4wMTk1MzEgTCAyNS4xMjUgMjYuNjkxNDA2IEMgMjIuODAwNzgxIDI2Ljg4NjcxOSAyMi4wMjczNDQgMjguMDQ2ODc1IDIyLjAyNzM0NCAzMC41NjI1IFogTSA4MS40NjA5MzggMzMuNjUyMzQ0IEMgODEuODQzNzUgMzUuMzk4NDM4IDgxLjQ2MDkzOCAzNy4xMzY3MTkgNzkuNzE0ODQ0IDM3LjMzMjAzMSBMIDc2LjgxMjUgMzcuOTEwMTU2IEwgNzYuODEyNSA4MC40NjA5MzggQyA3NC4yOTI5NjkgODEuODE2NDA2IDcxLjk3MjY1NiA4Mi41ODk4NDQgNzAuMDM1MTU2IDgyLjU4OTg0NCBDIDY2LjkzNzUgODIuNTg5ODQ0IDY2LjE2NDA2MiA4MS42MjEwOTQgNjMuODM5ODQ0IDc4LjcyMjY1NiBMIDQ0Ljg2NzE4OCA0OC45Mzc1IEwgNDQuODY3MTg4IDc3Ljc1MzkwNiBMIDUwLjg3MTA5NCA3OS4xMDkzNzUgQyA1MC44NzEwOTQgNzkuMTA5Mzc1IDUwLjg3MTA5NCA4Mi41ODk4NDQgNDYuMDI3MzQ0IDgyLjU4OTg0NCBMIDMyLjY3NTc4MSA4My4zNjMyODEgQyAzMi4yODUxNTYgODIuNTg5ODQ0IDMyLjY3NTc4MSA4MC42NTYyNSAzNC4wMjczNDQgODAuMjY5NTMxIEwgMzcuNTExNzE5IDc5LjMwNDY4OCBMIDM3LjUxMTcxOSA0MS4xOTkyMTkgTCAzMi42NzU3ODEgNDAuODEyNSBDIDMyLjI4NTE1NiAzOS4wNzAzMTIgMzMuMjUzOTA2IDM2LjU1ODU5NCAzNS45NjQ4NDQgMzYuMzYzMjgxIEwgNTAuMjkyOTY5IDM1LjM5ODQzOCBMIDcwLjAzNTE1NiA2NS41NzAzMTIgTCA3MC4wMzUxNTYgMzguODc4OTA2IEwgNjUuMDAzOTA2IDM4LjMwMDc4MSBDIDY0LjYxNzE4OCAzNi4xNzE4NzUgNjYuMTY0MDYyIDM0LjYyNSA2OC4wOTc2NTYgMzQuNDMzNTk0IFogTSA4LjI4MTI1IDQuNjQ0NTMxIEwgNjMuNDUzMTI1IDAuNTgyMDMxIEMgNzAuMjMwNDY5IDAgNzEuOTcyNjU2IDAuMzkwNjI1IDc2LjIzMDQ2OSAzLjQ4NDM3NSBMIDkzLjg0Mzc1IDE1Ljg1OTM3NSBDIDk2Ljc1IDE3Ljk4ODI4MSA5Ny43MTg3NSAxOC41NzAzMTIgOTcuNzE4NzUgMjAuODkwNjI1IEwgOTcuNzE4NzUgODguNzgxMjUgQyA5Ny43MTg3NSA5My4wMzUxNTYgOTYuMTY3OTY5IDk1LjU1MDc4MSA5MC43NSA5NS45Mzc1IEwgMjYuNjc1NzgxIDk5LjgwNDY4OCBDIDIyLjYwOTM3NSAxMDAgMjAuNjcxODc1IDk5LjQyMTg3NSAxOC41NDI5NjkgOTYuNzEwOTM4IEwgNS41NzQyMTkgNzkuODgyODEyIEMgMy4yNSA3Ni43ODUxNTYgMi4yODEyNSA3NC40Njg3NSAyLjI4MTI1IDcxLjc1NzgxMiBMIDIuMjgxMjUgMTEuNDEwMTU2IEMgMi4yODEyNSA3LjkzMzU5NCAzLjgzMjAzMSA1LjAzMTI1IDguMjgxMjUgNC42NDQ1MzEgWiBNIDguMjgxMjUgNC42NDQ1MzEgXCIvPlxuPC9nPlxuPC9zdmc+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/IHsgaW5kZW50OiA4IH0gOiB7IGluZGVudCB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB7IGtlZXBVbmRlZmluZWQgfSA9IG9wdGlvbnMgPz8gcmVwbGFjZXIgPz8ge307XG4gICAgICAgIGlmICgha2VlcFVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRG9jdW1lbnQodmFsdWUsIF9yZXBsYWNlciwgb3B0aW9ucykudG9TdHJpbmcob3B0aW9ucyk7XG59XG5cbmV4cG9ydCB7IHBhcnNlLCBwYXJzZUFsbERvY3VtZW50cywgcGFyc2VEb2N1bWVudCwgc3RyaW5naWZ5IH07XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBRUEsWUFBTyxVQUFVO0FBRWpCLGtCQUFjLEtBQUs7QUFDakIsVUFBSSxLQUFLO0FBQ1AsY0FBTTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNOVjtBQUFBO0FBT0EsWUFBTyxVQUFVLGtCQUFtQixLQUFLO0FBQ3ZDLGFBQU8sT0FBTyxRQUFRLElBQUksZUFBZSxRQUN2QyxPQUFPLElBQUksWUFBWSxhQUFhLGNBQWMsSUFBSSxZQUFZLFNBQVM7QUFBQTtBQUFBO0FBQUE7OztBQ1QvRTtBQUFBO0FBQUE7QUFFQSxRQUFJLFNBQVMsT0FBTyxVQUFVO0FBQzlCLFFBQUksUUFBUSxPQUFPLFVBQVU7QUFDN0IsUUFBSSxpQkFBaUIsT0FBTztBQUM1QixRQUFJLE9BQU8sT0FBTztBQUVsQixRQUFJLFVBQVUsa0JBQWlCLEtBQUs7QUFDbkMsVUFBSSxPQUFPLE1BQU0sWUFBWSxZQUFZO0FBQ3hDLGVBQU8sTUFBTSxRQUFRO0FBQUE7QUFHdEIsYUFBTyxNQUFNLEtBQUssU0FBUztBQUFBO0FBRzVCLFFBQUksZ0JBQWdCLHdCQUF1QixLQUFLO0FBQy9DLFVBQUksQ0FBQyxPQUFPLE1BQU0sS0FB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